miroir de
https://github.com/PAPAMICA/Wiki-Tech.io.git
synchronisé 2024-09-11 02:05:03 +02:00
187 lignes
15 Kio
HTML
187 lignes
15 Kio
HTML
<!--
|
||
title: Powershell
|
||
description:
|
||
published: true
|
||
date: 2021-05-20T07:59:49.441Z
|
||
tags:
|
||
editor: ckeditor
|
||
dateCreated: 2021-05-08T14:42:07.092Z
|
||
-->
|
||
|
||
<h1>Définition</h1>
|
||
<p>PowerShell est un langage script fondé sur la programmation orientée objet. Le logiciel PowerShell est l'interpréteur de l’interface en ligne de commande de l'environnement de développement Windows PowerShell.</p>
|
||
<p> </p>
|
||
<h2>Le Langage objet</h2>
|
||
<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êté, en attente etc…et bien PowerShell fonctionne ainsi.</p>
|
||
<p>on verra plus tard comment lister tout ces éléments et savoir si nous sommes devant une propriété ou une méthode.</p>
|
||
<p> </p>
|
||
<h2>Les raccourcis clavier</h2>
|
||
<p>Avant de se lancer tête baissée, dans PowerShell, deux raccourci clavier sont indispensables dans le sens où il vont vous permettre d'obtenir de l'aide et de gagner du temps.</p>
|
||
<ol>
|
||
<li><strong><u>tabulation:</u></strong> vous permet de faire de la complétion, c'est à dire compléter le mot que vous êtes en train d'écrire.</li>
|
||
<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>
|
||
</ol>
|
||
<p>alors, à consommer sans modération.</p>
|
||
<p>allez hop c'est parti….</p>
|
||
<p> </p>
|
||
<h2>Les commandes ou applets de commande (cmdlet)</h2>
|
||
<p>Elles sont composées d’une paire de la forme “verbe ”-“nom” destiné à en faciliter la mémorisation.</p>
|
||
<p>exemple :</p>
|
||
<pre><code class="language-plaintext">Get-Service</code></pre>
|
||
<p>get = verbe</p>
|
||
<p>service = nom</p>
|
||
<p>petite astuce, vous pouvez lister tout les verbes que PowerShell utilise avec la commande <code>Get-verb</code>. faites un essai…</p>
|
||
<p>simple non?</p>
|
||
<p> </p>
|
||
<h2>Les variables</h2>
|
||
<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>Exemple :</p>
|
||
<pre><code class="language-plaintext">$variable = une valeur </code></pre>
|
||
<p> </p>
|
||
<h2>Le pipeline</h2>
|
||
<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>Exemple : </p>
|
||
<pre><code class="language-plaintext">Get-Process | Sort-Object CPU</code></pre>
|
||
<p>Dans ce cas précis, la commande <code>Sort-Object</code> tri les processus par utilisation de Cpu</p>
|
||
<p> </p>
|
||
<h2>L' aide</h2>
|
||
<p>Sous PowerShell la commande <code>Get-Help</code> permet d'afficher la fonction et des exemples d'une commande.</p>
|
||
<pre><code class="language-plaintext">Get-Help <la commande></code></pre>
|
||
<p>Mais avant d'utiliser cette commande il faut faire une mise à jour de l'aide de PowerShell avec la commande</p>
|
||
<pre><code class="language-plaintext"> Update-Help</code></pre>
|
||
<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'information on peut ajouter l'option <code>-detailed</code></p>
|
||
<pre><code class="language-plaintext">Get-Help <la commande> -detailed</code></pre>
|
||
<p>On peut aussi lister des exemples d'utilisation d'une commande avec l'option <code>-examples</code></p>
|
||
<pre><code class="language-plaintext">Get-Help <la commande> -examples</code></pre>
|
||
<p>Il arrive parfois que l'aide renvoyée sous PowerShell ne soit pas complète malgré un <code>Update-Help.</code></p>
|
||
<p>Pour cela il y a possibilité d'aller consulter directement l'aide en ligne avec l'option <code>-online</code> </p>
|
||
<pre><code class="language-plaintext">Get-Help <la commande> -online</code></pre>
|
||
<p>Si vous voulez de l'aide sur la syntaxe d'une commande, PowerShell indique par “<strong>[ ]</strong>” si le paramètre est obligatoire.</p>
|
||
<p>Par exemple si vous voulez de l'aide sur la syntaxe de commande <code>Get-ChildItem</code> </p>
|
||
<pre><code class="language-plaintext">Get-Help Get-ChildItem</code></pre>
|
||
<p>On peut constater dans la capture que certains paramètres sont obligatoires.</p>
|
||
<figure class="image image_resized" style="width:88.82%;"><img src="/capture4.png"></figure>
|
||
<p> </p>
|
||
<p> </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>
|
||
<pre><code class="language-plaintext">Get-Help service</code></pre>
|
||
<p>Voici ce que renvoie la commande, on peut voir les commandes qui contiennent le mot service.</p>
|
||
<figure class="image image_resized" style="width:86.32%;"><img src="/capture1.png"></figure>
|
||
<p> </p>
|
||
<p>Une autre fonction de l'aide permet d'avoir des informations sur un sujet précis.</p>
|
||
<p>Pour lister ces sujets utilisez l'option <code>about_*</code> </p>
|
||
<pre><code class="language-plaintext">Get-Help about_*</code></pre>
|
||
<p>Par exemple, si vous voulez de l'aide au sujet de pipeline</p>
|
||
<pre><code class="language-plaintext">Get-Help about_pipeline</code></pre>
|
||
<p>Voici ce que renvoie la commande</p>
|
||
<figure class="image image_resized" style="width:84.46%;"><img src="/capture3.png"></figure>
|
||
<p> </p>
|
||
<p> </p>
|
||
<h2>Lister les méthodes et les propriétés</h2>
|
||
<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><code>Get-Member</code> est la commande qui nous dis quels sont les propriétés et les méthodes que nous pouvons appliquer à un objet.</p>
|
||
<p>un exemple concret est plus parlant:</p>
|
||
<figure class="image"><img src="/get-member.png"></figure>
|
||
<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>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. </p>
|
||
<p>Par exemple: Pause, Stop, Refresh sont des méthodes. Displayname, Servicename, ServiceType sont des propriétés.</p>
|
||
<p> </p>
|
||
<h2>Les providers</h2>
|
||
<p>Dans PowerShell, les providers permettent d'accéder par exemple à la base de registre, aux fichiers système à l'environnement etc…</p>
|
||
<ul>
|
||
<li>Base de Registre {HKLM, HKCU}</li>
|
||
<li>Alias {alias}</li>
|
||
<li>Environnement {env}</li>
|
||
<li>FileSystem {C,D,E,F}</li>
|
||
<li>Function {Function}</li>
|
||
<li>variable {Variable}</li>
|
||
</ul>
|
||
<p>Pour lister l'ensemble des providers, on utilise la commande</p>
|
||
<pre><code class="language-plaintext">Get-Psdrive</code></pre>
|
||
<p>L'avantage c'est que vous pouvez parcourir ces éléments comme si c'était un système de fichiers.</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>
|
||
<figure class="image"><img src="/capture9.png"></figure>
|
||
<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>
|
||
<figure class="image image_resized" style="width:74.13%;"><img src="/capture6.png"></figure>
|
||
<p> </p>
|
||
<p> </p>
|
||
<h2>Récupérer des informations WMI et CIM</h2>
|
||
<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>
|
||
<p>Pour finir je vous montrerai une astuce pour “fouiner” dans la liste des requêtes WMI et les instances CIM.</p>
|
||
<ol>
|
||
<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 et 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>
|
||
</ol>
|
||
<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>Voyons comment utiliser ces commandes et obtenir des infos sur un système.</p>
|
||
<figure class="image"><img src="/get-ciminstance.png"></figure>
|
||
<p> </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 fouiner dans toutes ces classes.</p>
|
||
<p>C'est alors que nous viens en aide la commande<code> Get-Cimclass</code>.</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>
|
||
<p> Pour cela 3 solutions pour s'y retrouver:</p>
|
||
<ul>
|
||
<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>
|
||
</ul>
|
||
<p> </p>
|
||
<pre><code class="language-plaintext">Get-CimClass | Out-File</code></pre>
|
||
<p> </p>
|
||
<ul>
|
||
<li><u>renvoyer le tout dans un fichier Excel</u> et faire sa petite recherche à l'aide d'outils incorporés.</li>
|
||
</ul>
|
||
<p> </p>
|
||
<pre><code class="language-plaintext">Get-Cimclass | Select-Object CimClassName | Export-Csv -Path C:\classescim.csv</code></pre>
|
||
<p> </p>
|
||
<p>Petite remarque: <code>Select-object</code> permet de filtrer les informations de la commande en récupérant unique la partie CimclassName de <code>Get-CimClass</code></p>
|
||
<ul>
|
||
<li><u>renvoyer le tout dans un GridView</u>, un outil fourni dans PowerShell bien pratique.</li>
|
||
</ul>
|
||
<p> </p>
|
||
<pre><code class="language-plaintext">Get-Cimclass | Out-GridView</code></pre>
|
||
<p> </p>
|
||
<p>J'en profite pour vous montrer le Gridview. Profitez-en pour le manipuler.</p>
|
||
<figure class="image"><img src="/gridview.png"></figure>
|
||
<p> </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>A partir de la, connaitre à quoi servent tout les requêtes et les instance CIM serait un peu fou. c'est pourquoi je vous renvoie vers ce <a href="https://docs.microsoft.com/fr-fr/windows/win32/cimwin32prov/cimwin32-wmi-providers">lien</a> pour en connaitre leur utilité et en savoir un peu plus sur ces classes.</p>
|
||
<p>Vous commencez certainement à vous dire POWAAA!! puissant le truc…</p>
|
||
<p>Allez à vous de jouer! Essayer de récupérer des infos, comme par exemple sur le bios, la date de l'installation du système, le ou les disque(s) dur etc…</p>
|
||
<h1>Création d'un menu sous Powershell</h1>
|
||
<p>Voici un exemple de menu qu'il est possible de faire avec la méthode suivante :</p>
|
||
<figure class="image image_resized" style="width:58.46%;"><img src="/capture2.png"></figure>
|
||
<p> </p>
|
||
<h2>Principe de fonctionnement</h2>
|
||
<p>Nous avons besoin de déclarer une variable qui va servir en quelque sorte de bouton “allumé” ou “éteins” : <code>$continue = $true</code></p>
|
||
<p>Avec cette variable j'utilise une boucle pour permettre de laisser en permanence l'affichage : </p>
|
||
<pre><code class="language-plaintext">While ($continue)
|
||
{
|
||
<le menu avec des Write-Host>
|
||
}</code></pre>
|
||
<p>Puis une seconde variable pour stocker mon choix avec <code>$choix = read-host “faire un choix”</code></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>Le <code>switch </code>va permettre d'indexer les choix ,de les lister et d'exécuter les commandes.</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>
|
||
<p>La commande <code>default </code>permet de renvoyer un message d'avertissement si vous rentrez un choix qui n'est pas dans le menu.</p>
|
||
<p> </p>
|
||
<h2>Exemple</h2>
|
||
<pre><code class="language-plaintext">$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}
|
||
}
|
||
}
|
||
|
||
</code></pre>
|
||
<p> </p>
|