Comment installer et mettre à jour PowerShell par GPO ?
Sommaire
I. Présentation
Dans ce tutoriel, nous allons voir comment installer et mettre à jour PowerShell par GPO (stratégie de groupe) afin de faciliter le déploiement sur des PC ou des serveurs Windows.
Sur Windows, que ce soit les éditions Desktop ou Server, Windows PowerShell est intégré au système. Que ce soit sur Windows 10, Windows 11, Windows Server 2019 ou Windows 2022, c'est Windows PowerShell 5.1 qui est installé.
Néanmoins, depuis quelques années maintenant, Microsoft travaille sur le développement d'une autre version de PowerShell, appelée dans un premier temps PowerShell Core, est qui est aujourd'hui en version 7.1 (la version 7.2 est en version preview). Cette version est multiplateforme, c'est-à-dire qu'elle fonctionne sur Windows, Linux et macOS.
C'est sur elle qu'il faudra miser à l'avenir, mais pour en savoir plus sur la différence entre ces deux versions, je vous recommande de lire cet article :
II. Comment installer PowerShell 7 sur Windows ?
Pour installer PowerShell 7 (et supérieur) sur une seule machine, on peut tout simplement télécharger le package MSI sur le GitHub officiel et l'installer sur sa machine.
On peut aussi l'installer à partir du Microsoft Store, ce qui permettra d'avoir les mises à jour automatique.
L'installation à partir du gestionnaire de paquets "winget" créé par Microsoft est possible aussi, y compris pour les mises à jour. Voici la commande pour l'installer :
winget install --id Microsoft.PowerShell
La gestion des mises à jour est importante, car Microsoft sort de nouvelles versions de PowerShell plusieurs fois par an, que ce soit pour ajouter des fonctionnalités, corriger des bugs ou combler des failles de sécurité.
Par contre, on peut se demander, et c'est légitime, comment installer PowerShell 7 sur un ensemble de postes de travail ou de serveurs sans le faire manuellement ? Et comment le maintenir à jour dans le temps ? Pour cela, on peut s'appuyer sur une stratégie de groupe (GPO) comme nous allons le voir dans la suite de ce tutoriel.
III. Mettre à jour PowerShell sur son PC avec une tâche planifiée
Dans un article précédent, nous avions vu comment mettre à jour PowerShell sur Windows, mais là nous allons automatiser ce processus de mise à jour de PowerShell grâce à une tâche planifiée. Je dispose d'une machine Windows 11 (mais c'est pareil sur les autres systèmes) équipée de PowerShell 7.1.4, mais la version 7.1.5 est disponible.
L'exemple qui suit, basé sur la création d'une tâche planifiée sur une machine locale fonctionne très bien : j'utilise cette méthode depuis plusieurs mois. L'objectif de notre tâche planifiée est d'exécuter la commande suivante (qui sert à exécuter le script Update-PowerShell.ps1).
powershell.exe -File "c:\scripts\Update-PowerShell.ps1
Ce script contient une seule ligne qui permet d'exécuter le script d'installation fourni par Microsoft et qui offre la possibilité d'installer PowerShell en mode silencieux.
Voici le contenu de "Update-PowerShell.ps1" :
iex "& { $(irm https://aka.ms/install-powershell.ps1) } -UseMSI -Quiet"
Ce script est stocké dans le répertoire "C:\Scripts" :
Une fois qu'il est positionné, passez à la création de la tâche. Ouvrez la gestion de l'ordinateur et au sein du "Planificateur de tâches", effectuez un clic droit "Créer une tâche".
Nommez cette tâche "Mise à jour PowerShell" et cochez l'option "Exécuter même si l'utilisateur n'est pas connecté" pour qu'elle s'exécute à partir du moment où la machine est démarrée.
Ensuite, pour le compte à utiliser, ce n'est pas nécessaire d'utiliser le compte Administrateur du domaine comme sur l'exemple ci-dessus. Utilisez un utilisateur local ou un utilisateur du domaine qui est administrateur local ce sera suffisant et ce sera mieux. 😉
Passez à l'onglet "Déclencheurs" et cliquez sur le bouton "Nouveau". Nous devons indiquer à quel moment et à quelle fréquence nous souhaitons exécuter la tâche de mise à jour. À vous de voir : tous les jours, tous les 3 jours, une fois par semaine... Mais choisissez une heure pendant laquelle la machine sera allumée, car si ce n'est pas un serveur, ce n'est pas forcément H24.
On choisit de lancer la tâche "À l'heure programmée", "Chaque jour" à "12:30" à partir d'aujourd'hui. En complément, et pour éviter que la tâche tourne indéfiniment, configurez l'option "Arrêter la tâche si elle s'exécute plus de" à "1 heure". Validez.
Passez à l'onglet suivant : "Actions", et créez une nouvelle action en cliquant sur le bouton "Nouveau". Voici comment remplir le formulaire :
- Action : démarrer un programme
- Programme/script : powershell.exe
- Ajouter des arguments : -File "C:\Scripts\Update-PowerShell.ps1"
Cela va permettre d'exécuter le script "Update-PowerShell.ps1". Ensuite, validez.
Passez au dernier onglet afin de configurer également l'option "Arrêter la tâche si elle s'exécute plus de...". Validez, car nous avons terminé de paramétrer la tâche planifiée.
La tâche planifiée apparaît dans la liste. Pour l'exécuter manuellement et tester sans plus attendre, effectuez un clic droit et cliquez sur "Exécuter".
Après quelques minutes (le temps de télécharger le package MSI depuis GitHub et de l'installer), PowerShell est à jour sur la machine !
Si cela ne fonctionne pas, soit PowerShell est déjà à jour, soit votre politique d'exécution de scripts sur votre machine est trop restrictive pour permettre l'exécution de ce script. Dans ce cas, basculez en "RemoteSigned", comme ceci :
Set-ExecutionPolicy RemoteSigned
Relancez la tâche planifiée pour tester.
IV. Installer et mettre à jour PowerShell via GPO
Maintenant, on va s'attaquer à plusieurs machines d'un coup, que ce soit des serveurs ou des postes de travail, à l'aide d'une GPO. Pour installer et mettre à jour PowerShell par GPO, il y a au moins deux options :
- Déploiement du MSI de PowerShell
- Avantage : le package MSI est hébergé sur l'un de vos serveurs en local
- Inconvénient : c'est à vous de suivre les mises à jour PowerShell et de mettre à jour le package MSI de temps en temps
- Création d'une tâche planifiée
- Avantage : installation de PowerShell s'il n'est pas installé et installation d'une nouvelle version dès qu'elle est disponible, automatiquement
- Inconvénient : chaque machine va récupérer le package MSI à partir de GitHub, et donc d'Internet, pour installer PowerShell la première fois ou le mettre à jour si besoin
Si vous souhaitez mettre en œuvre le déploiement du package MSI, je vous oriente vers ce tutoriel :
Pour la seconde méthode basée sur une tâche planifiée et qui permet d'automatiser l'installation et la mise à jour de PowerShell sans avoir à s'en occuper, lisez la suite de ce tutoriel.
Commencez par créer une nouvelle GPO à partir de l'Éditeur de stratégie de groupe. Liez cette GPO à l'OU qui contient une ou plusieurs machines sur laquelle vous souhaitez tester. Ensuite, modifiez la GPO.
Parcourez l'arborescence de cette façon :
Configuration ordinateur > Préférences > Paramètres du Panneau de configuration > Tâches planifiées
Effectuez un clic droit, puis sous "Nouveau" cliquez sur "Tâche planifiée (au minimum Windows 7)".
Un assistant s'ouvre et il ressemble étrangement à celui que l'on retrouve lorsque l'on crée une tâche planifiée sur une machine locale. Tant mieux.
Au sein de l'onglet "Général", choisissez l'action "Mettre à jour"(cela permet de créer la tâche planifiée si elle n'existe pas et de l'actualiser dans le cas où elle existe, mais que l'on souhaite lui apporter une modification).
Donnez un nom à cette tâche, par exemple "Installer et mettre à jour PowerShell". Pour exécuter cette tâche, on va utiliser le compte SYSTEM intégré à chaque machine Windows. Voici la valeur à indiquer : NT AUTHORITY\SYSTEM.
Note : vous voyez que l'on ne peut pas cocher l'option "Exécuter même si l'utilisateur n'est pas connecté", car elle est grisée, mais nous allons y revenir après.
Passez à l'onglet suivant, intitulé "Déclencheurs" et créez un nouveau déclencheur sur le même principe que tout à l'heure : à la fréquence et à l'heure que vous voulez. Vérifiez que l'option "Activée" est bien cochée.
Ensuite, passez à l'onglet "Actions". Là, il va y avoir un peu de changement par rapport à tout à l'heure. Au lieu d'utiliser le répertoire "C:\scripts" local, on va s'appuyer sur le partage SYSVOL de notre domaine pour que le script soit accessible par chaque machine (cela évite de le copier en local à chaque fois...).
Prenez le script "Update-PowerShell.ps1" et positionnez-le au sein de votre répertoire SYSVOL (à la racine du dossier "scripts" ou dans un sous-dossier). Pour ma part, ce sera ici :
\\it-connect.local\sysvol\it-connect.local\scripts\Update-PowerShell.ps1
Au niveau du programme, indiquez :
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Puis, pour le champ "Ajouter des arguments", utilisez ceci :
-ExecutionPolicy Bypass -File "\\it-connect.local\sysvol\it-connect.local\scripts\Update-PowerShell.ps1"
Grâce à "-ExecutionPolicy Bypass" on va permettre l'exécution de ce script même si la politique d'exécution de la machine est plus stricte. Cela s'applique seulement au niveau du processus qui sera lancé par notre tâche planifiée. Quant à l'option -File elle sert à spécifier le chemin vers le script.
La tâche est prête, validez !
Retournez dans les propriétés de votre tâche via la GPO, et dans l'onglet "Général", c'est possible que "NT AUTHORITY\SYSTEM" soit remplacé par une autre valeur. Si c'est le cas, forcez de nouveau cette valeur.
En complément, vous pouvez cocher l'option "Exécuter même si l'utilisateur n'est pas connecté". Ce comportement est curieux, je ne sais pas s'il s'agit d'un bug, mais voici comment s'en sortir malgré tout : il faut juste le savoir.
Cette fois-ci, la tâche planifiée est réellement prête !
Il ne reste plus qu'à se connecter sur un serveur ou un PC sur lequel s'applique la GPO et à actualiser les GPO grâce à "gpupdate /force". La tâche planifiée "Installer et mettre à jour PowerShell" va apparaître grâce à notre GPO.
Au moment venu, PowerShell va s'installer sur la machine s'il n'est pas installé ou se mettre à jour s'il y a une nouvelle version disponible.