Redfish GracefulRestart : diagnostiquer un redémarrage Windows Server 2019/2022 ignoré (événements 1074/6006, veille S3/S4, RDP)

Vous envoyez « Redfish Reset = GracefulRestart » à des Windows Server 2019/2022… mais rien ne se passe ? Ce guide concret vous aide à savoir si l’OS a accepté, rejeté ou ignoré la demande, et à fiabiliser vos redémarrages distants.

Sommaire

Problème posé

Dans certains environnements, une requête Redfish POST /redfish/v1/Systems/{Id}/Actions/ComputerSystem.Reset avec {"ResetType":"GracefulRestart"} ne déclenche aucun redémarrage du serveur Windows Server 2019/2022. Les objectifs opérationnels sont :

  • Vérifier si l’OS a accepté ou rejeté la demande.
  • Identifier les cas d’ignorance de la demande (veille/hibernation, sessions actives, services bloquants, GPO, etc.).

Points essentiels déjà établis

Les constats suivants servent de base à l’analyse :

ObjectifPiste proposéeLimites
Savoir qui a déclenché un redémarrageObservateur d’événements → « Système » → ID 1074 (source : User32) : indique l’utilisateur/processus, le motif et le type (planifié / non planifié).Si aucun 1074 n’apparaît, Windows n’a pas commencé la séquence d’arrêt.
Comprendre les refusAucune entrée explicite « rejetée » n’est journalisée ; seul un échec (erreur) ou l’absence totale d’événement est visible.Sans corrélation temporelle, difficile de distinguer « jamais reçu » de « bloqué ».
Effet de la mise en veilleUn système en S3/S4 (Veille/Hibernation) ne traite pas l’appel ; il faut d’abord le réveiller.Les BMC déclenchent parfois un appui « virtuel » sur le bouton ; sans réveil préalable, l’OS ne réagit pas.
Sessions activesEn présence d’utilisateurs connectés, Windows peut afficher des boîtes de dialogue « Enregistrer votre travail ». Sans interaction, l’arrêt reste bloqué.Le comportement dépend des stratégies GPO, du temps d’attente et des apps en cours.

Comment “GracefulRestart” est censé fonctionner

Sur l’interface Redfish du BMC (iDRAC, iLO, XCC, BMC générique), l’action ComputerSystem.Reset avec ResetType=GracefulRestart signifie : demander à l’OS un redémarrage propre. Concrètement :

  • Le BMC accepte la requête et renvoie souvent HTTP 202 Accepted lorsqu’il a relégué la demande vers la couche gérée (OS/ACPI/agent).
  • L’exécution réelle dépend de l’OS : si Windows ne voit pas l’événement (machine en S3/S4, agent/ACPI non opérationnel, service bloquant), il n’y a pas de 1074 et donc pas d’arrêt.
  • Un vrai redémarrage propre doit laisser des traces jumelles : ID 1074 au déclenchement, puis ID 6006 (arrêt du journal) suivi de ID 6005 (démarrage du journal) après reboot.

Ce que Windows journalise (et comment le lire vite)

UsageÉvénements à surveillerInterprétation
Validation d’un arrêt propre6006 (Event log stopped) & 6005 (Event log started)Confirment un arrêt effectif puis une reprise du service d’événements.
Déclencheur d’arrêt/reboot1074 (User32)Qui/quoi a lancé la séquence : utilisateur, processus (ex. svchost, shutdown.exe), motif.
Arrêt inattendu6008Signale un redémarrage non prévu (crash, power off). Souvent accompagné de 41 Kernel‑Power.
Transition veille/hibernation42 Kernel‑PowerIndique une entrée en veille/hibernation. S’il n’y a pas de 1074, la demande est probablement arrivée pendant le sommeil.
Code raison détaillé1076Présent quand une raison est consignée (ex. « Panne d’alimentation », « Maintenance »), utile pour différencier manuel vs. script.

Astuce visibilité : activez le mode VerboseStatus pour des traces plus bavardes pendant l’arrêt :

Clé : HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
Valeur : VerboseStatus (REG_DWORD) = 1

