1
0
Bifurcation 0
miroir de https://github.com/PAPAMICA/Wiki-Tech.io.git synchronisé 2024-09-02 14:12:22 +02:00
Wiki-Tech.io/Scripting/Powershell.html

127 lignes
8,4 Kio
HTML
Brut Vue normale Historique

2021-05-08 16:42:09 +02:00
<!--
title: Powershell
description:
published: true
2021-05-15 10:50:12 +02:00
date: 2021-05-15T08:50:10.777Z
2021-05-08 16:42:09 +02:00
tags:
editor: ckeditor
dateCreated: 2021-05-08T14:42:07.092Z
-->
2021-05-09 15:26:40 +02:00
<h1>Définition</h1>
2021-05-09 12:50:15 +02:00
<p>PowerShell est un langage script fondé sur la programmation orientée objet. Le logiciel PowerShell &nbsp;est l'interpréteur de l’interface en ligne de commande de l'environnement de développement Windows PowerShell.</p>
<p>&nbsp;</p>
2021-05-09 17:13:10 +02:00
<h2>Les commandes ou applets de commande (cmdlet)</h2>
2021-05-13 08:45:50 +02:00
<p>Elles sont composées d’une paire de la forme “verbe ”-“nom” destiné à en faciliter la mémorisation.</p>
2021-05-09 12:42:51 +02:00
<p>exemple :</p>
2021-05-13 08:45:50 +02:00
<pre><code class="language-plaintext">Get-Service</code></pre>
2021-05-09 12:20:19 +02:00
<p>get = verbe</p>
<p>service = nom</p>
2021-05-09 12:42:51 +02:00
<p>&nbsp;</p>
2021-05-09 12:51:47 +02:00
<h2>Les variables</h2>
2021-05-09 14:13:42 +02:00
<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>
2021-05-13 08:45:50 +02:00
<p>Exemple :</p>
2021-05-09 16:09:28 +02:00
<pre><code class="language-plaintext">$variable = une valeur </code></pre>
2021-05-09 12:42:51 +02:00
<p>&nbsp;</p>
2021-05-09 12:51:47 +02:00
<h2>Le pipeline</h2>
2021-05-09 15:01:51 +02:00
<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>
2021-05-13 08:45:50 +02:00
<p>Exemple :&nbsp;</p>
<pre><code class="language-plaintext">Get-Process | Sort-Object CPU</code></pre>
2021-05-09 19:59:33 +02:00
<p>Dans ce cas précis, la commande <code>Sort-Object</code> tri les processus par utilisation de Cpu</p>
2021-05-09 14:13:42 +02:00
<p>&nbsp;</p>
2021-05-09 14:20:25 +02:00
<h2>L' aide</h2>
2021-05-09 19:59:33 +02:00
<p>Sous PowerShell la commande <code>Get-Help</code> permet d'afficher la fonction et des exemples d'une commande.</p>
2021-05-13 08:45:50 +02:00
<pre><code class="language-plaintext">Get-Help &lt;la commande&gt;</code></pre>
2021-05-09 14:18:16 +02:00
<p>Mais avant d'utiliser cette commande il faut faire une mise à jour de l'aide de PowerShell avec la commande</p>
2021-05-13 08:45:50 +02:00
<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 &lt;la commande&gt; -detailed</code></pre>
2021-05-09 15:05:33 +02:00
<p>On peut aussi lister des exemples d'utilisation d'une commande avec l'option <code>-examples</code></p>
2021-05-13 08:45:50 +02:00
<pre><code class="language-plaintext">Get-Help &lt;la commande&gt; -examples</code></pre>
2021-05-09 19:59:33 +02:00
<p>Il arrive parfois que l'aide renvoyée sous PowerShell ne soit pas complète malgré un <code>Update-Help.</code></p>
2021-05-13 08:45:50 +02:00
<p>Pour cela il y a possibilité d'aller consulter directement l'aide en ligne avec l'option <code>-online</code>&nbsp;</p>
<pre><code class="language-plaintext">Get-Help &lt;la commande&gt; -online</code></pre>
2021-05-09 19:13:44 +02:00
<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>
2021-05-13 08:45:50 +02:00
<p>Par exemple si vous voulez de l'aide sur la syntaxe de commande <code>Get-ChildItem</code>&nbsp;</p>
2021-05-09 19:59:33 +02:00
<pre><code class="language-plaintext">Get-Help Get-ChildItem</code></pre>
2021-05-13 08:45:50 +02:00
<p>On peut constater dans la capture que certains paramètres sont obligatoires.</p>
2021-05-09 15:59:16 +02:00
<figure class="image image_resized" style="width:88.82%;"><img src="/capture4.png"></figure>
2021-05-09 15:41:59 +02:00
<p>&nbsp;</p>
<p>&nbsp;</p>
2021-05-09 19:59:33 +02:00
<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>
2021-05-13 08:45:50 +02:00
<p>Voici ce que renvoie la commande, on peut voir les commandes qui contiennent le mot service.</p>
2021-05-09 15:02:11 +02:00
<figure class="image image_resized" style="width:86.32%;"><img src="/capture1.png"></figure>
2021-05-09 14:13:42 +02:00
<p>&nbsp;</p>
2021-05-09 15:18:19 +02:00
<p>Une autre fonction de l'aide permet d'avoir des informations sur un sujet précis.</p>
2021-05-13 08:45:50 +02:00
<p>Pour lister ces sujets utilisez l'option <code>about_*</code>&nbsp;</p>
2021-05-09 19:59:33 +02:00
<pre><code class="language-plaintext">Get-Help about_*</code></pre>
2021-05-09 19:13:44 +02:00
<p>Par exemple, si vous voulez de l'aide au sujet de pipeline</p>
2021-05-09 19:59:33 +02:00
<pre><code class="language-plaintext">Get-Help about_pipeline</code></pre>
2021-05-13 08:45:50 +02:00
<p>Voici ce que renvoie la commande</p>
2021-05-09 15:59:16 +02:00
<figure class="image image_resized" style="width:84.46%;"><img src="/capture3.png"></figure>
2021-05-09 15:19:21 +02:00
<p>&nbsp;</p>
2021-05-09 16:02:48 +02:00
<h2>Les providers</h2>
2021-05-09 17:30:02 +02:00
<p>Dans PowerShell, &nbsp;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>
2021-05-13 08:45:50 +02:00
<p>Pour lister l'ensemble des providers, on utilise la commande</p>
<pre><code class="language-plaintext">Get-Psdrive</code></pre>
2021-05-09 19:05:40 +02:00
<p>L'avantage c'est que vous pouvez parcourir ces éléments comme si c'était un système de fichiers.</p>
2021-05-09 19:26:09 +02:00
<p>Exemple, si vous voulez parcourir la base de registre machine &nbsp;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>
2021-05-09 19:08:03 +02:00
<figure class="image"><img src="/capture9.png"></figure>
2021-05-13 08:45:50 +02:00
<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>
2021-05-09 18:59:45 +02:00
<figure class="image image_resized" style="width:74.13%;"><img src="/capture6.png"></figure>
2021-05-09 17:30:02 +02:00
<p>&nbsp;</p>
2021-05-14 11:03:10 +02:00
<h2>Récupérer des informations WMI</h2>
2021-05-15 10:49:59 +02:00
<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 etc. il permet en quelques sortes d'interroger l'inventaire matériel et logiciel de votre système.</p>
2021-05-15 10:49:15 +02:00
<p>Il existe deux commandes pour obtenir ces informations, mais on peut également invoquer des méthodes avec celle-ci, par exemple redémarrer un service et je vais vous montrez la différence qu'il peut exister.</p>
2021-05-15 10:50:12 +02:00
<p>Pour finir je vous montrerai une astuce pour “fouiner” dans la liste des requêtes WMI.</p>
2021-05-15 10:48:16 +02:00
<ol>
<li><u>Get-WmiObject :</u> cette commande se base sur du RPC (Remote Procedure Call).</li>
<li><u>Get-CimInstance:</u> cette commande se base sur du WINRM (Windows Remote management).</li>
</ol>
2021-05-09 20:04:22 +02:00
<h1>Création d'un menu sous Powershell</h1>
2021-05-08 17:25:09 +02:00
<p>Voici un exemple de menu qu'il est possible de faire avec la méthode suivante :</p>
2021-05-09 18:59:45 +02:00
<figure class="image image_resized" style="width:58.46%;"><img src="/capture2.png"></figure>
2021-05-08 16:44:35 +02:00
<p>&nbsp;</p>
2021-05-08 17:23:43 +02:00
<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 :&nbsp;</p>
2021-05-14 11:18:44 +02:00
<pre><code class="language-plaintext">While ($continue)
{
2021-05-14 11:19:12 +02:00
&lt;le menu avec des Write-Host&gt;
2021-05-08 17:23:43 +02:00
}</code></pre>
2021-05-08 17:24:34 +02:00
<p>Puis une seconde variable pour stocker mon choix avec <code>$choix = read-host “faire un choix”</code></p>
2021-05-09 19:34:05 +02:00
<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>
2021-05-09 19:59:33 +02:00
<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>
2021-05-08 16:42:09 +02:00
<p>&nbsp;</p>
2021-05-08 17:26:10 +02:00
<h2>Exemple</h2>
2021-05-08 17:23:43 +02:00
<pre><code class="language-plaintext">$continue = $true
2021-05-09 20:35:45 +02:00
while ($continue){
2021-05-08 17:29:48 +02:00
write-host “----------------------MON TITRE -----------------------”
write-host “1. mon action 1”
2021-05-09 16:31:40 +02:00
write-host "2. mon action 2"
2021-05-08 17:29:48 +02:00
write-host "x. exit"
2021-05-14 11:17:45 +02:00
write-host "--------------------------------------------------------"
2021-05-08 17:38:33 +02:00
$choix = read-host “faire un choix :”
2021-05-08 17:29:48 +02:00
switch ($choix){
2021-05-08 17:35:33 +02:00
1{commande de mon action 1}
2{commande de mon action 2}
2021-05-09 20:36:41 +02:00
x’ {$continue = $false}
2021-05-08 17:29:48 +02:00
default {Write-Host "Choix invalide"-ForegroundColor Red}
}
}
</code></pre>
2021-05-08 17:18:22 +02:00
<p>&nbsp;</p>