PowerShell est un shell en ligne de commande et un langage de scripting orienté objets développé par Microsoft.

Contrairement au Batch (le shell historique de Windows), Powershell manipule des objets, pas juste du texte.
Il sert à exécuter des commandes, automatiser des tâches, administrer des systèmes (Windows, Windows Server).

Il existe en 2 version :
Windows Powershell -> version originale
PowerShell (core) -> version moderne et multiplateforme (Windows, Linux, MacOS)

Les commandes PowerShell s’appellent : cmdlet.

Copy

Copier un ou plusieurs fichiers à un emplacement spécifique.

PowerShell
Copy-Item C:\Folder1\Data.txt -Destination C:\Folder2

Copier le contenu d’un dossier à un emplacement spécifique.

PowerShell
Copy-Item C:\Folder1\*.* -Destination C:\Folder2

Copier un dossier de manière récursive.

PowerShell
Copy-Item C:\Folder1 -Destination C:\Folder2 -Recurse

Set-ExecutionPolicy

La commande Set-ExecutionPolicy sert à définir le niveau de sécurité pour l’exécution des scripts en « .ps1 ».

Exemple (user mod) : pour connaître la politique d’exécution actuelle, utilisez la commande suivante :

PowerShell
Get-ExecutionPolicy

Output :

Le code de sortie indique « Restricted« , ce qui signifie que cette politique est au niveau le plus restrictif, seules les commandes tapées manuellement dans la console fonctionne.

Exemple 2 en tapant cette même commande en administrateur :

Le code de sortie est le même, que la cmdlet soit lancée en utilisateur (user) ou administrateur.

La cmdlet Set-ExecutionPolicy permet de modifier la politique d’exécution en indiquant la politique d’exécution souhaitée.

Les noms des politiques d’exécution sont :
– AllSigned = tous les scripts doivent être signés (locaux ou distants)
– Bypass = aucune restriction ni avertissement
– Default = applique la configuration par défaut de Windows
– RemoteSigned = scripts locaux autorisés, scripts téléchargés doivent être signés
– Restricted = aucun script autorisé
– Undefined = aucune politique définie à ce niveau
– Unrestricted = tous scripts autorisés avec avertissement

PowerShell
Set-ExecutionPolicy Unrestricted

Cette opération nécessite que le script soit exécuté dans un contexte élevé (en tant qu’administrateur) et ne renvoie aucune commande de sortie (Output).

Get-History

La cmdlet Get-History permet de récupérer une liste des commandes qui ont été saisies dans la session en cours.

PowerShell
Get-History


Output :

Get-WUHistory

La cmdlet Get-WUHistory permet de récupérer une liste des mises à jour Windows installées sur le système.
Pour l’utiliser, il faudra installer le module suivant :

PowerShell
Install-Module -Name PSWindowsUpdate -Force

Suite à ça, la commande suivante vous permettra de récupérer un ensemble de mise à jour installées sur le système sous forme de grille.
Très pratique pour réutiliser les donner dans un fichier Excel par exemple :

PowerShell
Get-WUHistory | Sort-Object kb, Date, Title | Where-Object {$_.kb -ne ""} | Out-GridView

Pour avoir un résultat sur les 31 jours :

PowerShell
Get-WUHistory -MaxDate $((Get-Date).AddDays(-31)) | Out-GridView

Pour cibler une KB particulière :

PowerShell
Get-WUHistory | Where-Object { $_.KB -eq "KB5035853" }

Créer des rapports HTML

Il peut être très intéressant de créer des rapports sous forme de tableaux lisibles via navigateur.
L’une des commandes qui est native à Powershell pour créer un rapport HTML est :

PowerShell
ConvertTo-HTML

Mais, bien qu’elle soit pratique, l’affichage est trop simpliste.
Nous allons nous concentrer sur « PSWriteHTML », un module qui, en plus de créer des rapports HTML, va nous permettre de les rendre interactifs en effectuant une recherche, un filtre, etc.

A noter qu’il y a plus de 200 cmdlets Powershell dans ce module…

Commençons par le télécharger :

PowerShell
Install-Module -Name PSWriteHTML


Une fois téléchargé, nous allons donc essayer de créer un rapport en utilisant la commande « Get-Process » afin d’afficher tous les processus en cours d’exécution sur le système.

PowerShell
New-HTML -Title "Rapport PowerShell" -FilePath "C:\Scripts\HTML\Rapport.html" {
>>     New-HTMLSection -HeaderText "Liste des processus" {
>>         New-HTMLTable -DataTable (Get-Process)
>>     }
>> }

Voilà ce que ça donne :