RousselTMLEARNING

Systèmes & Linux

PowerShell pour l’administrateur Windows

Maîtriser PowerShell pour administrer Windows : cmdlets et aide, pipeline d'objets, filtres et formats, variables, scripts, modules, gestion des erreurs, administration à distance et politique d'exécution.

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.PSVersion

Les 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 historiques
Bonne pratique : Retenez trois commandes : Get-Command pour trouver, Get-Help -Examples pour apprendre, Get-Member pour 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 #

Pipeline PowerShell

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 : Placer Format-Table ou Format-List au milieu d'un pipeline : ces cmdlets produisent des objets d'affichage, inutilisables par la suite. Mettez-les toujours en dernier, ou utilisez Select-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 : SupportsShouldProcess donne gratuitement au script les options -WhatIf (simulation) et -Confirm. $ErrorActionPreference = 'Stop' transforme les erreurs en exceptions que try/catch intercepte.

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, Version
Erreur 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-Command exécute le bloc en parallèle sur tous les serveurs et renvoie des objets étiquetés par PSComputerName : c'est la base des inventaires et des opérations de masse.

Commandes à connaître #

ActionCommande
Trouver une commandeGet-Command -Noun *Disk*
Exemples d’aideGet-Help Get-ChildItem -Examples
Explorer un objetGet-Process | Get-Member
Filtrer et trierGet-Service | Where-Object Status -eq 'Stopped' | Sort-Object Name
Exporter en CSVGet-LocalUser | Export-Csv users.csv -NoTypeInformation
Exécuter à distanceInvoke-Command -ComputerName SRV01 -ScriptBlock { hostname }
Simuler une actionRemove-Item C:\Temp\* -Recurse -WhatIf
HistoriqueGet-History ; Invoke-History 12

Articles liés

Windows et Windows Server : versions, éditions et architecture

Découvrir l'écosystème Windows pour l'administrateur : Windows 11 et Windows Server 2025, éditions et cycle d…

Utilisateurs, groupes, autorisations NTFS et partages SMB

Gérer les comptes et groupes locaux, comprendre UAC, appliquer des autorisations NTFS avec héritage, créer de…

Active Directory Domain Services et DNS

Comprendre et déployer Active Directory : forêt, domaines, unités d'organisation, contrôleurs de domaine, rôl…

Pour aller plus loin

Soutenir

♥ SOUTENIR

Soutenez RousselTM Learning

Les formations, articles, TP et attestations restent gratuits et sans publicité intrusive. Une contribution libre, du montant de votre choix, finance l’hébergement, les environnements de TP et l’écriture de nouveaux contenus.

Contribuer avec PayPal Montant libre · carte bancaire ou compte PayPalEn savoir plus
QR code PayPal
Ou scannez ce QR code avec votre téléphone

Merci, chaque contribution compte !