Introduction à PowerShell, boîte à outils de l’administrateur système

L’importance des administrateurs système dans les entreprises ne doit pas être sous-estimée, car ce n’est qu’avec une infrastructure informatique fiable et fonctionnant en permanence qu’une entreprise peut atteindre le maximum de son efficacité économique. Selon la taille de l’organisation, cela nécessite la surveillance et le contrôle de dizaines, voire de centaines d’ordinateurs simultanément. C’est une tâche gigantesque que seuls des spécialistes formés ayant une connaissance approfondie des connexions internes au système peuvent maîtriser.

Si un problème survient avec plusieurs ordinateurs en même temps ou si une nouvelle solution de sécurité doit être chargée sur l’ensemble du réseau le plus rapidement possible, il ne serait ni rapide ni économique pour un administrateur de visiter chacun des appareils et de répéter toujours les mêmes actions. Windows PowerShell permet d’accélérer considérablement ces processus et d’automatiser autant que possible les tâches de routine. Cela simplifie grandement le travail de l’administrateur système. Vous pouvez également découvrir ce que le logiciel peut faire dans notre article.

Qu’est-ce que Windows PowerShell?

Windows PowerShell est, comme son nom l’indique, un shell. En informatique, c’est une interface entre un ordinateur et son utilisateur. Le terme anglais shell signifie coquille, mais au sens figuré, il est utilisé pour décrire une coquille extérieure. C’est également le cas en informatique, où le terme désigne l’interface utilisateur visible à travers laquelle on peut interagir avec les fonctions internes du système d’un ordinateur.

Les shells sont généralement orientés commande et sont donc contrôlés exclusivement par le clavier et la saisie de texte. Ils constituent donc une alternative aux interfaces utilisateur graphiques (graphical user interfaces, abrégés par GUI), qui se naviguent principalement à la souris, de même que l’Explorateur Windows. Dans la mesure où les shells permettent également d’accéder à des fonctions et des composants beaucoup plus nombreux et profonds d’un PC, ils sont préférés par de nombreux professionnels de l’informatique et administrateurs système.

Pourquoi Windows PowerShell ?

Jusqu’à récemment, la ligne de commande command.com et l’invite de commande cmd.exe étaient respectivement les shells par défaut des systèmes d’exploitation DOS et Windows. Ils peuvent être utilisés par les utilisateurs d’ordinateurs avancés pour ouvrir des applications de console, résoudre des problèmes ou naviguer sur les lecteurs d’un PC. Par exemple, la commande netstat peut être utilisée pour obtenir des informations de base sur toutes les activités réseau. Cependant, command.com et cmd.exe ont toujours rencontré deux problèmes : tous les composants du système ne sont pas accessibles par leur intermédiaire, et leurs langages de script sont considérés comme limités en fonctionnalité. Ainsi, depuis quelque temps déjà, ils sont considérés comme moins aboutis que les shells Linux et Unix courants.

Les développeurs de Microsoft avaient donc prévu de supprimer ces restrictions depuis les années 1990. Au fil du temps, ils ont développé divers shells avec lesquels ce plan a réussi, parfois bien parfois moins bien. Monad, lancé pour la première fois en 2003 et rebaptisé PowerShell trois ans plus tard, s’est révélé particulièrement révolutionnaire.

Les Common Engineering Criteria de Microsoft, selon lesquels tous les produits serveurs de l’entreprise doivent supporter PowerShell depuis 2009, en ont fait la solution centrale de gestion et d’automatisation sous Windows. À partir de Windows 2008, il a été livré avec le système d’exploitation en option, les versions ultérieures ont été livrées avec le système d’exploitation en standard, et comme framework open source, il est également disponible en téléchargement pour les versions antérieures de Windows.

En 2016, il a été décidé de proposer une plateforme Shell indépendante. L’intention de Microsoft était qu’à l’avenir, PowerShell deviendrait également un outil universel pour les administrateurs système en dehors de Windows, c’est-à-dire sous Linux et MacOS. Depuis, PowerShell s’est de plus en plus répandu et trouve constamment de nouveaux soutiens. En résumé, PowerShell est le successeur attendu depuis longtemps de l’invite de commande.

Qu’est-ce qui différencie PowerShell de l’invite de commande ?

En quoi le nouveau framework Microsoft diffère-t-il exactement de l’invite de commande habituelle ? Pour faire simple, PowerShell possède toutes les fonctionnalités de cmd.exe, peut en faire beaucoup mieux, et fait d’autres choses qui étaient jusqu’alors impossibles sous Windows.