Vérification côté Redfish/BMC

  • 202 Accepted sur POST /redfish/v1/Systems/{Id}/Actions/ComputerSystem.Reset = la commande est acceptée par le BMC, pas forcément exécutée par l’OS.
  • Surveillez périodiquement /redfish/v1/Systems/{Id} : la propriété Status.State (Enabled, Standby, etc.) et les informations exposées dans ResetActionInfo donnent l’état d’avancement.
  • Si Redfish affiche Completed mais qu’aucun 1074/6006 n’existe côté Windows, la demande n’a pas été traitée par l’OS → veille, sessions bloquantes ou couche intermédiaire manquante/défaillante.

Scénarios fréquents où la demande est ignorée

  1. Veille / Hibernation (S3/S4) : l’OS ne reçoit pas la demande tant qu’il dort. Solution : réveil préalable (WoL, PDU, Redfish PushPowerButton), puis GracefulRestart.
  2. Services critiques en attente (MS Failover Cluster, SQL Server en SHUTDOWN WITH NOWAIT/WAIT, sauvegarde VSS, agents EDR) : la séquence d’arrêt reste suspendue. Solution : vérifier Event Viewer > Application, systemctl équivalents Windows (services), Get-Service.
  3. GPO qui modifient l’expérience d’arrêt (ex. « Turn off automatic restart for updates ») : peut différer les redémarrages planifiés. Solution : auditer la stratégie et tester hors GPO.
  4. Sessions RDP déconnectées mais ouvertes : Windows considère l’utilisateur actif. Solution : fermer les sessions inactives ou imposer une stratégie de déconnexion.
  5. Fenêtres d’applications bloquantes (fichiers non sauvegardés) : boîtes « Enregistrer/Annuler ». Solution : shutdown.exe /f en dernier recours (forçage).
  6. Pile ACPI/agent non disponible : drivers, services ou agents d’intégration absents/gelés. Solution : valider la santé OS (services critiques actifs, pas de BSOD récent).

Méthode de corrélation fiabilisée

Pour qualifier chaque tentative de GracefulRestart, appliquez la corrélation ci‑dessous :

Redfish/BMCWindows (événements)ConclusionAction recommandée
202 Accepted1074 présent → 6006 puis 6005Redémarrage réussiRien à faire, logguer l’heure & l’initiateur.
202 AcceptedAucun 1074, présence d’un 42 Kernel‑PowerMachine endormie au moment de la demandeRéveiller → réémettre la commande.
202 Accepted1074 absent, pas de 6006, services « long‑running »Blocage par service/appClore sessions/arrêter services → retester.
Échec HTTP (4xx/5xx)Commande non transmise au BMCCorriger auth/URI/firmware BMC.
Completed6008/41 sans 1074Redémarrage non gracieuxAnalyser crash/PowerLoss, envisager shutdown.exe /d pour traçabilité.

Contrôles et diagnostics “pré‑vol”

ContrôleCommandeAttendu
Sessions activesquser ou query user0 session ou sessions « Disc » fermées avant reboot
Demandes de veille & blocagespowercfg /requestsAucun handle bloquant
États de veille supportéspowercfg /aIdentifier S3/S4 activés (pour gérer le réveil)
Reboot en attente (Windows Update/CBServicing)Voir script ci‑dessous (clés RebootPending)Décider d’un graceful vs force
Santé journaux SystèmeGet-WinEvent -LogName System -MaxEvents 1Pas d’erreurs « disk », « ntfs », « volmgr »

Scripts PowerShell prêts à l’emploi

1) Lecture immédiate des preuves Windows

# Dernier redémarrage demandé (User32/1074)
Get-WinEvent -LogName System -FilterHashtable @{ID=1074} -MaxEvents 1 |
  Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message

# OS a-t-il redémarré depuis "X" ?

\$lastBoot = (Get-CimInstance Win32\_OperatingSystem).LastBootUpTime
"Dernier démarrage : \$lastBoot"

# Veille/hibernation récente ?

Get-WinEvent -LogName System -FilterHashtable @{ID=42; ProviderName='Microsoft-Windows-Kernel-Power'} -MaxEvents 5 |
Select-Object TimeCreated, Id, Message 

2) Détection d’un redémarrage en attente

function Test-PendingReboot {
  $paths = @(
    'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending',
    'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired',
    'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations'
  )
  $pending = $false
  foreach ($p in $paths) { if (Test-Path $p) { $pending = $true } }
  [pscustomobject]@{ PendingReboot = $pending; CheckedPaths = ($paths -join '; ') }
}
Test-PendingReboot

