1. Les bases #
Cmdlets, aide et découverte.
Deux PowerShell #
Windows intègre Windows PowerShell 5.1, figé mais toujours présent. PowerShell 7 est la version moderne, multiplateforme (Windows, Linux, macOS), installée à côté (pwsh.exe). La plupart des modules d'administration fonctionnent avec les deux ; utilisez PowerShell 7 pour les nouveaux scripts et 5.1 quand un ancien module l'exige.
winget install --id Microsoft.PowerShell --source winget # installer PowerShell 7
$PSVersionTable.PSVersionLes commandes (cmdlets) suivent la forme Verbe-Nom : Get-Process, Stop-Service, New-LocalUser. Les verbes sont normalisés (Get-Verb) : on devine donc facilement le nom d'une commande.
Trouver et comprendre une commande #
Get-Command -Noun *Service* # toutes les commandes sur les services
Get-Command -Module NetTCPIP # les commandes d'un module
Update-Help -UICulture en-US # télécharger l'aide (en administrateur)
Get-Help Get-Service -Examples # exemples d'utilisation
Get-Service | Get-Member # propriétés et méthodes des objets renvoyés
Get-Alias ls, dir, gci # alias historiquesBonne pratique : Retenez trois commandes :Get-Commandpour trouver,Get-Help -Examplespour apprendre,Get-Memberpour voir ce que contient un objet. Dans un script, écrivez le nom complet des cmdlets et non leurs alias.
2. Le pipeline d'objets #
La grande différence avec les shells Unix.
Filtrer, trier, choisir #
Le pipeline transmet des objets avec leurs propriétés, pas des lignes de texte : inutile de découper des colonnes. On filtre sur une propriété, on trie, on choisit les colonnes, puis on exporte.
Get-Service | Where-Object Status -eq 'Running' | Sort-Object DisplayName |
Select-Object Name, DisplayName, StartType | Export-Csv C:\rapports\services.csv -NoTypeInformation -Encoding UTF8
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 Name, Id, CPU, WS
Get-ChildItem C:\Logs -Recurse -File | Where-Object LastWriteTime -lt (Get-Date).AddDays(-30) |
Measure-Object -Property Length -Sum # volume des fichiers de plus de 30 jours
Get-EventLog -List | Format-Table -AutoSize # affichage en tableau (toujours en fin de pipeline)Erreur courante : PlacerFormat-TableouFormat-Listau milieu d'un pipeline : ces cmdlets produisent des objets d'affichage, inutilisables par la suite. Mettez-les toujours en dernier, ou utilisezSelect-Object.
Variables, tableaux et chaînes #
$serveurs = 'SRV-DC01', 'SRV-FS01', 'SRV-WEB01' # tableau
$cfg = @{ Partage = 'D:\Data'; Quota = 10GB } # table de hachage
"Il y a $($serveurs.Count) serveurs, quota : $($cfg.Quota / 1GB) Go"
foreach ($s in $serveurs) { Test-Connection $s -Count 1 -Quiet }
$serveurs | ForEach-Object { "Serveur : $_" } # $_ = objet courant
Get-Content .\serveurs.txt | Where-Object { $_ -match '^SRV-' }3. Scripts, modules et erreurs #
Passer de la console à l'automatisation.
Un script robuste #
# Nettoyer-Logs.ps1 : supprime les journaux plus anciens que N jours
[CmdletBinding(SupportsShouldProcess)]
param(
[Parameter(Mandatory)][ValidateScript({ Test-Path $_ })][string]$Dossier,
[ValidateRange(1, 365)][int]$Jours = 30
)
$ErrorActionPreference = 'Stop'
try {
$limite = (Get-Date).AddDays(-$Jours)
$fichiers = Get-ChildItem $Dossier -Filter *.log -File | Where-Object LastWriteTime -lt $limite
foreach ($f in $fichiers) {
if ($PSCmdlet.ShouldProcess($f.FullName, 'Supprimer')) { Remove-Item $f.FullName }
}
Write-Output "$($fichiers.Count) fichier(s) traité(s)"
} catch {
Write-Error "Échec : $($_.Exception.Message)"
exit 1
}.\Nettoyer-Logs.ps1 -Dossier C:\Logs -Jours 15 -WhatIf # simulation
.\Nettoyer-Logs.ps1 -Dossier C:\Logs -Jours 15 -VerboseÀ savoir :SupportsShouldProcessdonne gratuitement au script les options-WhatIf(simulation) et-Confirm.$ErrorActionPreference = 'Stop'transforme les erreurs en exceptions quetry/catchintercepte.
Politique d’exécution et modules #
Get-ExecutionPolicy -List
Set-ExecutionPolicy RemoteSigned -Scope LocalMachine # scripts locaux autorisés, scripts téléchargés signés
Unblock-File .\script.ps1 # débloquer un script téléchargé et relu
Find-Module PSWindowsUpdate ; Install-Module PSWindowsUpdate -Scope AllUsers
Get-Module -ListAvailable | Select-Object Name, VersionErreur courante : Croire que la politique d'exécution est une protection de sécurité. Elle évite surtout de lancer un script par erreur ; un utilisateur peut la contourner. Pour sécuriser, signez vos scripts, limitez les droits et utilisez AppLocker ou WDAC.
4. L'administration à distance #
Un serveur ou cent à la fois.
WinRM et PowerShell Remoting #
PowerShell Remoting passe par WinRM (ports 5985 en HTTP chiffré par Kerberos, 5986 en HTTPS). Il est activé par défaut sur Windows Server ; sur un poste, on lance Enable-PSRemoting. PowerShell 7 sait aussi passer par SSH.
Enter-PSSession -ComputerName SRV-FS01 # session interactive (exit pour sortir)
Invoke-Command -ComputerName SRV-FS01, SRV-WEB01 -ScriptBlock {
Get-PSDrive C | Select-Object @{n='Libre(Go)'; e={[math]::Round($_.Free/1GB,1)}}
}
$s = New-PSSession -ComputerName (Get-Content .\serveurs.txt) # sessions réutilisables
Invoke-Command -Session $s -FilePath .\Inventaire.ps1
Copy-Item .\outil.zip -Destination C:\Temp -ToSession $s[0]Bonne pratique :Invoke-Commandexécute le bloc en parallèle sur tous les serveurs et renvoie des objets étiquetés parPSComputerName: c'est la base des inventaires et des opérations de masse.
Commandes à connaître #
| Action | Commande |
|---|---|
| Trouver une commande | Get-Command -Noun *Disk* |
| Exemples d’aide | Get-Help Get-ChildItem -Examples |
| Explorer un objet | Get-Process | Get-Member |
| Filtrer et trier | Get-Service | Where-Object Status -eq 'Stopped' | Sort-Object Name |
| Exporter en CSV | Get-LocalUser | Export-Csv users.csv -NoTypeInformation |
| Exécuter à distance | Invoke-Command -ComputerName SRV01 -ScriptBlock { hostname } |
| Simuler une action | Remove-Item C:\Temp\* -Recurse -WhatIf |
| Historique | Get-History ; Invoke-History 12 |
