Comment savoir si Windows fonctionne en mode sans échec?

14

J'ai un serveur Windows qui redémarre parfois en mode sans échec après les mises à jour. Je travaille sur ce problème, mais ce que j'aimerais vraiment savoir, c'est comment puis-je vérifier si Windows fonctionne en mode sans échec ou non.

Idéalement, je voudrais l'intégrer dans un script qui enverrait un chèque passif à notre boîte Nagios avec le statut.

Existe-t-il une variable d'environnement que je peux utiliser ou un moyen d'obtenir ces informations via la ligne de commande?

cwd
la source
1
Il n'y a pas de "mode mono-utilisateur" sous Windows ... parlez-vous du mode sans échec?
Massimo
1
question mise à jour et changé le "mode mono-utilisateur" en "mode sans échec" - mes excuses
cwd
La question est en fait intéressante, j'ai cherché un peu sur Google et je n'ai pas trouvé de moyen raisonnable (comme dans "sans être un pilote de périphérique") pour vérifier par programme si un système fonctionne en mode sans échec ... mais veuillez refuser la réponse de @ joeqwerty, car il parlait des services Terminal Server.
Massimo
3
Vous faites cela complètement mal. Si vous avez un serveur qui démarre parfois en mode sans échec, vous devez rechercher la cause première, et non un moyen de traiter le symptôme. Le serveur ne le fera qu'après un grave crash. Découvrez ce qui cause les plantages et corrigez-le.
John Gardeniers
2
@JohnGardeniers, pour être honnête, il a dit qu'il travaillait sur la question ...
Massimo

Réponses:

23

Je pense que cela fait ce que vous cherchez

PS C:\> gwmi win32_computersystem | select BootupState

BootupState
-----------
Normal boot

http://msdn.microsoft.com/en-us/library/windows/desktop/aa394102%28v=vs.85%29.aspx

Valeurs de retour possibles:

Démarrage normal
Démarrage à sécurité intégrée
Sécurité intégrée avec démarrage réseau
Clayton
la source
Niiiiiiiiice ...
Massimo
Autrement dit: (gwmi win32_computersystem -Property BootupState).BootupState
Jaykul
8

Selon cet article , une variable d'environnement appelée SAFEBOOT_OPTIONest définie sur Minimalou Networksi le système est démarré en mode sans échec ou en mode sans échec avec mise en réseau; sinon, la variable n'est pas définie.

Un test sur la valeur de la variable devrait faire l'affaire; Cependant, gardez à l'esprit que si le système fonctionne réellement en mode sans échec, il n'aura pas de réseau pour commencer, donc signaler son état pourrait être ... difficile.

Massimo
la source
Cela a également été confirmé lors d'un redémarrage rapide en mode sans échec.
Massimo
3

EDIT: ma mauvaise, je n'ai pas lu le KB suffisamment à fond pour réaliser qu'il est fondamentalement inutile en tant que réponse en soi.

Un moyen plus utile de déterminer si vous êtes en mode sans échec est de : Microsoft® Windows® Internals: Microsoft Windows ServerTM 2003, Windows XP, and Windows 2000par Mark E. Russinovich, David A. Solomon .

Le noyau Windows analyse les paramètres de démarrage à la recherche des commutateurs en mode sans échec au début du démarrage et définit la variable interne InitSafeBootMode sur une valeur qui reflète les commutateurs détectés par le noyau. Le noyau écrit la valeur InitSafeBootMode dans la valeur de registre HKLM \ SYSTEM \ CurrentControlSet \ SafeBoot \ Option \ Option Value afin que les composants en mode utilisateur, tels que le SCM, puissent déterminer le mode de démarrage du système.

Prenez ce qui précède et associez-le à ce qui suit, et vous aurez un emplacement de registre que vous pouvez vérifier avec une valeur numérique que vous pouvez traduire en quelque chose d'utile.

À partir de la base de connaissances support.microsoft intitulée «Comment déterminer si le système s'exécute en mode sans échec à partir d'un pilote de périphérique».

Le noyau du système d'exploitation Windows exporte un pointeur vers une variable ULONG nommée InitSafeBootMode. Cette variable contient les paramètres du mode sans échec.

Un pilote de périphérique peut déterminer si le système s'exécute en mode sans échec par la valeur de la variable InitSafeBootMode. Une valeur de 0 signifie que le système ne fonctionne pas en mode sans échec.

Le tableau suivant répertorie les modes pour les autres valeurs. Mode
valeur 1 SAFEBOOT_MINIMAL 2 SAFEBOOT_NETWORK 3 * SAFEBOOT_DSREPAIR * Remarque La valeur 3 s'applique uniquement aux contrôleurs de domaine Windows.



HopelessN00b
la source
Est-il possible de vérifier cela via la ligne de commande ou aurais-je besoin d'écrire une application qui pourrait vérifier InitSafeBootMode?
cwd
C'est à cela que je faisais allusion avec mon commentaire "Je n'ai pas trouvé de moyen raisonnable" ... même si vous pouviez écrire un pilote de périphérique pour le vérifier, le faire fonctionner sur le système cible serait assez délicat.
Massimo
@cwd Vous auriez en fait besoin d'un pilote en mode noyau. Et pour l'avoir installé. Et fonctionnant même en mode sans échec. Et puis une application pour parler avec le conducteur et signaler son état. Cela deviendrait vraiment moche très vite.
Massimo
1
@cwd vous y êtes, n'a pas vérifié assez attentivement quand j'ai trouvé le lien vers la base de connaissances. La réponse devrait contenir des informations utiles pour vous maintenant.
HopelessN00b
@ HopelessN00b Confirmé (j'ai en fait redémarré en mode sans échec pour vérifier). La clé HKLM\SYSTEM\CurrentControlSet\SafeBoot\Optionn'existe pas du tout sur un système sans mode sans échec, mais elle existe sur un système en mode sans échec.
Massimo
3

Vous pouvez également exécuter la requête WMI suggérée par Craig620 directement à partir de la ligne de commande, si vous n'utilisez pas PowerShell:

> wmic COMPUTERSYSTEM GET BootupState

BootupState
Normal boot
Massimo
la source
1

HKLM \ SYSTEM \ CurrentControlSet \ Control \ SystemStartOptions contient une chaîne et si vous êtes en mode sans échec, il y aura un "SAFEBOOT: ???" dans la chaîne où ??? est MINIMAL ou RÉSEAU. Ceci est mis à jour à chaque démarrage.

Allan
la source