PowerShell Remoting
PowerShell Remoting (WinRM) permet d'exécuter des commandes sur des machines distantes. Indispensable pour administrer un parc Windows sans RDP.
Activer WinRM
# Sur la machine cible (en admin)
Enable-PSRemoting -Force
# Via GPO en entreprise : politique "Autoriser la gestion à distance via WS-Management"
# Vérifier l'état
Get-Service WinRM
Test-WSMan -ComputerName SRV-FILE01
Session interactive : Enter-PSSession
# Ouvrir une session interactive sur un serveur distant
Enter-PSSession -ComputerName SRV-DC01
# Avec des credentials différents
$cred = Get-Credential
Enter-PSSession -ComputerName SRV-DC01 -Credential $cred
# La ligne de commande indique le serveur distant
[SRV-DC01]: PS C:\Users\Admin\Documents>
# Quitter la session
Exit-PSSession
Exécution distante : Invoke-Command
# Commande sur un seul serveur
Invoke-Command -ComputerName SRV-FILE01 -ScriptBlock {
Get-DiskReport -ComputerName $env:COMPUTERNAME
}
# Commande sur PLUSIEURS serveurs en parallèle
$serveurs = @("SRV-DC01", "SRV-FILE01", "SRV-WEB01")
Invoke-Command -ComputerName $serveurs -ScriptBlock {
[PSCustomObject]@{
Serveur = $env:COMPUTERNAME
Uptime = (Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
RAM_GB = [math]::Round((Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1GB, 1)
}
} | Sort-Object Serveur | Format-Table -AutoSize
# Passer une variable locale dans le ScriptBlock
$seuil = 20
Invoke-Command -ComputerName $serveurs -ArgumentList $seuil -ScriptBlock {
param($SeuilAlerte)
# $SeuilAlerte contient la valeur de $seuil
}
Sessions persistantes
# Créer une session persistante (réutilisable)
$session = New-PSSession -ComputerName SRV-DC01
# Utiliser la session
Invoke-Command -Session $session -ScriptBlock { Get-Process | Select-Object -First 5 }
# Copier un fichier vers le serveur distant
Copy-Item -Path C:\Scripts\MonScript.ps1 -Destination C:\Scripts -ToSession $session
# Fermer et supprimer la session
Remove-PSSession -Session $session
Erreurs fréquentes
- WinRM non activé sur la cible :
Enable-PSRemoting -Forcedoit être exécuté sur CHAQUE machine cible (ou via GPO). - Pare-feu bloquant le port 5985/5986 : WinRM utilise HTTP sur 5985 et HTTPS sur 5986. Vérifier les règles de pare-feu.
- Variables locales dans ScriptBlock : les variables de la session locale ne sont pas automatiquement disponibles dans
Invoke-Command. Utiliser-ArgumentListou$using:variable.
À retenir
Enable-PSRemoting -Forcesur chaque cible (ou GPO).Enter-PSSession= shell interactif distant.Invoke-Command= exécution parallèle sur N machines → très puissant pour les parcs.$using:variableou-ArgumentListpour passer des variables locales.