PowerShell
PowerShell Remoting : Administrer plusieurs serveurs simultanément

PowerShell Remoting : Administrer plusieurs serveurs simultanément

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.

MAKHZOUM Hussein
Auteur
MAKHZOUM Hussein
Consultant Cloud & Infrastructure Engineer
Voir le profil

Articles similaires