En principe, PowerShell fournit la même gamme de commandes que cmd.exe. Pour résumer, PowerShell peut être utilisé de la même manière que l’invite de commande, avec une connaissance suffisante des commandes standard. Cependant, il permet également d’accéder à des fonctions internes Windows plus approfondies, telles que le registre et Windows Management Instrumentation (WMI), qui n’étaient pas accessibles auparavant avec cmd.exe. De plus, la ligne de commande de Windows PowerShell suit la logique claire d’une structure de commande et d’une syntaxe cohérentes et à cet égard est plus significative que cmd.exe.

Windows PowerShell se distingue également par une autre caractéristique : contrairement aux invites de commandes et aux systèmes de type Unix, le programme fonctionne entièrement basé sur les objets au lieu de se contenter d’enchaîner les résultats des commandes. Chaque objet possède à la fois des propriétés (properties) et des méthodes (methods) qui spécifient comment il peut être utilisé. Par exemple, l’objet de processus Windows représente des propriétés telles que les noms et ID de processus et les méthodes de pause et d’interruption des processus.

Dans la mesure où les résultats des commandes sont toujours transmis sous forme d’objets .NET, PowerShell peut être utilisé pour effectuer des tâches beaucoup plus complexes que cmd.exe. Ceci fonctionne en utilisant la sortie d’un objet dans le tube comme entrée pour l’objet suivant. Par exemple, vous pouvez filtrer des quantités importantes et complexes de données pour les extensions de fichiers et les formater sous forme de liste claire.

Windows PowerShell est plus qu’une simple ligne de commande, c’est un environnement de script complet et puissant. Vous pouvez écrire vos propres commandes ou combiner plusieurs commandes dans des scripts complexes qui simplifient les tâches de gestion du système. Remoting permet également d’exécuter des scripts sur n’importe quel nombre de systèmes en même temps, quel que soit leur emplacement, et donc de gérer, configurer, capturer et réparer ces scripts.

Cette variété d’options et de fonctionnalités révèle également quel est le public principal de Windows PowerShell : les professionnels de l’informatique et les administrateurs système qui ont une connaissance approfondie de l’utilisation des shells et qui sont prêts à apprendre Windows PowerShell pour une efficacité nettement supérieure. Pour les utilisateurs qui travaillent principalement avec l’interface graphique Windows et n’utilisent l’invite de commande que sporadiquement, PowerShell n’offre aucune valeur ajoutée particulière, d’autant plus que le temps nécessaire à la familiarisation est assez long.

Voici un aperçu des avantages et des inconvénients de Windows PowerShell sur l’invite de commande :

Avantages de PowerShell Inconvénients de PowerShell
✔ Toutes les commandes sont disponibles à l’invite de commandes ✘ Processus d’apprentissage complexe et exigeant
✔ Accès à des ressources internes Windows plus profondes telles que le registre et WMI ✘ S’adresse principalement aux professionnels de l’informatique et aux administrateurs système.
✔ Fonctionnement plus efficace grâce à une structure de commande et une syntaxe cohérentes ✘ Aucun avantage supplémentaire pour les utilisateurs de l’interface graphique qui utilisent rarement l’invite de commande.
✔ L’orientation objet complète permet l’exécution de tâches plus complexes par pipelining ✘ Nécessite un effort d’adaptation
✔ Un environnement de script étendu permet une automatisation efficace des processus  
✔ Administration indépendante de l’emplacement de plusieurs systèmes par télécommande  

Comment fonctionne Windows PowerShell ?

PowerShell se compose essentiellement de deux parties, le moteur PowerShell et le langage de script PowerShell. Les deux peuvent être utilisés séparément ou en combinaison pour tirer le meilleur parti du programme.

Le moteur PowerShell

L’interpréteur de ligne de commande (en anglais command-line interpreter, abrégé par CLI) de PowerShell permet à l’utilisateur d’accéder aux fonctions internes du système d’exploitation via le clavier. Les commandes correspondantes du programme sont appelées cmdlets (prononcées commandlets, ce qui signifie petites commandes). Selon une syntaxe cohérente, ils sont toujours composés d’un verbe et d’un nom au singulier, par exemple, Stop-Process ou Sort-Object. Les paramètres sont spécifiés dans un cmdlet en fonction du paramètre de formule Parameter [Valeur], par exemple :

Get-EventLog System Newest 3 (pour ouvrir les trois dernières entrées du journal des événements système.)
Conseil

Bien qu’il s’agisse d’une convention dans PowerShell pour entrer des commandes avec une lettre majuscule, les minuscules fonctionnent aussi bien.