3) Fermeture contrôlée des sessions RDP inactives

# Liste et fermeture (optionnelle) des sessions déconnectées depuis > 2h
$query = quser 2>&1
$lines = $query | Select-String -Pattern 'Disc'
foreach ($l in $lines) {
  $parts = ($l -split '\s+') | Where-Object { $_ -ne '' }
  $sessionId = $parts[2]
  # Logoff si idle >= 02:00 (à adapter)
  # logoff $sessionId
  "Session déconnectée détectée : ID=$sessionId (simulation)"
}

4) Envoi Redfish « GracefulRestart » et corrélation

Exemple générique (adapter l’URL, l’Id système et le certificat/TLS selon votre BMC) :

$BmcBase   = 'https://bmc.exemple.local'
$SystemId  = 'System.Embedded.1'
$User      = 'admin'
$Password  = 'MotDePasseTresSecret'

\$body = @{ ResetType = 'GracefulRestart' } | ConvertTo-Json

# 1) Poster la demande

try {
\$resp = Invoke-RestMethod -Method Post -Uri "\$BmcBase/redfish/v1/Systems/\$SystemId/Actions/ComputerSystem.Reset" `          -Body $body -ContentType 'application/json' -Credential (New-Object pscredential($User,(ConvertTo-SecureString $Password -AsPlainText -Force)))`
-SkipCertificateCheck
"Redfish Reset posté : \$(\$resp | Out-String)"
} catch {
Write-Warning "Echec POST Redfish : \$($\_.Exception.Message)"
return
}

# 2) Poll état côté BMC (simplifié)

for (\$i=0; \$i -lt 10; \$i++) {
Start-Sleep -Seconds 3
\$sys = Invoke-RestMethod -Method Get -Uri "\$BmcBase/redfish/v1/Systems/\$SystemId" `        -Credential (New-Object pscredential($User,(ConvertTo-SecureString $Password -AsPlainText -Force)))`
-SkipCertificateCheck
"Etat Redfish : \$(\$sys.Status.State) / PowerState=\$(\$sys.PowerState)"
}

# 3) Vérifier preuves OS

\$evt = Get-WinEvent -LogName System -FilterHashtable @{ID=1074} -MaxEvents 1
\$boot = (Get-CimInstance Win32\_OperatingSystem).LastBootUpTime
\[pscustomobject]@{
Has1074 = (\$null -ne \$evt)
Last1074 = if (\$evt) { \$evt.TimeCreated } else { \$null }
LastBoot = \$boot
} 

5) Traçabilité renforcée (raison obligée)

Pour forcer une signature lisible dans les logs, déclenchez un redémarrage côté OS avec un motif explicite (utile dans vos tests comparatifs) :

shutdown.exe /r /t 0 /d p:4:1 /c "Graceful Restart Test"

Procédure opératoire recommandée

  1. Réveil garanti : si la cible peut être en S3/S4, réveillez‑la (WoL, PDU, Redfish PushPowerButton), attendez 10–20 s que les services critiques reviennent.
  2. Pré‑vol : exécutez les contrôles (sessions, powercfg /requests, reboot pending, santé journaux) et corrigez ce qui bloque.
  3. Emission Redfish : ResetType=GracefulRestart → attendez 202 Accepted. En cas d’erreur HTTP, corrigez auth/cert/URI.
  4. Corrélation OS : cherchez un 1074 dans les 0–2 min. Sans 1074 ? re‑vérifiez veille/sessions/services.
  5. Validation : attendez 6006 puis 6005. Comparez à LastBootUpTime. Déclarez « succès » uniquement si ces preuves existent.
  6. Remédiation : si la demande reste ignorée, envisagez GracefulShutdown puis On, ou ForceRestart en dernier recours (fenêtres forcées : /f).

Tableau de dépannage rapide (cause → symptôme → remède)

Cause probableCe que vous voyezRemède
Veille/hibernation202 OK, aucun 1074, événements 42 prochesRéveil puis relancer la commande
Sessions RDP ouvertesBoîtes « Enregistrer votre travail », pas de 6006Politiques de fermeture, logoff ciblé
Service longue exécution (VSS/Backup/DB)1074 absent, journaux Application verbauxArrêt propre du service, fenêtre de maintenance
GPO « No auto‑restart »Reboots planifiés différésAjuster GPO pour maintenance
Crash/powerloss6008/41 sans 1074Diagnostic matériel/driver/énergie

