web-dev-qa-db-fra.com

Powershell exécute le travail au démarrage avec les droits d'administrateur à l'aide de ScheduledJob

Pour faciliter certains de mes travaux, j'ai créé un script PowerShell qui doit: 

  1. Exécuter au démarrage.
  2. Exécuter avec les droits d’administrateur, car il doit écrire dans le dossier c:\program files.

J'ai créé le service de démarrage en utilisant Powershell comme ceci:

function MakeStartupService
{
    Write-Host "Adding script as a startup service"
    $trigger = New-JobTrigger -AtStartup -RandomDelay 00:00:15
    Try
    {
      Register-ScheduledJob -Trigger $trigger -FilePath "absolute_path" -Name "Job-name" -EA Stop
    }
    Catch [system.exception]
    {
        Write-Host "Looks like an existing startup service exists for the same. Overwriting existing job"
        Unregister-ScheduledJob "Job-name"
        Register-ScheduledJob -Trigger $trigger -FilePath "absolute_path" -Name "Job-name"
    }
}

Le travail est correctement enregistré en tant que service de démarrage et est visible dans le planificateur de tâches. Si je le lance en utilisant Start-Job -DefinitionName Job-name ou en cliquant avec le bouton droit de la souris dans le Planificateur de tâches, tout fonctionne correctement, mais ne démarre pas au démarrage de Windows.

Actuellement, je teste cela sur mon système personnel Windows 10 et j'ai vérifié dans un autre système Windows 10, mais le comportement est resté le même. Je joins une capture d'écran de la fenêtre du planificateur de tâches pour ce travail.  enter image description here

Désolé si ces questions semblent répétées ou stupides (je suis un débutant en PowerShell), mais croyez-moi, aucune des solutions que j'ai trouvées en ligne n'a fonctionné pour cela.

Merci d'avance !!

16
Gagan93

C'est le code qui est déjà en production que j'utilise. Si cela ne fonctionne pas pour vous, vous devez avoir quelque chose d'autre avec votre système.

function Invoke-PrepareScheduledTask
{
    $taskName = "UCM_MSSQL"
    $task = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue
    if ($task -ne $null)
    {
        Unregister-ScheduledTask -TaskName $taskName -Confirm:$false 
    }

    # TODO: EDIT THIS STUFF AS NEEDED...
    $action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-File "C:\Invoke-MYSCRIPT.ps1"'
    $trigger = New-ScheduledTaskTrigger -AtStartup -RandomDelay 00:00:30
    $settings = New-ScheduledTaskSettingsSet -Compatibility Win8

    $principal = New-ScheduledTaskPrincipal -UserId SYSTEM -LogonType ServiceAccount -RunLevel Highest

    $definition = New-ScheduledTask -Action $action -Principal $principal -Trigger $trigger -Settings $settings -Description "Run $($taskName) at startup"

    Register-ScheduledTask -TaskName $taskName -InputObject $definition

    $task = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue

    # TODO: LOG AS NEEDED...
    if ($task -ne $null)
    {
        Write-Output "Created scheduled task: '$($task.ToString())'."
    }
    else
    {
        Write-Output "Created scheduled task: FAILED."
    }
}
11
Kory Gill

Si cela fonctionne, ce n'est pas un problème de script. Attribuez-le au compte SYSTEM ou créez un compte de service distinct au lieu du compte Gagan affiché. Assurez-vous que ce compte de service dispose du "Permission d'exécution en tant que travail par lots" dans votre stratégie de sécurité locale. 

1
Sencha718

Veuillez cocher la case "Exécuter avec les privilèges les plus élevés" pour la tâche dans le planificateur de tâches et réessayer. Actuellement dans la capture d'écran ci-dessus, il est décoché.

Je l'ai encerclé ci-dessous en rouge pour votre information:  checkbox required checked

0
Aman Sharma

Voici un article de blog de Microsoft que vous pouvez vérifier si votre tâche planifiée n'est pas en cours d'exécution: https://blogs.technet.Microsoft.com/askperf/2015/02/18/help-my-scheduled-task- ne court pas/

Comme mentionné également dans d'autres réponses, il est également indiqué:

  • Essayez d'exécuter votre script avec le compte SYSTEM
0
A189198