<p>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 .</p>
<p>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.</p>
<p>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.</p>
<p>Si PowerShell n'est pas installé sur votre machine je vous invite à vous rendre sur le GitHub de PowerShell via ce <ahref="https://github.com/PowerShell/PowerShell/releases">lien</a> et de télécharger la dernière version core stable (7.1.3 à ce jour) sur votre système. </p>
<p>Pour les prérequis de Windows PowerShell, je vous invite à suivre ce <ahref="https://docs.microsoft.com/fr-fr/powershell/scripting/windows-powershell/install/windows-powershell-system-requirements?view=powershell-7.1">lien.</a></p>
<p>Si vous êtes sous linux je vous invite à suivre ce <ahref="https://docs.microsoft.com/fr-fr/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7.1">lien</a> pour l'installation de PowerShell sur ce système.</p>
<p>Si vous êtes sur Mac, tout se trouve <ahref="https://docs.microsoft.com/fr-fr/powershell/scripting/install/installing-powershell-core-on-macos?view=powershell-7.1">ici.</a></p>
<p>Et pour l'utilisation de PowerShell sous docker, c'est par <ahref="https://docs.microsoft.com/fr-fr/powershell/scripting/install/powershell-in-docker?view=powershell-7.1">ici</a>.</p>
<p>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.</p>
<p>Pour terminer, on peut lancer la console en spécifiant directement à l'endroit ou l'on souhaite se positionner avec le paramètre <code>-WorkingDirectory</code>.</p>
<p>Si vous désirez utiliser la console Windows PowerShell (en version 5.1 à ce jour), il vous suffira d'exécuter la commande <code>PowerShell</code>. 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. </p>
<p>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…</p>
<p>Il suffit ensuite de taper un mot et de cliquer sur <code>suivant</code> pour que ce mot soit surligner dans la console PowerShell. Cliquez de nouveau sur <code>suivant</code> pour atteindre le prochain.</p>
<p>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.</p>
<li><strong><u>ctrl + espace:</u></strong> lorsque vous souhaitez connaitre toutes les options d'une commande PowerShell, via ce raccourci, une liste de toutes les options possibles d'une commande vous sera suggérées voir même vous afficher des éléments pour compléter cette même option.</li>
<p>Le pipeline, symbolisée par le caractère “<strong>|</strong>” (<strong>AltGr</strong> + <strong>6</strong>) permet d'exécuter plusieurs commandes à la suite.</p>
<p>Cette commande <code>Get-Help</code> 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 <code>-detailed</code></p>
<p>On peut constater dans la capture que certains paramètres sont obligatoires. Vous pouvez également voir tout en bas les liens connexes à cette commande.</p>
<p>La commande <code>Get-Help</code> permet également de rechercher une commande si, par exemple, vous souhaitez trouver une commande qui gère les services.</p>
<p>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.</p>
<p>(Vous remarquerez que j'utilise la commande <code>Get-Service</code>, que je récupère toutes les méthodes et propriétés en passant par une seconde commande <code>Get-Member</code> et pour enchainer ces commandes j'opte pour un pipeline)</p>
<p>Exemple, si vous voulez parcourir la base de registre machine il suffit de taper <code>cd hklm :</code> 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 <code>cd c:</code>.</p>
<p>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.</p>
<p>Exemple avec la commande <code>Get-ChildItem</code> ,vous pouvez consulter toute la base de registre de votre hkey local machine</p>
<p>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. </p>
<p>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. </p>
<li><code><u>Get-WmiObject</u></code>: À partir de PowerShell 3.0, cette applet de commande a été remplacée par <code>Get-CimInstance</code>. Elle n'est plus mise à jour sous PowerShell. Elle se base sur des requêtes WMI et le protocole RPC (Remote Procedure Call).</li>
<li><code><u>Get-CimInstance</u></code>: cette commande, se base sur des instances CIM (Common Information Model ) , WS-MAN (WS-Management) et le protocole WInRM (<i>Windows Remote Management), couplé au protocole SOAP (Simple Object Acces Protocol).</i></li>
<p>Par conséquent, je vous conseille vivement d'utiliser le plus souvent possible <code>Get-CimInstance</code>, 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.</p>
<p>Vous remarquez que j'utilise l'option <code>-classname</code> ? 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.</p>
<p>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.</p>
<li><u>renvoyer le tout dans un fichier texte,</u> le sauvegarder pour l'avoir sous la main puis un petit “<strong>ctrl + F”</strong> pour rechercher dans la liste.</li>
<p>Petite remarque: <code>Select-Object</code> permet de filtrer les informations de la commande en récupérant uniquement la partie CimclassName de <code>Get-CimClass</code></p>
<p>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.</p>
<p>Vous commencez certainement à vous dire POWAAA!! puissant le truc…</p>
<p>Connaitre à quoi servent toutes les requêtes WMI et les instances CIM serait un peu fou. C'est pourquoi, je vous renvoie vers ce <ahref="https://docs.microsoft.com/fr-fr/windows/win32/cimwin32prov/cimwin32-wmi-providers">lien</a> pour en connaitre leurs utilités et en savoir un peu plus sur ces classes.</p>
<p>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…</p>
<p>Une variable PowerShell est un emplacement de stockage provisoire en mémoire destiné à recueillir une valeur, un objet ou une collection d’objets.<br>Les variables sont généralement nommées, et leurs noms sont toujours précédés d’un symbole “$“<br>Les variables sont automatiquement “typées” lors de l’affectation de valeur (si elles ne sont pas déclarées au préalable.)</p>
<p>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.</p>
<p>Suivant l'état de ce choix le script sortira de la boucle <code>while</code> et cela provoquera soit une action du script soit une sortie du script avec <code>switch ($choix)</code>.</p>
<p>Pour sortir du script si vous faites le choix ‘<i>x</i>’ le script passe la variable <code>$continue</code> à <code>$false</code> ce qui aura pour effet d'arrêter la boucle <code>while</code>.</p>