1 votes

Comment lancer une tâche Windows qui exécute un script PowerShell en tant que compte de service local Windows ?

Sur un serveur 2008 R2, j'ai une tâche Windows qui exécute un script PowerShell. Elle fonctionne bien lorsqu'elle est configurée dans le planificateur de tâches pour s'exécuter en tant que compte Admin, mais j'aimerais la configurer pour qu'elle s'exécute plutôt en tant que compte Windows Local Service, car j'ai lu que c'est considéré comme une meilleure pratique de sécurité puisque Local Service a des privilèges très limités.

Lorsque vous utilisez le compte de service local, la tâche elle-même semble exécuter le script PowerShell avec succès selon le journal de l'historique dans le planificateur de tâches. Mais le script PowerShell ne produit pas de fichier texte comme il est conçu pour le faire, ce qui me laisse penser que peut-être le PowerShell.exe lui-même s'est exécuté, mais que le script a été bloqué pour une raison quelconque.

Dans le planificateur de tâches, j'ai réglé la tâche sur "Exécuter avec les privilèges les plus élevés" et j'ai pensé que c'était tout ce dont j'avais besoin pour qu'elle s'exécute correctement...

Comment puis-je faire en sorte que cette tâche PowerShell s'exécute avec succès ? Ou devrais-je simplement créer un compte de service de domaine Windows pour exécuter cette tâche à la place ?

0 votes

Où le script écrit-il la sortie ? Essayez-vous d'écrire sur le réseau ou autre ? Vous n'aurez probablement pas d'accès au réseau en tant que ce compte, mais beaucoup d'accès au système local.

0 votes

Le script écrit la sortie sur le lecteur C : local... Et pour clarifier, j'essaie d'utiliser "Local Service", pas "Local System". Le système local fonctionne certainement, mais je voudrais l'éviter car il a des privilèges d'administrateur.

0 votes

Est-ce que le compte sous lequel vous l'exécutez a les droits d'écriture sur le chemin où vous essayez d'écrire ? Le compte dispose-t-il de suffisamment de privilèges pour exécuter les commandlets que vous essayez d'exécuter ?

0voto

it3xl Points 101

Je préfère utiliser Enregistrement de l'emploi programmé car il me permet d'utiliser les blocs script de PowerShell au lieu des fichiers script. Mais vous êtes libre d'utiliser uniquement Enregistrer une tâche programmée ce sera encore plus facile.

Dans le script ci-dessous j'utilise Enregistrement de l'emploi programmé pour créer un travail PowerShell.
Ensuite, j'utilise Set-ScheduledTask pour changer le compte de démarrage en LocalSystem ou tout autre compte intégré.

Vous pouvez exécuter le script plusieurs fois. Mais exécutez-le sous un compte administratif.

Voir $accountId = "NT AUTHORITY\LOCAL SERVICE"; ci-dessous.
Faites également attention à -RunElevated . Je l'ai commenté pour vous et cela fonctionne.

$ErrorActionPreference = 'Stop'

Clear-Host

$taskName = "it3xl_dummy_PowerShell_job"
# Unregister-ScheduledJob it3xl_dummy_PowerShell_job -Confirm:$false

$task = Get-ScheduledJob -Name $taskName  -ErrorAction SilentlyContinue
if ($task -ne $null)
{
    Unregister-ScheduledJob $task  -Confirm:$false
    Write-Host "Old $taskName job has been unregistered"; Write-Host;
}

$trigger = New-JobTrigger -AtStartup;

$options = New-ScheduledJobOption -StartIfOnBattery  #-RunElevated;

Write-Host "Registering new $taskName job";
Register-ScheduledJob -Name $taskName  -Trigger $trigger  -ScheduledJobOption $options `
    -ScriptBlock {
    Write-Host In our PowerShell job we say - oppa!;
}

#$accountId = "NT AUTHORITY\SYSTEM";
$accountId = "NT AUTHORITY\LOCAL SERVICE";
$principal = New-ScheduledTaskPrincipal -UserID $accountId `
    -LogonType ServiceAccount  -RunLevel Highest;

$psSobsSchedulerPath = "\Microsoft\Windows\PowerShell\ScheduledJobs";
$someResult = Set-ScheduledTask -TaskPath $psSobsSchedulerPath `
    -TaskName $taskName  -Principal $principal

Write-Host;
Write-Host "Let's show proofs that our PowerShell job will be running under the LocalSytem account"
$task = Get-ScheduledTask -TaskName $taskName
$task.Principal

Write-Host "Let's start $taskName"
Start-Job -DefinitionName $taskName | Format-Table

Write-Host "Let's proof that our PowerShell job was ran"
Start-Sleep -Seconds 3
Receive-Job -Name $taskName

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X