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 |
Mon suivi
Connectez-vous pour suivre votre progression et prendre des notes. Se connecter
💬 Questions sur cette leçon
Aucune question pour l'instant : soyez le premier à demander de l'aide ou à partager votre configuration.
Articles recommandés
Windows et Windows Server : versions, éditions et architecture
Découvrir l'écosystème Windows pour l'administrateur : Windows 11 et Windows Server 2025, édition...
Réseau Windows : IP, DNS, DHCP, pare-feu et accès à distance
Configurer et diagnostiquer le réseau sous Windows en PowerShell, déployer un serveur DHCP, maîtr...
Bonnes pratiques d’administration Windows
La check-list de production pour Windows et Windows Server : installation, identité et Active Dir...
Stockage Windows : disques, volumes, Storage Spaces et RAID
Administrer le stockage sous Windows : GPT et MBR, partitions et volumes en PowerShell, NTFS et R...
Mises à jour et sécurité Windows : WSUS, Defender, BitLocker, LAPS et durcissement
Maintenir et sécuriser un parc Windows : stratégie de mises à jour (Windows Update, WSUS, Azure U...
Sauvegarde, Hyper-V et dépannage de Windows
Sauvegarder et restaurer avec Windows Server Backup (y compris l'état du système et Active Direct...
Scripts Bash pour l'administrateur : écrire des scripts robustes
Automatiser l'administration Linux avec Bash : variables et guillemets, conditions, boucles, fonc...
Utilisateurs, groupes, autorisations NTFS et partages SMB
Gérer les comptes et groupes locaux, comprendre UAC, appliquer des autorisations NTFS avec hérita...
Active Directory Domain Services et DNS
Comprendre et déployer Active Directory : forêt, domaines, unités d'organisation, contrôleurs de ...