Pourquoi centraliser les mises à jour avec WSUS ?
Sans WSUS, chaque machine télécharge ses mises à jour directement depuis Microsoft Update : charge réseau élevée, absence de contrôle sur les versions déployées et risque de mise à jour cassant une application critique. WSUS résout ces trois problèmes.
1. Installation du rôle WSUS
# Installer WSUS avec base WID (Windows Internal Database) sur D:WSUS
Install-WindowsFeature -Name UpdateServices, UpdateServices-UI `
-IncludeManagementTools
# Configurer le répertoire de stockage des mises à jour
& "C:Program FilesUpdate ServicesToolswsusutil.exe" postinstall `
CONTENT_DIR="D:WSUSUpdateServicesPackages"
2. Configuration initiale via PowerShell
# Se connecter au serveur WSUS
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer("SRV-WSUS01", $false, 8530)
# Configurer la synchronisation depuis Microsoft Update
$config = $wsus.GetConfiguration()
$config.ProxyName = "" # Laisser vide si pas de proxy
$config.SyncFromMicrosoftUpdate = $true
$config.Save()
# Ajouter les langues et produits à synchroniser
$sub = $wsus.GetSubscription()
$sub.StartSynchronizationForCategoryOnly() # Synchronisation catalogues d'abord
# Attendre la fin
do {
Start-Sleep -Seconds 15
$progress = $sub.GetSynchronizationProgress()
Write-Host "Phase : $($progress.Phase) — $($progress.ProcessedItems)/$($progress.TotalItems)"
} while ($progress.Phase -ne [Microsoft.UpdateServices.Administration.SynchronizationPhase]::Idle)
3. Structure des groupes d'ordinateurs recommandée
| Groupe WSUS | Contenu | Délai de déploiement |
|---|---|---|
| Test-Pilots | 5 machines représentatives | J+0 (immédiat) |
| Postes-Préproduction | Postes utilisateurs —lab | J+7 |
| Postes-Production | Tous les postes | J+14 |
| Serveurs-NonCritiques | Serveurs secondaires | J+14 (nuit) |
| Serveurs-Critiques | DCs, Exchange, SQL | J+21 (maintenance window) |
4. Affecter les machines aux groupes via GPO
# GPO : Computer Configuration > Administrative Templates
# > Windows Components > Windows Update > Manage end-user experience
# "Specify intranet Microsoft update service location"
# → Valeur : http://SRV-WSUS01:8530
# "Enable client-side targeting"
# → Valeur : Postes-Production (ou le nom du groupe WSUS)
5. Approbation automatique et règles
# Créer une règle d'approbation automatique pour les mises à jour critiques
# (sur le groupe Test-Pilots après synchronisation)
$rule = $wsus.CreateInstallApprovalRule("Auto-Critical-Pilot")
$rule.Enabled = $true
$cats = $wsus.GetUpdateClassifications()
$critClassId = ($cats | Where-Object { $_.Title -eq "Critical Updates" }).Id
$secClassId = ($cats | Where-Object { $_.Title -eq "Security Updates" }).Id
$rule.SetUpdateClassifications($cats | Where-Object { $_.Id -in $critClassId, $secClassId })
$pilotGroup = $wsus.GetComputerTargetGroups() | Where-Object { $_.Name -eq "Test-Pilots" }
$rule.SetComputerTargetGroups($pilotGroup)
$rule.Save()
6. Maintenance et nettoyage WSUS
# Lancer le nettoyage WSUS (planifier mensuellement)
$cleanup = $wsus.GetCleanupManager()
$scope = New-Object Microsoft.UpdateServices.Administration.CleanupScope
$scope.CleanupObsoleteUpdates = $true
$scope.CleanupUnneededContentFiles = $true
$scope.CompressUpdates = $true
$scope.CleanupObsoleteComputers = $true
$scope.DeclineExpiredUpdates = $true
$scope.DeclineSupersededUpdates = $true
$result = $cleanup.PerformCleanup($scope)
Write-Host "Espace libéré : $([math]::Round($result.DiskSpaceFreed / 1GB, 2)) Go"
Write-Host "Mises à jour expirées déclinées : $($result.ExpiredUpdatesDeclined)"
Write-Host "Mises à jour remplacées déclinées : $($result.SupersededUpdatesDeclined)"
7. Rapport de conformité mensuel
# Générer un rapport de conformité (% machines à jour)
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer("SRV-WSUS01", $false, 8530)
$scope = New-Object Microsoft.UpdateServices.Administration.ComputerTargetScope
$computers = $wsus.GetComputerTargets($scope)
$total = $computers.Count
$upToDate = ($computers | Where-Object { $_.GetUpdateInstallationInfoForComputerTarget(
(New-Object Microsoft.UpdateServices.Administration.UpdateScope)
).FailedCritical -eq 0 }).Count
$pct = [math]::Round($upToDate / $total * 100, 1)
Write-Host "Conformité du parc : $pct% ($upToDate/$total machines sans mise à jour critique manquante)"
Conclusion
WSUS bien configuré avec des groupes progressifs et des règles d'approbation automatique vous permet de maintenir votre parc à jour de façon maîtrisée, en préservant les fenêtres de maintenance des systèmes critiques. Couplé à Azure Update Manager, vous unifiez la gestion des mises à jour cloud et on-premises.