Les plus de 100 cmdlets de base comprennent également des commandes standard fréquemment utilisées à partir de l’invite de commande, qui sont disponibles sous forme d’alias entre autres, et sont destinées à faciliter la prise en main du nouveau shell par les utilisateurs. Par exemple, la commande cd utilisée pour changer un répertoire a l’équivalent Set-Location, qui exécute exactement la même fonction. Tous les alias pré-construits peuvent être affichés à l’aide du cmdlet Get-Alias. Vous pouvez également utiliser le cmdlet Set-Alias pour créer vos propres alias. Par exemple, vous pouvez utiliser le tube suivant pour assigner l’alias ed à la commande notepad (pour le programme Notepad) afin de ne pas avoir à saisir autant de fois que nécessaire pour exécuter le programme :

Set-Alias ed notepad (pour ouvrir Notepad avec la commande ed)
Set-Alias scr1 C:\Users\IEUser\Desktop\script1.ps1 (pour exécuter un script avec l’abréviation scr1)

Le tableau suivant contient quelques exemples de cmdlets couramment utilisés et leurs alias associés :

Alias Cmdlet Fonction
cd Set-Location Modifier le répertoire courant
dir Get-ChildItem Lister tous les éléments d’un dossier
gi Get-Item Appeler un élément spécifique
ps Get-Process Lister tous les processus
gsv Get-Service Lister tous les services installés
gm Get-Member Afficher toutes les propriétés et méthodes d’un objet
clear Clear-Host Vider l’hôte PowerShell

La structure de commande stricte et facile à suivre de PowerShell vous permet de travailler plus efficacement qu’à l’invite de commande. L’option de compléter automatiquement les cmdlets en cours d’écriture avec la touche [Tab] permet de gagner encore plus de temps. Dans de nombreux cas, le programme détecte même les commandes incomplètement tapées.

Les cmdlets peuvent être utilisés individuellement ou en pipeline pour que la sortie d’un objet puisse être lue et réutilisée par l’objet suivant. Pour ajouter deux cmdlets à la même pipeline, utilisez simplement le symbole |. De cette façon, par exemple, vous pouvez lister tous les processus disponibles et les trier par ID en même temps :

Get-Process | Sort-Object ID 

Les variables sont définies avec le symbole $. Comme d’habitude, elles peuvent être utilisées pour stocker des outputs qui seront récupérés ultérieurement pendant le pipelining. Ceci permet même à PowerShell de stocker les résultats de plusieurs commandes en pipeline à la fois, par exemple :

$a = (Get-Process | Sort-Object ID)

Le langage de script PowerShell

Une grande partie du langage de script de PowerShell peut vous sembler familière à partir de C# et d’autres langages de script. Non seulement vous pouvez l’utiliser pour écrire vos propres cmdlets (et les partager avec d’autres utilisateurs si nécessaire), mais vous pouvez également regrouper plusieurs commandes consécutives dans un fichier script.ps1 pour étendre les fonctionnalités du shell. De nombreux exemples d’application sont envisageables, de l’exécution de tâches de routine simples à l’automatisation presque complète des processus de surveillance et de contrôle. Les scripts contiennent toujours une description de l’application et sont exécutés avec le préfixe « . » suivi du chemin complet du fichier. Voici un exemple :

.C:\Users\IEUser\Desktop\script1.ps1

Quelles sont les applications spécifiques de PowerShell?

Si vous avez suffisamment de pratique et d’expertise, PowerShell peut rendre de nombreuses tâches d’administration système beaucoup plus efficaces. Vous trouverez ci-dessous quatre exemples d’applications représentatives.

Organisation du répertoire : renommer plusieurs fichiers à la fois

Supposons que vous deviez renommer environ 1 000 documents du schéma Texte (1).docx, Texte (2).docx, etc. pour que les espaces du nom de fichier soient remplacés par des tirets : dans ce cas, il ne serait pas souhaitable de renommer chaque document un par un. À la place, vous utiliserez probablement cmd.exe ou, mieux encore, un outil externe. Le pipelining dans PowerShell offre encore plus de flexibilité lors du renommage de grandes quantités de données.

Pour ce faire, allez d’abord dans le répertoire dans lequel se trouvent les documents. Vous pouvez le faire facilement avec le cmdlet Set-Location en combinaison avec le chemin de fichier complet. En voici un exemple :

Set-Location C:\Users\IEUser\Desktop\Text folder

Vous pouvez également utiliser l’Explorateur Windows pour naviguer jusqu’au répertoire approprié, cliquer sur la barre de chemin et taper powershell pour ouvrir une fenêtre PowerShell pour ce répertoire. Utilisez ensuite le cmdlet suivant pour renommer les documents sélectionnés :

Get-ChildItem *docx | Rename-Item -NewName {$_.name -replace " ","_"}

