PowerShell : bases et cas d'usage
Si le terminal Linux est le couteau suisse des administrateurs Linux, PowerShell est son équivalent pour l'écosystème Windows, avec une particularité remarquable : au lieu de manipuler du texte, il manipule des objets. Cette différence le rend à la fois très puissant et plus agréable à apprendre qu'il n'y paraît. Voyons comment démarrer.
Dans la leçon précédente, nous avons vu que les parcs Windows s'administrent à grande échelle. PowerShell est l'outil de cette échelle : il permet d'interroger, de configurer et de vérifier des machines par scripts. C'est aussi un outil largement utilisé, y compris côté sécurité, pour inventorier un poste, collecter des informations ou analyser des journaux.
Lancer PowerShell
Dans le menu Démarrer, tapez « PowerShell » et ouvrez-le (sans droits d'administrateur sauf nécessité). Une version multiplateforme, pwsh, existe aussi pour Linux et macOS. Les exemples de cette leçon fonctionnent dans les deux, sauf mention contraire.
Le principe : des cmdlets qui s'appellent « Verbe-Nom »
Les commandes de PowerShell s'appellent des cmdlets (prononcer « commande-lettes »). Leur nom suit toujours la forme Verbe-Nom : Get-Process (obtenir les processus), Stop-Service (arrêter un service), New-Item (créer un élément). Cette régularité est précieuse : quand vous connaissez les verbes (Get, Set, New, Remove, Start, Stop), vous devinez le nom de beaucoup de commandes. Les recherches et l'aide sont intégrées :
Get-Command *service* # toutes les commandes dont le nom contient « service »
Get-Help Get-Process # aide d'une commande
Get-Help Get-Process -Examples # exemples d'utilisation
Get-Member # (après un pipe) liste des propriétés d'un objet
Prenez l'habitude de lire l'aide avant d'utiliser une cmdlet : c'est la meilleure façon d'apprendre et d'éviter les surprises.
Le pipeline d'objets
Comme dans le terminal Linux, on chaîne les commandes avec le symbole |. Mais ici, ce qui circule n'est pas du texte brut : ce sont des objets qui ont des propriétés (nom, identifiant, taille…) que l'on peut filtrer, trier et sélectionner par leur nom. Un exemple, pour afficher les cinq processus qui consomment le plus de processeur :
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 Name, Id, CPU
Ligne par ligne : Get-Process produit un objet par processus ; Sort-Object CPU -Descending les trie selon leur propriété CPU ; Select-Object -First 5 Name, Id, CPU garde les cinq premiers et ne conserve que trois propriétés. Pas besoin de découper du texte avec awk ou cut : on désigne directement les propriétés.
Les trois cmdlets de base du pipeline :
Where-Objectfiltre les objets selon une condition ;Select-Objectchoisit des propriétés ou un nombre d'éléments ;Sort-Objecttrie.
Get-Service | Where-Object { $_.Status -eq 'Running' } | Select-Object Name, DisplayName
Get-ChildItem C:\Users -Recurse -Filter *.log -ErrorAction SilentlyContinue
Get-Content .\liste.txt | Measure-Object -Line
Dans un bloc { ... }, la variable $_ désigne l'objet courant. Les opérateurs de comparaison s'écrivent avec des tirets : -eq (égal), -ne (différent), -gt (plus grand), -lt (plus petit), -like et -match (motifs de texte).
Quelques cas d'usage concrets
Inventaire d'une machine
Get-ComputerInfo | Select-Object CsName, OsName, OsVersion
Get-LocalUser | Select-Object Name, Enabled, LastLogon
Get-LocalGroupMember -Group "Administrators"
Get-NetTCPConnection -State Listen | Select-Object LocalAddress, LocalPort, OwningProcess
Ces commandes répondent aux questions de base d'un audit : quel système ? quels comptes sont actifs ? qui est administrateur local ? quels services sont à l'écoute ? Ce sont les équivalents de uname, /etc/passwd, sudo -l et ss -tulpn sous Linux.
Exporter un résultat
Get-Service | Select-Object Name, Status, StartType | Export-Csv -Path .\services.csv -NoTypeInformation
Get-Process | ConvertTo-Json | Out-File .\processus.json
On peut sortir un résultat en CSV (pour un tableur), en JSON (pour un autre programme) ou en HTML. Un rapport reproductible s'obtient en quelques lignes.
Interroger Active Directory
Sur une machine où les outils d'administration sont installés (le module Active Directory), on peut interroger l'annuaire du domaine de votre laboratoire :
Get-ADUser -Filter * -Properties LastLogonDate | Select-Object Name, Enabled, LastLogonDate
Get-ADGroupMember -Identity "Administrateurs du domaine" | Select-Object Name
Ces commandes sont celles qu'un administrateur utilise pour repérer des comptes inutilisés ou vérifier la composition d'un groupe sensible.
Chercher dans des fichiers
L'équivalent de grep s'appelle Select-String. Il permet de retrouver un motif dans un ou plusieurs fichiers, et de compter les résultats :
Select-String -Path .\*.log -Pattern "erreur"
(Select-String -Path .\journal.txt -Pattern "Failed").Count
Ces commandes sont pratiques pour dépouiller des journaux texte, par exemple ceux d'un serveur web de votre laboratoire, ou une copie d'un journal Linux. Retenez la logique : on filtre d'abord, on compte ensuite, on exporte à la fin.
Écrire un script PowerShell
Un script PowerShell est un fichier .ps1. Voici un petit script avec une variable, une condition et une boucle :
param([string]$Service = "Spooler")
$etat = Get-Service -Name $Service -ErrorAction SilentlyContinue
if ($null -eq $etat) {
Write-Output "Le service $Service est introuvable."
exit 1
}
if ($etat.Status -eq 'Running') {
Write-Output "Le service $Service est actif."
} else {
Write-Output "Le service $Service est arrêté."
}
foreach ($p in Get-Process | Select-Object -First 3) {
Write-Output ("Processus : " + $p.Name)
}
param(...) déclare un paramètre avec une valeur par défaut. Les variables commencent par $. Write-Output affiche un résultat.
Sécurité de PowerShell : ce qu'il faut savoir
PowerShell est utilisé légitimement par tous les administrateurs, mais sa puissance en fait aussi un outil prisé par des programmes malveillants, justement parce qu'il est déjà présent sur chaque machine. D'où quelques notions de sécurité :
- La politique d'exécution (
Get-ExecutionPolicy) détermine quels scripts peuvent s'exécuter ; elle protège contre les erreurs de manipulation, mais ce n'est pas une frontière de sécurité : elle ne stoppe pas un attaquant déterminé. Ne la considérez pas comme une protection suffisante. - La journalisation : on peut activer (par GPO) l'enregistrement des blocs de script exécutés et des sessions. Ces journaux, que nous verrons à la leçon suivante, sont précieux pour détecter des usages suspects.
- Le mode de langage restreint et le contrôle des applications permettent de limiter ce qu'un utilisateur ordinaire peut faire dans PowerShell.
- Comme toujours : ne lancez jamais un script que vous ne comprenez pas. Un one-liner copié d'un forum et collé tel quel est un classique de l'infection.
Rappel éthique. Les commandes d'inventaire ci-dessus sont des outils d'administration légitimes pour vos propres machines. Les exécuter sur des machines ou un domaine qui ne sont pas les vôtres, sans autorisation écrite, relève de l'accès non autorisé à un système (articles 323-1 et suivants du Code pénal).
À vous de jouer
- Ouvrez PowerShell. Affichez l'aide de
Get-Serviceavec ses exemples. - Affichez les 5 services en cours d'exécution dont le nom commence par « W » (indice :
-like "W*"). - Listez les utilisateurs locaux de votre machine avec leur état (activé ou non).
- Exportez dans un fichier CSV la liste des ports TCP à l'écoute avec le nom du processus correspondant.
Voir une solution
# 1
Get-Help Get-Service -Examples
# 2
Get-Service | Where-Object { $_.Status -eq 'Running' -and $_.Name -like 'W*' } | Select-Object -First 5 Name, DisplayName
# 3
Get-LocalUser | Select-Object Name, Enabled
# 4
Get-NetTCPConnection -State Listen |
Select-Object LocalAddress, LocalPort,
@{Name='Processus'; Expression={ (Get-Process -Id $_.OwningProcess).Name }} |
Export-Csv -Path .\ports-ecoute.csv -NoTypeInformation
Dans la solution 4, l'expression entre accolades calcule une colonne supplémentaire : elle retrouve le nom du processus à partir de son identifiant. Si une commande renvoie une erreur de droits, relancez PowerShell en tant qu'administrateur pour cette consultation seulement.
À retenir
- PowerShell manipule des objets, pas du texte ; ses cmdlets suivent la forme Verbe-Nom (
Get-Process,Stop-Service). - Le pipeline s'appuie sur
Where-Object,Select-ObjectetSort-Object;Get-Help,Get-CommandetGet-Memberpermettent de s'orienter. - Usages courants : inventaire d'une machine, exports CSV/JSON, interrogation d'Active Directory, automatisation par scripts
.ps1. - La politique d'exécution n'est pas une frontière de sécurité ; la journalisation de PowerShell est un outil de détection.
- On ne lance jamais un script ou une commande qu'on ne comprend pas ; on reste dans son périmètre.
Vous savez interroger Windows. Pour terminer ce chapitre, apprenons à lire ce que Windows, lui, enregistre sur ce qui s'est passé : ses journaux d'événements.