web-dev-qa-db-fra.com

Le script PowerShell ne s'exécutera pas en tant que tâche planifiée Windows

J'ai un script PowerShell (qui fonctionne). Dans le Planificateur de tâches Windows, j'ai créé une nouvelle tâche pour exécuter "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe", en transmettant l'argument comme script PS1. Lorsque la tâche est exécutée, le résultat de la dernière exécution est 0x1.

J'ai mis à jour mon script pour écrire dans un fichier journal lorsque le script s'ouvre et que cela ne se produit pas. C'est presque comme si la tâche ne pouvait même pas ouvrir Powershell.exe.

Cela semble-t-il exact? Quel pourrait être le problème ou comment puis-je le contourner?

23
ewitkows

Si le problème que vous rencontrez concerne la stratégie d'exécution, vous pouvez également définir la stratégie d'exécution d'un appel spécifique de PowerShell. Voici ce que je fais généralement lorsque j'exécute PowerShell via une tâche planifiée:

powershell.exe -NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File \\path\to\script.ps1

Pourquoi?

-Pas de profil

Cela garantit que vous (ne vous fiez à rien dans le profil PowerShell de l'utilisateur) , et évite la surcharge liée à l'exécution de ce code supplémentaire.

-Pas de logo

Cela n'a généralement pas d'importance; c'est peut-être le cas si vous capturez la sortie de votre script. Surtout ça me fait me sentir mieux.

-NonInteractive

Garantit que votre tâche n'attendra pas indéfiniment si quelque chose dans votre script invite l'utilisateur à le faire de manière inattendue. Avec ce commutateur, le script va simplement quitter; au moins, vous aurez un code d'erreur au lieu d'un script suspendu.

-ExécutionPolicy Bypass

Vous pouvez utiliser Unrestricted ici ou selon la stratégie d'exécution de votre choix. C'est probablement celui dont vous avez le plus besoin.

Pourquoi je préfère définir la stratégie d'exécution de cette manière:

Parce que je ne veux pas que la tâche dépende d'un paramètre global autre que celui par défaut, vous pourriez avoir d'autres raisons de changer à l'avenir. Si un autre processus dépend d'une stratégie d'exécution différente, votre tâche ne se trouve pas de cette façon.

De plus, il est toujours agréable de ne pas avoir à changer les valeurs par défaut. Moins à retenir/documenter/tester.

Prime

_ { Voir la réponse de JohnLBevan pour connaître certaines causes supplémentaires du résultat de 0x1 dans une tâche planifiée }.

48
briantist

Il existe plusieurs causes possibles pour qu'un script PowerShell appelé par le planificateur de tâches se termine avec le code 0x1:

  • La stratégie d'exécution n'autorise pas l'exécution du script. Voir Excellente réponse de Briantist pour plus de détails à ce sujet.
  • L'indicateur Run with highest privileges (case à cocher de l'onglet Général de la tâche) n'est pas activé.
  • Les paramètres sont transmis au script de manière incorrecte. Si vous utilisez une approche telle que -File ".\MyScript.ps1" -Parameter1 'Demo', essayez plutôt: -Command "& .\MyScript.ps1 -Parameter1 'Demo'"
4
JohnLBevan

Je l'ai déjà fait et j'ai eu des problèmes similaires. Ce sont presque toujours les paramètres de sécurité PowerShell. Bien évidemment, je revérifierais votre politique d’exécution (en supposant que vous l’ayez définie).

Sous quel utilisateur la tâche est-elle exécutée? Cet utilisateur a-t-il déjà exécuté un script PowerShell? Si je me souviens bien, chaque utilisateur est invité à "autoriser" l'exécution de scripts PowerShell (Y/N) lors de l'exécution initiale d'un script (quelle que soit la stratégie d'exécution). Cela m'a déjà mordu. Essayer:

  • se connecter en tant qu'utilisateur
  • vérifier la politique d'exécution
  • lancer le script à partir d'une invite PowerShell
  • répondez aux invites suivantes.

Après la première exécution, vous ne devriez plus avoir à vous en préoccuper et il devrait très bien fonctionner à partir du planificateur de tâches.

En fonction de la sécurité de votre domaine, vous devrez peut-être également définir la stratégie d'exécution du groupe. Voici un article qui explique en détail comment faire cela, ainsi que quelques autres éléments à vérifier: PowerShell Security.

2
Aaron

Les réponses précédentes sont d'une grande valeur. J'ai ajouté la valeur ci-dessous dans le champ Ajouter des arguments .

-noninteractive -nologo -command "&{path\to\script.ps1}"

Assurez-vous d’ajouter la perluète et de placer le chemin entre accolades. N'oubliez pas les guillemets avant esperluette et après la fermeture des accolades.

1
Devesh3710

Si vous ne recevez aucun message d'erreur et ne savez pas quel est le problème - pourquoi les scripts PowerShell ne veulent pas démarrer à partir d'une tâche planifiée, procédez comme suit pour obtenir la réponse:

  1. Exécuter CMD en tant qu'utilisateur configuré pour qu'une tâche planifiée exécute le script PowerShell
  2. Accédez au dossier contenant le script PowerShell.
  3. Exécutez le script PowerShell (supprimez toutes les instructions qui bloquent les notifications d'erreur, le cas échéant, telles que $ ErrorActionPreference = 'silentlycontinue')

Vous devriez pouvoir voir toutes les notifications d'erreur.

Dans le cas d'un de mes scripts, c'était:

Impossible de trouver le type [System.ServiceProcess.ServiceController]. Assurez-vous que l'assembly qui contient ce type est chargé.

Et dans ce cas, je dois ajouter une ligne supplémentaire au début du script pour charger l'assembly manquant:

Add-Type -AssemblyName "System.ServiceProcess"

Et les prochaines erreurs:

Exception appelant "GetServices" avec le ou les arguments "1": "Impossible d'ouvrir Service Control Manager sur ordinateur ''. Cette opération peut nécessiter d'autres privilèges."

select: la propriété ne peut pas être traitée car la propriété "Nom de la base de données" existe déjà

0