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
Stratégies de groupe (GPO) : configurer le parc depuis Active Directory
Concevoir et dépanner les stratégies de groupe : configuration ordinateur et utilisateur, liaison...
Services, tâches planifiées, journaux d’événements et performances
Piloter les services Windows et leur récupération, automatiser avec le planificateur de tâches, e...
Préparer la certification Azure Administrator Associate (AZ-104)
Guide de préparation à l'AZ-104 : format, cinq domaines (identités et gouvernance, stockage, calc...
Bonnes pratiques d'administration Linux
Check-list pour administrer des serveurs Linux : comptes et sudo, SSH, mises à jour, services sys...
Ansible : les commandes Ad-Hoc
Exécuter des actions immédiates sur un parc de serveurs avec ansible : modules ping, command, she...
Comprendre Azure : régions, hiérarchie des ressources, outils et tarification
Les bases de Microsoft Azure : géographies, régions, paires de régions et zones de disponibilité,...
Stockage sous Linux : disques, partitions, systèmes de fichiers et LVM
Administrer le stockage Linux : lsblk et blkid, partitionnement GPT, ext4 et XFS, montage et /etc...
Réseau sous Linux : configuration, diagnostic, pare-feu et SSH
Configurer et dépanner le réseau Linux : ip, ss, netplan et NetworkManager, DNS, diagnostic par c...
Installer Fleet Server et enrôler des Elastic Agent
Mettre en place Fleet Server, créer une politique, enrôler des agents Linux, Windows et Docker, c...