Qu'est-ce que PowerShell Remoting ?
PowerShell Remoting permet d'exécuter des commandes PowerShell sur des machines distantes via le protocole WS-Management (WinRM). C'est l'outil indispensable pour l'administration à grande échelle d'un parc de serveurs Windows.
Activation de WinRM
# Sur le serveur cible (en administrateur)
Enable-PSRemoting -Force
# Vérifier l'état de l'écoute
Get-WSManInstance -ResourceURI winrm/config/listener -SelectorSet @{Address="*"; Transport="HTTP"}
# Déploiement en masse via GPO :
# Computer Configuration > Administrative Templates > Windows Components
# > Windows Remote Management (WinRM) > WinRM Service
# "Allow remote server management through WinRM" = Enabled
Session interactive : Enter-PSSession
# Ouvrir une session interactive sur un serveur distant
Enter-PSSession -ComputerName SRV-APP01 -Credential (Get-Credential)
# Vous êtes maintenant "dans" le serveur distant
[SRV-APP01]: PS C:> Get-Service | Where-Object Status -eq "Stopped"
[SRV-APP01]: PS C:> Exit-PSSession
Exécution parallèle avec Invoke-Command
# Collecte d'inventaire sur plusieurs serveurs simultanément
$servers = @("SRV-WEB01", "SRV-WEB02", "SRV-APP01", "SRV-DB01")
$results = Invoke-Command -ComputerName $servers -ScriptBlock {
[PSCustomObject]@{
Serveur = $env:COMPUTERNAME
OS = (Get-CimInstance Win32_OperatingSystem).Caption
RAM_Libre = [math]::Round((Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory / 1MB, 2)
Uptime = (Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
CPU_Pct = (Get-CimInstance Win32_Processor).LoadPercentage
}
}
$results | Select-Object Serveur, OS, RAM_Libre, CPU_Pct, Uptime | Format-Table -AutoSize
Sessions persistantes (PSSession)
# Créer des sessions réutilisables (plus performant que de reconnecter à chaque fois)
$sessions = New-PSSession -ComputerName SRV-WEB01, SRV-WEB02, SRV-APP01
# Redémarrer IIS sur toutes les sessions en parallèle
Invoke-Command -Session $sessions -ScriptBlock {
Restart-Service -Name "W3SVC" -Force
Write-Host "[$env:COMPUTERNAME] IIS redémarré"
}
# Nettoyer les sessions
Remove-PSSession -Session $sessions
Cas pratique : Vérification d'un patch sur le parc
$hotfixId = "KB5034441"
$servers = Get-ADComputer -Filter {OperatingSystem -like "*Server*"} | Select-Object -ExpandProperty Name
Invoke-Command -ComputerName $servers -ScriptBlock {
param($kb)
$installed = Get-HotFix -Id $kb -ErrorAction SilentlyContinue
[PSCustomObject]@{
Serveur = $env:COMPUTERNAME
Installé = if ($installed) { "OUI" } else { "NON" }
Date = $installed.InstalledOn
}
} -ArgumentList $hotfixId | Sort-Object Serveur | Format-Table -AutoSize
Sécurité du Remoting
- Utilisez HTTPS pour WinRM en environnement non-domaine
- Implémentez JEA (Just Enough Administration) pour limiter les droits des opérateurs
- Activez l'audit des sessions PowerShell dans votre SIEM
- Appliquez le Constrained Language Mode pour restreindre les capacités des scripts non signés
Conclusion
PowerShell Remoting est un multiplicateur de force pour tout administrateur. Maîtriser Invoke-Command, les sessions persistantes et JEA vous permettra de gérer des centaines de serveurs avec l'efficacité d'un seul opérateur.