Après l’installation de KB5046616 ou du correctif de repli KB5044281 sur Windows Server 2022 (22H2), le service Windows Update (wuauserv) repasse de « Désactivé » à « Manuel », y compris hors domaine. Voici pourquoi, comment le vérifier et comment reprendre durablement le contrôle sans exposer vos serveurs.
Contexte et symptômes observés
Plusieurs administrateurs constatent qu’immédiatement après l’application des mises à jour cumulatives KB5046616/KB5044281, l’état de démarrage du service wuauserv
est modifié. Le comportement est reproductible sur des hôtes isolés (workgroup) comme dans des environnements Active Directory, ce qui élimine l’hypothèse d’une GPO mal configurée.
Ce que vous voyez côté système
- Services.msc indique Type de démarrage : Manuel pour Windows Update, alors qu’il était Désactivé avant patch.
sc qc wuauserv
renvoieSTART_TYPE : DEMAND_START
(demande = manuel).Get-Service wuauserv
afficheStartType : Manual
.- Dans le journal Système, l’Event ID 7040 du Service Control Manager peut indiquer « Le type de démarrage du service a été modifié de désactivé à démarrage à la demande ».
Pourquoi ce changement se produit
Microsoft n’a pas officiellement déclaré de bogue à propos de KB5046616/KB5044281 concernant l’état de wuauserv
. En pratique, plusieurs composants de maintenance (par exemple les routines de réparation de la pile de maintenance, Windows Update Medic Service, ou l’orchestrateur de mise à jour UsoSvc
) peuvent réactiver ou assouplir l’état de services essentiels afin d’assurer la continuité des mises à jour de sécurité. Cela évite qu’un appareil reste bloqué hors patch, ce qui compromettrait l’intégrité de la plateforme.
À retenir : ce comportement est intentionnel côté système ; ce n’est pas un indicateur d’infection ou d’ingérence GPO tant qu’aucune stratégie ne force explicitement un autre état.
Diagnostic : écarter une cause GPO ou un outil tiers
Avant de corriger, démontrez que la bascule ne vient pas d’une stratégie ou d’un agent tiers :
- Exécutez
gpresult /h C:\Temp\gp.html
et ouvrez le rapport : aucune préférence Services ne doit cibler Windows Update. - Dans Observateur d’événements, vérifiez la chronologie des événements GroupPolicy autour de l’heure du patch. Si le 7040 précède toute actualisation de stratégie, la source est locale au système.
- Listez les agents susceptibles d’imposer une configuration (RMM, solutions d’ITSM, DSC, Azure Guest Configuration). Désactivez temporairement leur application de politique pour isoler le test.
Stratégies de maîtrise du comportement
Selon votre politique de sécurité et vos contraintes de conformité, choisissez une des approches ci‑dessous (elles peuvent être combinées) :
Objectif | Méthode | Points clés |
---|---|---|
Laisser le service désactivé en permanence | • Réappliquer Disabled après chaque patch (services.msc ou sc config wuauserv start= disabled ).• Automatiser via script PowerShell exécuté en tâche au démarrage (post‑redémarrage). | Nécessite une surveillance ; toute nouvelle cumulative peut réactiver le service. |
Renforcer la désactivation par GPO | GPO : Computer Configuration → Preferences → Control Panel Settings → Services → cibler Windows Update (wuauserv ) → Startup = Disabled, Action = Replace. | La GPO est réappliquée périodiquement et remplace les modifications locales non désirées. |
Empêcher les téléchargements tout en laissant le service activé | Stratégie Configurer les mises à jour automatiques : Désactivé, ou 2 – Notifier pour le téléchargement et l’installation (ou 3 – Télécharger automatiquement et notifier). | Réduit l’exposition tout en préservant la présence du service pour les rôles qui l’exigent (WSUS, Azure ARC, supervision). |
Blocage par pare‑feu / source locale | • Restreindre l’accès HTTP/HTTPS du processus svchost.exe lié à wuauserv .• Orienter le client vers un WSUS interne sans approbation (les paquets ne seront pas proposés tant que non validés). | Approche « fail‑safe » : le service reste actif mais ne peut pas récupérer de correctifs externes sans feu vert de l’admin. |
Procédures détaillées
Option A : réappliquer « Disabled » localement (manuel ou automatisé)
Vérifier l’état courant
Get-Service wuauserv | Select-Object Name, Status, StartType
sc qc wuauserv
Basculer en « Disabled » et arrêter le service
# PowerShell
Stop-Service -Name wuauserv -Force -ErrorAction SilentlyContinue
Set-Service -Name wuauserv -StartupType Disabled
# Équivalent SC.exe (Cmd)
sc stop wuauserv
sc config wuauserv start= disabled
Automatiser après patch/redémarrage via une tâche planifiée (SYSTEM)
Créez un script idempotent qui exécute les actions au démarrage, journalise l’opération et se contente d’ignorer si l’état souhaité est déjà en place.
# C:\ProgramData\Update-Lock\Enforcer.ps1
$ErrorActionPreference = 'Stop'
$logDir = 'C:\ProgramData\Update-Lock'
$log = Join-Path $logDir 'enforcer.log'
New-Item -ItemType Directory -Path $logDir -Force | Out-Null
function Set-ServiceDisabled {
param([string]$Name)
try {
$svc = Get-Service -Name $Name -ErrorAction Stop
if ($svc.Status -ne 'Stopped') {
Stop-Service -Name $Name -Force -ErrorAction SilentlyContinue
Start-Sleep -Seconds 2
}
if ($svc.StartType -ne 'Disabled') {
Set-Service -Name $Name -StartupType Disabled
}
"{0:u} - {1} forcé à Disabled/Stopped" -f (Get-Date), $Name | Out-File -FilePath $log -Append -Encoding UTF8
} catch {
"{0:u} - ERREUR {1}: {2}" -f (Get-Date), $Name, $_ | Out-File -FilePath $log -Append -Encoding UTF8
}
}
# Cible principale : wuauserv
Set-ServiceDisabled -Name 'wuauserv'
# Optionnel : éviter les réactivations par l’orchestrateur (prudence)
# Set-ServiceDisabled -Name 'UsoSvc' # Orchestrator
# Set-ServiceDisabled -Name 'WaaSMedicSvc' # Medic (non recommandé en production)
# Journal d’événement applicatif
if (-not [System.Diagnostics.EventLog]::SourceExists('Update-Lock')) {
New-EventLog -LogName Application -Source 'Update-Lock'
}
Write-EventLog -LogName Application -Source 'Update-Lock' -EntryType Information -EventId 5001 -Message 'wuauserv verrouillé à Disabled'
Enregistrez ensuite une tâche planifiée exécutée en SYSTEM au démarrage :
$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-NoProfile -ExecutionPolicy Bypass -File "C:\ProgramData\Update-Lock\Enforcer.ps1"'
$trigger = New-ScheduledTaskTrigger -AtStartup
$principal = New-ScheduledTaskPrincipal -UserId 'NT AUTHORITY\SYSTEM' -LogonType ServiceAccount -RunLevel Highest
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -MultipleInstances IgnoreNew -ExecutionTimeLimit (New-TimeSpan -Minutes 5)
Register-ScheduledTask -TaskName 'Lock-WindowsUpdate-Service' -TaskPath '\Hardening' `
-Action $action -Trigger $trigger -Principal $principal -Settings $settings -Force
Bonnes pratiques : conservez le script dans C:\ProgramData
, activez un transcript PowerShell si besoin, et surveillez l’Event ID 5001 personnalisé ci‑dessus pour l’audit.
Option B : forcer l’état par GPO (Services → Replace)
- Dans la console Group Policy Management, créez/modifiez une GPO liée à l’OU des serveurs concernés.
- Accédez à Computer Configuration → Preferences → Control Panel Settings → Services.
- New → Service et choisissez : Service Name :
wuauserv
(Windows Update). Action : Replace. Startup : Disabled. Service Action : Stop service. - Filtrez la GPO (WMI/Groupes) si seulement certains rôles sont concernés.
gpupdate /force
puis vérifiez avecsc qc wuauserv
.
Pourquoi « Replace » et pas « Update » ? Replace réapplique la configuration à chaque rafraîchissement, écrasant toute modification locale ; Update laisse plus de latitude au système pour s’écarter de la consigne.
Option C : garder le service actif mais neutraliser l’automatisation
Si des outils (WSUS, Azure ARC, solutions de patch management) exigent la présence de wuauserv
, on privilégie l’option de « non‑auto‑mise‑à‑jour » :
- Configurer les mises à jour automatiques : réglez la stratégie sur Désactivé (aucune mise à jour automatique), ou sur 2 – Notifier pour le téléchargement et l’installation (l’admin décide), voire 3 – Télécharger automatiquement et notifier (pas d’installation silencieuse). Évitez 4 – Planifier l’installation si votre objectif est le contrôle manuel.
- Activez Ne pas se connecter aux emplacements de mise à jour Microsoft sur Internet pour contraindre l’usage d’une source approuvée.
- Dirigez le poste vers un WSUS interne : Spécifier l’emplacement intranet du service de mise à jour Microsoft (ex.
http(s)://srv-wsus:8530
). Vous gardez la main sur l’approbation des correctifs.
Option D : bloquer côté réseau (pare‑feu)
Pour une posture « zéro surprise », maintenez le service présent mais sans sortie réseau vers les endpoints publics :
# Exemple : règle de pare-feu bloquant wuauserv (par service)
New-NetFirewallRule -DisplayName "Block Windows Update (wuauserv)" `
-Direction Outbound -Action Block -Program "%SystemRoot%\System32\svchost.exe" `
-Service wuauserv -Profile Any
# Variante : n'autoriser que le WSUS interne
New-NetFirewallRule -DisplayName "Allow WSUS" -Direction Outbound -Action Allow ` -Program "%SystemRoot%\System32\svchost.exe" -Service wuauserv -RemoteAddress 10.0.0.20`
-RemotePort 8530 -Protocol TCP -Profile Any
Astuce : préférez les règles par service plutôt que par nom DNS, plus robustes en cas de changements côté Microsoft. Testez systématiquement via bitsadmin
ou Invoke-WebRequest
avec un proxy simulé.
Contrôles, validation et surveillance
Check-list après Patch Tuesday
- Confirmer l’état de
wuauserv
(Disabled si tel est le choix) :Get-Service wuauserv
. - Vérifier les journaux : Event ID 7040 (Service Control Manager), Event ID 19/20 (WindowsUpdateClient/Operational) pour l’installation/détection.
- Tester un redémarrage contrôlé et s’assurer que la tâche planifiée remet l’état voulu.
- Exécuter un scan d’intégrité
DISM /Online /Cleanup-Image /ScanHealth
si des composants ont été réparés.
Audit multi‑serveurs (exemples PowerShell)
# Liste des serveurs et état du service
$servers = Get-Content .\servers.txt
Invoke-Command -ComputerName $servers -ScriptBlock {
[PSCustomObject]@{
ComputerName = $env:COMPUTERNAME
Wuauserv = (Get-Service wuauserv).StartType
UsoSvc = (Get-Service UsoSvc -ErrorAction SilentlyContinue).StartType
Medic = (Get-Service WaaSMedicSvc -ErrorAction SilentlyContinue).StartType
}
} | Format-Table -AutoSize
# Détecter si KB5046616 / KB5044281 est présent
Invoke-Command -ComputerName $servers -ScriptBlock {
$kbs = Get-HotFix | Where-Object {$_.HotFixID -in @('KB5046616','KB5044281')}
[PSCustomObject]@{
ComputerName = $env:COMPUTERNAME
KBPresent = ($kbs -ne $null)
KBs = ($kbs.HotFixID -join ',')
}
}
Points d’attention et mises en garde
- Risque sécurité : désactiver durablement Windows Update accroît l’exposition. Si vous bloquez, compensez par un processus de patch management strict (fenêtre de maintenance, tests, rattrapage).
- Support éditeur : certains contrats exigent que le service reste activable. Documentez l’écart et la raison d’être (ex. application critique, cluster sensible).
- Rôles dépendants : WSUS, Configuration Manager, Azure Update Management, agents RMM ou des agents vulnérabilité peuvent requérir
wuauserv
. Privilégiez alors l’option C ou D. - Services connexes : ne désactivez pas
WaaSMedicSvc
ouUsoSvc
sans validation ; cela peut compliquer des scénarios de réparation. Si vous devez le faire, tenez un runbook clair.
FAQ rapide
Q : Pourquoi le service repasse‑t‑il à « Manuel » même hors domaine ?
R : Les mises à jour critiques incluent des routines de réparation qui réinitialisent certains services de maintenance afin d’assurer la réception des futurs correctifs.
Q : Est‑ce dangereux de laisser « Manuel » ?
R : Non, pas en soi. « Manuel » signifie que le service peut être démarré à la demande par le système. Le véritable risque vient des paramètres de stratégie (téléchargement/installation automatiques). Si vous souhaitez un contrôle total, appliquez l’option C (notification) ou verrouillez l’accès réseau.
Q : Une GPO suffit‑elle ?
R : Oui, si vous utilisez Preferences → Services en mode Replace. Elle s’exécutera périodiquement et remettra « Disabled », même si une mise à jour l’a remis à « Manuel » entre‑temps.
Q : Comment prouver qu’une mise à jour a fait la bascule ?
R : Corrélez Event ID 7040 (SCM) avec les événements WindowsUpdateClient/Operational (détection/installation) et l’horodatage de Get-HotFix
. Une concordance temporelle forte est un bon indicateur.
Modèles de configuration avancée
DSC (Desired State Configuration)
Si vous standardisez vos serveurs avec PowerShell DSC, la ressource Service
vous permet d’imposer l’état du service et d’enregistrer toute dérive.
Configuration LockWuauserv {
Node $AllNodes.NodeName {
Service Wuauserv {
Name = 'wuauserv'
StartupType = 'Disabled'
State = 'Stopped'
Ensure = 'Present'
}
}
}
# Compilation & application selon votre pipeline (Pull/Push)
Runbook d’urgence (rollback)
Si vous devez réactiver temporairement Windows Update pour appliquer un out‑of‑band :
sc config wuauserv start= demand
sc start wuauserv
# Exécutez la mise à jour contrôlée (WSUS ou installation manuelle)
# Puis reverrouillez :
sc stop wuauserv
sc config wuauserv start= disabled
Exemples de politiques recommandées par profil
Profil serveur | Politique conseillée | Justification |
---|---|---|
Serveurs applicatifs sensibles (finances, prod critique) | Option D (pare‑feu) + Option C (notification) + fenêtre de maintenance mensuelle | Préserve la maîtrise du cycle, réduit les interruptions imprévues. |
Hôtes de management/WSUS | Option C (notification) ; pas de Disabled strict | Ces rôles s’appuient sur wuauserv pour fonctionner correctement. |
Serveurs isolés (DMZ, sites distants sans IT) | Option A (tâche post‑boot) + Option D (pare‑feu) | Résilience contre les réactivations locales, canal réseau verrouillé par défaut. |
Procédure de test : du labo à la production
- Snapshot/Checkpoint d’une VM Windows Server 2022 (22H2) de test.
- Forcer
wuauserv
en Disabled, installer les KB ciblées, redémarrer. - Observer l’état du service, capturer les événements 7040 et les journaux WindowsUpdateClient.
- Déployer la solution retenue (script/GPO/pare‑feu), répéter le cycle et vérifier la conformité.
- Documenter le runbook : responsables, critères de succès, mécanisme de rollback.
Résumé exécutif
Le passage de Windows Update à « Manuel » après KB5046616/KB5044281 n’est pas un dysfonctionnement ; c’est un comportement de durcissement de la pile de maintenance destiné à garantir la capacité de recevoir de futurs correctifs. Si votre politique impose un arrêt permanent ou un contrôle strict, choisissez l’une des stratégies éprouvées :
- Scripts post‑patch et tâches planifiées pour rétablir « Disabled » à chaque redémarrage,
- GPO Services (Replace) pour une conformité durable,
- Paramètres Windows Update en mode notification ou désactivé pour éliminer l’automatisation,
- Blocage réseau afin de rendre inopérants les téléchargements tant qu’ils ne sont pas explicitement autorisés.
Conservez à l’esprit les implications sécurité et support, formalisez la décision, et testez systématiquement vos mécanismes après chaque Patch Tuesday.
En une phrase : ce changement d’état est attendu et vise la sécurité ; si votre gouvernance exige une désactivation stricte, combinez contrôle de service (script/GPO) et contrôle réseau (pare‑feu/WSUS) pour rester maître du calendrier de patch tout en minimisant les risques.