Windows – Exécuter un script PowerShell en tant que tâche planifiée immédiate avec une GPO
Sommaire
I. Présentation
L'exécution d'un script PowerShell à partir d'une stratégie de groupe n'implique pas nécessairement le redémarrage de la machine. Il existe une méthode, basée sur la création d'une tâche planifiée à exécution immédiate, qui permet d'exécuter un script PowerShell (ou un autre programme) de façon très rapide sur un poste de travail Windows ou une machine Windows Server. C'est ce que nous allons voir dans ce tutoriel.
Lors de l'utilisation d'une GPO pour exécuter un script PowerShell, la méthode la plus fréquemment utilisée est l'exécution d'un script au démarrage de l'ordinateur. Ceci implique de redémarrer l'ordinateur, d'une part pour appliquer la stratégie de groupe, et d'autre part pour que le script soit exécuté puisqu'il s'exécute au démarrage (ou à l'arrêt, selon le paramètre sélectionné).
Néanmoins, c'est contraignant puisqu'un redémarrage implique potentiellement une interruption de service et une perturbation. Cela est vrai qu'il s'agisse de redémarrer un serveur ou un poste de travail.
Lorsqu'un administrateur a besoin d'exécuter un script PowerShell (ou un autre programme) rapidement sur une machine, dans le cadre d'une opération de remédiation, comment faire ? Surtout, comment faire à partir des outils natifs de l'Active Directory et sans recourir à des solutions annexes ? La réponse se cache dans les stratégies de groupe.
II. Sélection du script PowerShell à exécuter
Avant de pouvoir planifier l'exécution d'un script PowerShell, nous devons tout d'abord déterminer quel est ce script. Dans le cas présent, nous allons prendre l'exemple de la désactivation d'IPv6 sur Windows, afin de se protéger contre les vulnérabilités associées. Cette phrase fait écho à ce précédent article :
Nous utiliserons les scripts présents sur ce dépôt GitHub :
Le script à exécuter doit être hébergé sur un emplacement réseau pour être accessible aux machines. L'alternative serait de le copier sur chaque machine (via GPO également), mais ce n'est pas la méthode que je préfère : on évitera d'éparpiller le script un peu partout.
III. Créer la tâche immédiate par GPO
La prochaine étape consiste à configurer la stratégie de groupe pour exécuter notre script PowerShell en tant que tâche immédiate. Voici comment procéder.
Ouvrez la console de gestion des stratégies de groupe (GPMC). Ensuite, créez une stratégie de groupe. Pour ma part, je crée une GPO sur l'OU "PC" à partir d'un clic droit et de l'option "Créer une GPO dans ce domaine, et le lier ici…". Cette GPO sera nommée "Sécurité - Windows - Désactiver IPv6".
Une fois la GPO sélectionnée, effectuez un clic droit dessus et sélectionnez "Modifier" pour passer à la phase de configuration.
Dans l'éditeur de stratégie de groupe, naviguez vers :
- Configuration ordinateur > Préférences > Paramètres du Panneau de configuration (1)
Puis, cliquez droit (2) afin de mettre votre souris sur "Nouveau" (2) et de cliquer sur l'option "Tâche immédiate (au minimum Windows 7)".
Commençons par la configuration de l'onglet "Général".
- Indiquez un nom et une description
- Cochez l'option "Exécuter avec les privilèges les plus élevés" car il s'agit d'une tâche d'administration qui nécessite des permissions élevées.
- Définissez l'option "Configurer pour" sur la valeur "Windows 7, Windows Server 2008 R2" pour avoir accès aux paramètres les plus récents.
Ensuite, vous devez définir le compte avec lequel va s'exécuter la tâche planifiée. Si votre script a besoin des permissions administrateur, indiquez alors "NT AUTHORITY\SYSTEM", qui est le niveau de permission le plus élevé. N'hésitez pas à faire un copier-coller de cette valeur, car elle doit être écrite de cette façon. De plus, cochez l'option "Exécuter même si l'utilisateur n'est pas connecté".
Remarque : si vous indiquez une valeur incorrecte, l'erreur 0x80070534 sera renvoyée par cette tâche. Ce code d'erreur sera notamment visible lors d'une analyse avec l'outil gpresult.
Pour la suite de la configuration :
1 - Passez sur l'onglet "Actions". C'est ici qu'il va falloir déclarer le script PowerShell à exécuter.
2 - Cliquez sur le bouton "Nouveau".
3 - Choisissez l'action "Démarrer un programme".
4 - Indiquez "powershell.exe" comme nom de programme (nous pourrions choisir autre chose, dans un autre cas d'usage).
5 - Ajoutez les arguments nécessaires pour outrepasser la politique d'exécution (si nécessaire) et spécifier le chemin vers le script.
-ExecutionPolicy Bypass -File "\\IT-CONNECT.LOCAL\sysvol\it-connect.local\scripts\IPv6\Manage-IPv6.ps1"
6 - Cliquez sur "OK".
Enfin, vous pouvez basculer sur l'onglet "Commun" pour cocher l'option "Appliquer une fois et ne plus réappliquer". Ceci est utile pour une exécution unique de ce script, puisqu'il n'a pas vocation à être exécuté plusieurs fois.
Si vous avez l'habitude de créer des tâches planifiées, vous remarquerez l'absence de l'onglet "Déclencheurs" : vous ne pouvez pas choisir quand sera exécuté le script. En fait, c'est une tâche immédiate, donc il sera exécuté ASAP sur les machines ciblées : dès qu'elles vont récupérer la GPO.
Validez, votre tâche apparaît bien dans la liste. Si vous souhaitez intégralement appliquer le scénario de désactivation d'IPv6, créez une seconde tâche pour le second script.
La GPO est prête, il ne reste plus qu'à tester.
IV. Tester la configuration
Si tout est correctement configuré, notre script PowerShell devrait s'exécuter comme prévu, et nous aurons réussi à automatiser cette tâche sur plusieurs machines via la stratégie de groupe.
Si vous êtes curieux, rendez-vous dans le "Planificateur de tâches" de la machine sur laquelle la GPO s'applique. Ici, vous devriez voir votre tâche planifiée :
En principe, cette tâche s'est même déjà exécutée ! Il vous suffit de vérifier que le script a bien effectué les actions attendues pour vous en convaincre... En complément, naviguez dans l'Observateur d'événements de la machine, au sein du journal "Windows PowerShell". Un événement avec l'ID 800 doit faire référence à l'exécution du script, comme ceci :
Tout fonctionne à merveille ! Il est à noter que lors de la prochaine synchronisation des GPO, la tâche planifiée sera automatiquement supprimée de la machine.
V. Conclusion
Ce tutoriel vous a montré comment configurer l'exécution de scripts PowerShell en tant que tâches immédiates, en utilisant une fonction méconnue des stratégies de groupe. Cette méthode est intéressante pour automatiser des tâches sur plusieurs machines, sans être dépendant d'un reboot. Elle peut rendre bien des services lorsque l'on est dénué d'outils complémentaires capables de le faire (SCCM, Intune, etc.). Vous pouvez maintenant adapter cette technique à vos besoins !
N'hésitez pas à commenter cet article ou à vous connecter à notre Discord si vous avez une question.
Il préférable de mettre le sid du compte système a la place du nom système, en effet dans certain cas system est traduit en système avec l’accent et ça fait planter certain PC ou gpo.
Bonne remarque Simon, merci
Bonjour Simon,
merci du rappel, je confirme que sur mon infra, obligé aussi de l’écrire à la Française avec l’accent grave.
https://imgur.com/a/xQZXtfQ
Cordialement
Bonjour
Merci pour cette astuce, juste pour être sûr, si la GPO pour forcer la signature de code est activé, le script PS doit être signé par éditeur approuvé malgré l’utilisation du compte système pour que celui-ci s’exécute.