Bonnes pratiques de configuration

  • Activer VerboseStatus pour rendre l’arrêt bavard (meilleure visibilité).
  • Afficher le Shutdown Event Tracker sur serveurs d’intégration : encourage la saisie d’une raison (1076), utile en audit.
  • GPO de gestion RDP : déconnexion forcée des sessions inactives et fermeture applicative avant maintenance.
  • Fenêtre de maintenance : aligner sauvegardes/patching/cluster pour éviter des verrous concurrents.
  • Observabilité : collectez 1074/6006/6005/6008/41/42 dans votre SIEM avec corrélation par hôte et horodatage Redfish.

FAQ opérationnelle

Q : Redfish “GracefulRestart” et shutdown.exe /r sont‑ils équivalents ?
R : Pas exactement. Redfish délègue au BMC qui tente un redémarrage propre via ACPI/agent. shutdown.exe agit dans l’OS. Les traces Windows (1074/6006) restent l’unique preuve d’exécution côté OS.

Q : Pourquoi ai‑je un “202 Accepted” mais aucun redémarrage ?
R : Le BMC a accepté la requête mais l’OS n’a pas réagi (veille, sessions/applications bloquantes, couche d’intégration indisponible). Cherchez 1074 ; s’il manque, la séquence n’a pas démarré.

Q : Faut‑il forcer avec “ForceRestart” ?
R : Seulement en dernier recours. Essayez d’abord wake → graceful → vérifier → remédier. En cas d’urgence, force peut provoquer perte de données.

Exemples de rapports exploitables

Voici des gabarits de rapports que votre orchestrateur peut produire après chaque tentative de GracefulRestart :

ChampExempleComment l’obtenir
Horodatage commande Redfish2025‑09‑17T21:43:10ZOrchestrateur/BMC response time
HTTP status Redfish202 AcceptedRéponse POST
OS 1074 (oui/non + heure)Oui @ 21:43:25ZGet-WinEvent 1074
6006/60056006 @ 21:43:55Z / 6005 @ 21:46:08ZJournaux Système
LastBootUpTime2025‑09‑17 21:46:02Get-CimInstance Win32_OperatingSystem
ConclusionReboot gracieux confirméRègles de corrélation (table ci‑dessus)

Annexe : snippets utiles

Revenir d’une veille avant Redfish

Si votre BMC expose l’action « PushPowerButton », vous pouvez simuler une pression de bouton pour sortir de S3/S4, puis relancer GracefulRestart. Autrement, utilisez WoL ou PDU.

Nettoyage applicatif avant redémarrage

# Exemple : arrêter proprement un service critique avant le reset
$svc = 'MSSQLSERVER' # à adapter
if ((Get-Service $svc -ErrorAction SilentlyContinue)?.Status -eq 'Running') {
  Stop-Service $svc -Force -ErrorAction Stop
}

Collecte SIEM des événements clés

$ids = 1074,6006,6005,6008,41,42
Get-WinEvent -LogName System -FilterHashtable @{ID=$ids} |
  Select-Object TimeCreated, Id, ProviderName, LevelDisplayName, MachineName, Message

Synthèse des solutions

  • Corréler 202 Redfish → Windows 1074. Pas de 1074 = l’OS n’a pas reçu/traité la demande → vérifier veille, sessions, services, GPO.
  • Surveiller 6006/6005 pour confirmer l’extinction et la reprise.
  • Activer VerboseStatus et consigner une raison (shutdown.exe /d … /c …) pour des audits précis.
  • Automatiser : script PowerShell qui interroge 1074, compare à LastBootUpTime, alerte sur délai dépassé.
  • Gérer les états spéciaux : réveiller avant commande, fermer les sessions RDP inactives, débloquer les services empêchant l’arrêt.

Conclusion

“Accepté” côté Redfish ne veut pas dire “exécuté” par Windows. La clé est la corrélation entre BMC et journaux OS : 1074 → 6006 → 6005. En appliquant les contrôles et scripts fournis, vous saurez en quelques minutes si la demande GracefulRestart a réellement déclenché la séquence d’arrêt Windows, pourquoi elle aurait été ignorée, et comment fiabiliser vos redémarrages sur Windows Server 2019/2022.

Sommaire