PowerShell est un langage script, open source, fondé sur la programmation orientée objet et qui s'appuie sur le Framework .net core (une bibliothèque de fonctionnalités multiplateforme). Le logiciel PowerShell est l'interpréteur de l’interface en ligne de commande de l'environnement de développement Windows PowerShell. Ces fonctionnalités principales sont d'administrer des systèmes, d'automatiser des tâches et de développer des outils .
PowerShell est un langage orienté “objet” . C'est à dire que PowerShell considère tout les éléments qu'il traite ainsi. Pour vous expliquez cela, je vais prendre comme exemple une voiture. Une voiture a des propriétés comme sa couleur, sa forme, sa taille etc.. les propriétés d'un objet s'apparentent plutôt à des éléments physiques, ses méthodes seraient donc rouler, tourner, avancer, reculer etc… les méthodes sont davantage liées à une action.
Pour être concret, un service a comme propriétés son nom, son statuts et comme méthodes démarrer, arrêter, en attente etc…et bien PowerShell fonctionne ainsi.
on verra plus tard comment lister tout ces éléments et savoir si nous sommes devant une propriété ou une méthode.
Si PowerShell n'est pas installé sur votre machine je vous invite à vous rendre sur le GitHub de PowerShell via ce lien et de télécharger la dernière version core stable (7.1.3 à ce jour) sur votre système.
Si vous êtes sous Windows, il y a également la possibilité de le télécharger par le biais du Windows store.
Pour les prérequis de Windows PowerShell, je vous invite à suivre ce lien.
Lors de l'installation vous pouvez laisser tout les paramètres d'installation par défaut.
Si vous êtes sous linux je vous invite à suivre ce lien pour l'installation de PowerShell sur ce système.
Si vous êtes sur Mac, tout se trouve ici.
Et pour l'utilisation de PowerShell sous docker, c'est par ici.
Windows ne met plus à jour la version Windows PowerShell (en version 5.1 à ce jour) pour au final passer à la version core car celle-ci est multiplateforme.
Pour lancer PowerShell il faut utiliser l'exécutable PWSH
. Pour cela, appuyer simultanément sur la touche Windows + R, puis tapez PWSH
.
La console PowerShell peut être lancée en exécutant une commande en même temps:
PWSH -command <une commande>
On peut aussi lancer cette même commande sans que la console se referme avec
PWSH -noexit -command <une commande>
On peut également connaitre sa version de PowerShell en le spécifiant avec le paramètre -version
.
PWSH -version
Pour terminer, on peut lancer la console en spécifiant directement à l'endroit ou l'on souhaite se positionner avec le paramètre -WorkingDirectory
.
PWSH -WorkingDirectory c:\windows
Il existe encore d'autres paramètres que vous pouvez obtenir en tapant:
PWSH /?
Si vous désirez utiliser la console Windows PowerShell (en version 5.1 à ce jour), il vous suffira d'exécuter la commande PowerShell
. Vous pouvez constater que les deux versions peuvent cohabiter. A termes, Windows fournira uniquement la version core de PowerShell puisque celle-ci est multiplateforme et Windows PowerShell ne bénéficie plus de mises à jour.
Pour configurer votre console cliquez sur l'icône en haut à gauche puis de sélectionner Propriétés.
Dans le menu propriétés, vous avez la possibilité de paramétrer votre terminal PowerShell à votre guise. Tel que la couleur de la console, l'opacité, la taille du texte, la police, la forme du curseur etc…
Pour rechercher dans la console PowerShell vous pouvez utiliser le menu de la console PowerShell.
Il suffit ensuite de taper un mot et de cliquer sur suivant
pour que ce mot soit surligner dans la console PowerShell. Cliquez de nouveau sur suivant
pour atteindre le prochain.
Avant de se lancer tête baissée, dans PowerShell, deux raccourcis clavier sont indispensables dans le sens où il vont vous permettre d'obtenir de l'aide et de gagner du temps.
alors, à consommer sans modération.
allez hop c'est parti….
Elles sont composées d’une paire de la forme “verbe ”-“nom” destiné à en faciliter la mémorisation.
exemple :
Get-Service
get = verbe
service = nom
elles peuvent être accompagnées dans certains cas de paramètres et de valeurs. Par exemple avec la commande:
New-Item -type file -Path c:\test.txt
New-Item = la commande
-type = un paramètre
file = une valeur
-Path = un paramètre
c:\test.txt = une valeur
petite astuce, vous pouvez lister tout les verbes que PowerShell utilise avec la commande Get-verb
. faites un essai…
simple non?
Le pipeline, symbolisée par le caractère “|” (AltGr + 6) permet d'exécuter plusieurs commandes à la suite.
Exemple :
Get-Process | Sort-Object CPU
Dans ce cas précis, la commande Sort-Object
tri les processus par utilisation de Cpu
Sous PowerShell la commande Get-Help
permet d'afficher la fonction et des exemples d'une commande.
Get-Help <la commande>
Mais avant d'utiliser cette commande il faut faire une mise à jour de l'aide de PowerShell avec la commande
Update-Help
Cette commande Get-Help
permet d'avoir une aide de manière très générale si on souhaite obtenir plus d'informations on peut ajouter l'option -detailed
Get-Help <la commande> -detailed
On peut aussi lister des exemples d'utilisation d'une commande avec l'option -examples
Get-Help <la commande> -examples
Une dernière option de Get-help
vous permet d'afficher l'aide complète de la commande -Full
Get-Help <la commande> -Full
Il arrive parfois que l'aide renvoyée sous PowerShell ne soit pas complète malgré un Update-Help.
Pour cela il y a possibilité d'aller consulter directement l'aide en ligne avec l'option -online
Get-Help <la commande> -online
Si vous voulez de l'aide sur la syntaxe d'une commande, PowerShell indique par “[ ]” si le paramètre est obligatoire.
Par exemple si vous voulez de l'aide sur la syntaxe de commande Get-ChildItem
Get-Help Get-ChildItem
On peut constater dans la capture que certains paramètres sont obligatoires. Vous pouvez également voir tout en bas les liens connexes à cette commande.
La commande Get-Help
permet également de rechercher une commande si, par exemple, vous souhaitez trouver une commande qui gère les services.
Get-Help service
Voici ce que renvoie la commande, on peut voir les commandes qui contiennent le mot service.
Une autre fonction de l'aide permet d'avoir des informations sur un sujet précis.
Pour lister ces sujets utilisez l'option about_*
Get-Help about_*
Par exemple, si vous voulez de l'aide au sujet de pipeline
Get-Help about_pipeline
Voici ce que renvoie la commande
Maintenant que nous avons vu, comment était composée une commande, le pipeline et l'aide, il est temps, comme je vous l'ai dis dans le premier chapitre, que tout était objet dans PowerShell et de découvrir plus en détail ce que sont les propriétés les méthodes. C'est à cet instant, que nous alors voir quelle commande va nous permettre de lister tout cela.
Get-Member
est la commande qui nous dis quels sont les propriétés et les méthodes que nous pouvons appliquer à un objet.
un exemple concret est plus parlant:
(Vous remarquerez que j'utilise la commande Get-Service
, que je récupère toutes les méthodes et propriétés en passant par une seconde commande Get-Member
et pour enchainer ces commandes j'opte pour un pipeline)
C'est à partir de ces éléments qu'à présent on peut savoir quelles sont les propriétés et les méthodes d'un service.
Par exemple: Pause, Stop, Refresh sont des méthodes. Displayname, Servicename, ServiceType sont des propriétés.
Dans PowerShell, les providers permettent d'accéder par exemple à la base de registre, aux fichiers système, à l'environnement etc…
Pour lister l'ensemble des providers, on utilise la commande
Get-Psdrive
L'avantage c'est que vous pouvez parcourir ces éléments comme si c'était un système de fichiers.
Exemple, si vous voulez parcourir la base de registre machine il suffit de taper cd hklm :
et vous vous retrouvez dans la base de registre et la parcourir comme si c'était un filesystem et revenir dans votre arborescence Windows avec un cd c:
.
Vous avez ensuite la possibilité de créer ou de consulter des entrées dans la base de registre comme si c'était un filesystem et utiliser les commandes de base.
Exemple avec la commande Get-ChildItem
,vous pouvez consulter toute la base de registre de votre hkey local machine
Pour modifier la valeur d'une clé de registre ou des propriétés d'un élément je vous laisse consulter la commande
Set-ItemProperty
Wmi (Windows Management instrumentation),implémenté dans Windows, permet d'obtenir des informations sur un système et même à distance tel que la version du bios, le nom de la machine, le fabricant, le modèle, la date d'installation etc. Cela permet en quelques sortes d'interroger l'inventaire matériel et logiciel de votre système.
Il existe deux commandes pour obtenir ces informations, mais on peut également invoquer des méthodes et des propriétés avec celle-ci, par exemple redémarrer un service, demander des infos sur vos disques et je vais vous montrez les différences qu'il peut exister.
Pour finir je vous montrerai une astuce pour “fouiner” dans la liste des requêtes WMI et Des instances CIM.
Get-WmiObject
: À partir de PowerShell 3.0, cette applet de commande a été remplacée par Get-CimInstance
. Elle n'est plus mise à jour sous PowerShell. Elle se base sur des requêtes WMI et le protocole RPC (Remote Procedure Call).Get-CimInstance
: cette commande, se base sur des instances CIM (Common Information Model ) , WS-MAN (WS-Management) et le protocole WInRM (Windows Remote Management), couplé au protocole SOAP (Simple Object Acces Protocol).Par conséquent, je vous conseille vivement d'utiliser le plus souvent possible Get-CimInstance
, il y a encore tout un tas de raisons de l'utiliser mais je ne vais pas m'attarder la dessus, ce n'est pas le but.
Voyons comment utiliser ces commandes et obtenir des infos sur un système.
Récupérons les information sur la mémoire vive.
Vous remarquez que j'utilise l'option -classname
? et oui, en effet, toutes les requêtes WMI et les instances CIM sont regroupées par classe. Et c'est maintenant, que je vous montre comment je fais pour m'y retrouver dans toutes ces classes.
C'est alors que nous vient en aide la commande Get-Cimclass
.
Si on exécute cette commande on voit que la liste est longue et que cela peut paraitre un peu compliqué, à première vue, et par forcément facile à lire. De plus, la commande renvoie l'ensemble des classes Wmi et Cim.
Pour cela 3 solutions pour s'y retrouver:
Get-CimClass | Out-File -path c:\classcim.txt
Get-Cimclass | Select-Object CimClassName | Export-Csv -Path C:\classescim.csv
Petite remarque: Select-Object
permet de filtrer les informations de la commande en récupérant uniquement la partie CimclassName de Get-CimClass
Get-Cimclass | Out-GridView
J'en profite pour vous montrer le Gridview.
C'est une Fenêtre, bien pratique, qui permet dans ce cas, de mettre directement sous forme de tableau, de filtrer ou de rechercher des éléments renvoyés par une commande.
Vous commencez certainement à vous dire POWAAA!! puissant le truc…
Connaitre à quoi servent toutes les requêtes WMI et les instances CIM serait un peu fou. C'est pourquoi, je vous renvoie vers ce lien pour en connaitre leurs utilités et en savoir un peu plus sur ces classes.
Allez à vous de jouer! Essayez de récupérer des infos, comme par exemple sur la version de votre bios, la date de l'installation du système, le ou les disque(s) dur etc…
Une variable PowerShell est un emplacement de stockage provisoire en mémoire destiné à recueillir une valeur, un objet ou une collection d’objets.
Les variables sont généralement nommées, et leurs noms sont toujours précédés d’un symbole “$“
Les variables sont automatiquement “typées” lors de l’affectation de valeur (si elles ne sont pas déclarées au préalable.)
Exemple :
$variable = une valeur
Avant de rentrer dans le vif de ce sujet, il faut savoir que sous PowerShell, il existe deux type de variables spécifiques générées automatiquement.
Elles stockent l'état de votre système et sont gérées par PowerShell. Elles ne peuvent pas être modifiées.
Pour lister ces variables automatiques vous pouvez utiliser la commande:
Get-Help about_automatic_variable
Voici quelques exemples que peuvent renvoyer ces variables
La première variable indique par un booléen si la dernière commande à bien été exécutée.
la seconde renvoie à quel emplacement vous vous situez.
Elles stockent la configuration de votre système et peuvent être modifiées.
Pour lister ces variables utilisez la commande:
Get-Help about_preference_variable
voici une des variables de préférences les plus connues pour la gestion des erreurs que nous verrons un peu plus tard.
$ErrorActionPreference
Dans cette capture vous pouvez voir les valeurs que nous pouvons lui attribuer:
Je vous invite à consulter ces variables qui peuvent être utiles dans certaines situations.
Voici un exemple de menu qu'il est possible de faire avec la méthode suivante :
Nous avons besoin de déclarer une variable qui va servir en quelque sorte de bouton “allumé” ou “éteins” : $continue = $true
Avec cette variable j'utilise une boucle pour permettre de laisser en permanence l'affichage :
While ($continue)
{
<le menu avec des Write-Host>
}
Puis une seconde variable pour stocker mon choix avec $choix = read-host “faire un choix”
Suivant l'état de ce choix le script sortira de la boucle while
et cela provoquera soit une action du script soit une sortie du script avec switch ($choix)
.
Le switch
va permettre d'indexer les choix ,de les lister et d'exécuter les commandes.
Pour sortir du script si vous faites le choix ‘x’ le script passe la variable $continue
à $false
ce qui aura pour effet d'arrêter la boucle while
.
La commande default
permet de renvoyer un message d'avertissement si vous rentrez un choix qui n'est pas dans le menu.
$continue = $true
while ($continue){
write-host “----------------------MON TITRE -----------------------”
write-host “1. mon action 1”
write-host "2. mon action 2"
write-host "x. exit"
write-host "--------------------------------------------------------"
$choix = read-host “faire un choix :”
switch ($choix){
1{commande de mon action 1}
2{commande de mon action 2}
‘x’ {$continue = $false}
default {Write-Host "Choix invalide"-ForegroundColor Red}
}
}