Explication : Get-ChildItem liste tous les fichiers du répertoire. Avec l’ajout *docx, seuls les documents Word avec le format correspondant sont filtrés : les documents PDF qui se trouvent également dans le dossier ne seront donc pas pris en compte. Le symbole | ajoute une autre commande au pipeline, Rename-Item, qui indique que quelque chose doit être renommé. -NewName spécifie le nouveau nom en utilisant un bloc de script qui fonctionne avec la variable $_.name qui représente l’objet courant. Et .name est la propriété avec le nom du fichier. Enfin, utilisez le paramètre -replace pour spécifier que tous les espaces doivent être convertis en tirets.

Collecte de données : vérification des services en cours d’exécution sur un PC

Avant de mettre en œuvre une nouvelle solution de sécurité sur le réseau, vous devez vérifier quels services sont déjà installés sur un PC particulier. L’outil de base pour cela est le cmdlet Get-Service, qui liste tous les services. Les fonctions de filtre de PowerShell vous permettent également de ne visualiser qu’un sous-ensemble des résultats, par exemple tous les services en cours d’exécution. Ceci fonctionne avec le cmdlet suivant :

Get-Service | Where-Object {$_.status -eq "running"}

L’output de Get-Service achemine vers le cmdlet Where-Object. Where-Object filtre tous les services par leur statut (représenté par la variable $_.status et le paramètre -eq "running") et liste les services en cours d’exécution. Vous pouvez également trier la liste préfiltrée par nom d’affichage si nécessaire en ajoutant un autre cmdlet au pipeline :

Get-Service | Where-Object {$_.status -eq "running"} | Sort-Object DisplayName
Conseil

Avec l’extension pipeline more, vous pouvez également restructurer la longue liste de services afin de pouvoir la parcourir page par page.

Erreur de diagnostic : recherche d’erreurs système dans le journal des événements

Les journaux d’événements (event logs en anglais) fournissent aux administrateurs système des informations sur les messages d’erreur dans les applications, dans le système d’exploitation ou dans les fonctions de sécurité d’un périphérique. Utilisez la commande Get-EventLog pour afficher et gérer ces journaux. Par exemple, si vous souhaitez consulter les messages d’erreur dans l’Observateur d’événements système, saisissez ceci :

Get-EventLog System | Where-Object {$_.entryType -Match "Error"}

Si PowerShell renvoie trop de résultats, vous pouvez utiliser le paramètre -Newest 100 pour limiter la liste aux 100 dernières entrées du journal système, qui sont ensuite filtrées pour les erreurs :

Get-EventLog System -Newest 100 | Where-Object {$_.entryType -Match "Error"}

Pour des informations détaillées sur les messages d’erreur, transférez la sortie de ce pipeline vers le cmdlet Format-List :

Get-EventLog System -Newest 100 | Where-Object {$_.entryType -Match "Error"} | Format-List

Maintenance à distance : services de contrôle sur ordinateurs distants

Le Windows Management Instrumentation (WMI) donne accès à presque tous les paramètres et fonctions des ordinateurs Windows, ce qui en fait l’outil le plus important pour l’automatisation des processus et la maintenance à distance des postes de travail numériques. Vous pouvez également utiliser le cmdlet Get-WmiObject pour les ordinateurs distants, de sorte que vous pouvez également utiliser Windows PowerShell comme outil de gestion système. Par exemple, si vous avez besoin d’informations de classe Win32_BIOS sur une machine du réseau (représentée par le paramètre -machinename), la commande suivante vous aidera :

Get-WmiObject Win32_Bios -Machinename

Autrement, vous pouvez travailler avec le paramètre -Class suivi du chemin complet de la classe :

Get-WmiObject - Machinename -Class Win32_Service

Vous pouvez maintenant accéder à distance aux paramètres système internes de l’ordinateur externe. L’exemple suivant illustre comment récupérer les méthodes du service Windows Update Client pour savoir quels cmdlets peuvent être utilisés pour le démarrer, l’arrêter et le redémarrer :

Get-WmiObject -machinename -Class Win32_Service -Filter "Name=‘wuauserv’"

Le nom d’hôte Get-WmiObject-Machinename cible d’abord l’hôte désiré et sélectionne ensuite la classe Win32_Service en utilisant le paramètre -Class. Le client Windows Update Client avec l’abréviation wuauserv est alors filtré à partir des services existants. Avec le cmdlet Get-Member déjà connu et le paramètre de méthode -Type Method, vous obtenez un aperçu de toutes les méthodes de wuauserv qui vous permettent de contrôler complètement le client à distance.

Get-WmiObject -Machinename -Class Win32_Service -Filter "Name=‘wuauserv’" | Get-Member -Type Method