Wie kann ich feststellen, ob Windows im abgesicherten Modus ausgeführt wird?

14

Ich habe einen Windows-Server, der nach Updates manchmal im abgesicherten Modus neu startet. Ich arbeite an diesem Problem, aber ich möchte wirklich wissen, wie ich überprüfen kann, ob Windows im abgesicherten Modus ausgeführt wird oder nicht.

Idealerweise würde ich es gerne in ein Skript integrieren, das einen passiven Scheck an unsere Nagios-Box mit dem Status sendet.

Gibt es eine Umgebungsvariable, mit der ich diese Informationen über die Befehlszeile abrufen kann?

cwd
quelle
1
Unter Windows gibt es keinen "Einzelbenutzermodus". Sprechen Sie über den abgesicherten Modus?
Massimo
1
Frage aktualisiert und "Einzelbenutzermodus" in "abgesicherten Modus" geändert - Entschuldigung
CWD
Die Frage ist eigentlich interessant, ich habe ein bisschen gegoogelt und konnte keinen vernünftigen Weg finden (wie in "Ohne ein Gerätetreiber zu sein"), programmgesteuert zu überprüfen, ob ein System im abgesicherten Modus läuft ... Aber bitte nehmen Sie die Antwort von @ joeqwerty nicht an, da er über Terminaldienste sprach.
Massimo
3
Sie machen das völlig falsch. Wenn Sie einen Server haben, der manchmal im abgesicherten Modus startet, sollten Sie nach der Hauptursache suchen, nicht nach einer Möglichkeit, das Symptom zu behandeln. Der Server wird das erst nach einem schweren Absturz tun. Finden Sie heraus, was die Abstürze verursacht, und beheben Sie sie.
John Gardeniers
2
@ JohnGardeniers, um ehrlich zu sein, sagte er , er arbeite an dem Problem ...
Massimo

Antworten:

23

Ich denke, das macht das, wonach Sie suchen

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

Mögliche Rückgabewerte:

Normaler Start
Ausfallsicherer Start
Ausfallsicher mit Netzwerkstart
Clayton
quelle
Niiiiiiiiice ...
Massimo
Anders ausgedrückt: (gwmi win32_computersystem -Property BootupState).BootupState
Jaykul
8

Gemäß diesem Artikel wird eine aufgerufene Umgebungsvariable SAFEBOOT_OPTIONentweder auf Minimaloder auf gesetzt, Networkwenn das System im abgesicherten Modus oder im abgesicherten Modus mit Netzwerk gestartet wird. Andernfalls ist die Variable nicht gesetzt.

Ein Test auf den Wert der Variablen sollte den Trick machen; Bedenken Sie jedoch, dass das System, wenn es tatsächlich im abgesicherten Modus ausgeführt wird, zunächst keine Netzwerkverbindung hat, sodass es schwierig sein kann, seinen Status zu melden.

Massimo
quelle
Bestätigt dies auch bei einem schnellen Neustart im abgesicherten Modus.
Massimo
3

EDIT: Meine Güte, ich habe die KB nicht gründlich genug gelesen, um zu erkennen, dass sie im Grunde genommen als Antwort für sich genommen unbrauchbar ist.

Ein nützlicher Weg , um festzustellen , ob Sie im abgesicherten Modus nicht sind , sind aus : Microsoft® Windows® Internals: Microsoft Windows ServerTM 2003, Windows XP, and Windows 2000von Mark E. Russinovich, David A. Solomon .

Der Windows-Kernel durchsucht die Startparameter zu Beginn des Startvorgangs nach den Schaltern im abgesicherten Modus und setzt die interne Variable InitSafeBootMode auf einen Wert, der die vom Kernel gefundenen Schalter widerspiegelt. Der Kernel schreibt den InitSafeBootMode- Wert in den Registrierungswert HKLM \ SYSTEM \ CurrentControlSet \ SafeBoot \ Option \ Option Value, damit Komponenten im Benutzermodus, z. B. der SCM, bestimmen können, in welchem ​​Startmodus sich das System befindet.

Nehmen Sie das Obige und kombinieren Sie es mit dem Folgenden. Sie erhalten einen Registrierungsspeicherort, den Sie mit einem numerischen Wert überprüfen können, den Sie in etwas Nützliches übersetzen können.

In der KB "support.microsoft" mit dem Titel "Ermitteln, ob das System über einen Gerätetreiber im abgesicherten Modus ausgeführt wird".

Der Windows-Kernel exportiert einen Zeiger auf eine ULONG-Variable mit dem Namen InitSafeBootMode. Diese Variable enthält die Einstellungen für den abgesicherten Modus.

Ein Gerätetreiber kann anhand des Werts der Variablen InitSafeBootMode feststellen, ob das System im abgesicherten Modus ausgeführt wird. Der Wert 0 bedeutet, dass das System nicht im abgesicherten Modus ausgeführt wird.

In der folgenden Tabelle sind die Modi für andere Werte aufgeführt.
Wert Modus
1 SAFEBOOT_MINIMAL
2 SAFEBOOT_NETWORK
3 * SAFEBOOT_DSREPAIR
* Hinweis Der Wert 3 gilt nur für Windows-Domänencontroller.

HopelessN00b
quelle
Gibt es eine Möglichkeit, dies über die Befehlszeile zu überprüfen, oder muss ich eine Anwendung schreiben, die dies überprüfen kann InitSafeBootMode?
KWD
Darauf bezog ich mich mit meinem Kommentar "Ich konnte keinen vernünftigen Weg finden" ... selbst wenn Sie einen Gerätetreiber schreiben könnten, um dies zu überprüfen, wäre es ziemlich schwierig , ihn auf dem Zielsystem zum Laufen zu bringen .
Massimo
@cwd Du brauchst eigentlich einen Kernel-Mode-Treiber. Und installiert zu haben. Und läuft sogar im abgesicherten Modus. Und dann eine Anwendung, um mit dem Fahrer zu sprechen und seinen Status zu melden. Das würde sehr schnell sehr hässlich werden.
Massimo
1
@cwd los gehts, habe nicht genau genug nachgesehen, als ich den Link zur KB gefunden habe. Die Antwort sollte jetzt nützliche Informationen für Sie enthalten.
HopelessN00b
@ HopelessN00b Bestätigt (Ich habe tatsächlich im abgesicherten Modus neu gestartet, um dies zu überprüfen). Der Schlüssel HKLM\SYSTEM\CurrentControlSet\SafeBoot\Optionist in einem System ohne abgesicherten Modus überhaupt nicht vorhanden, in einem System mit abgesicherten Modus jedoch nicht.
Massimo
3

Sie können die von Craig620 vorgeschlagene WMI-Abfrage auch direkt über die Befehlszeile ausführen , wenn Sie PowerShell nicht verwenden:

> wmic COMPUTERSYSTEM GET BootupState

BootupState
Normal boot
Massimo
quelle
1

HKLM \ SYSTEM \ CurrentControlSet \ Control \ SystemStartOptions enthält eine Zeichenfolge. Wenn Sie sich im abgesicherten Modus befinden, wird ein "SAFEBOOT: ???" innerhalb der Zeichenfolge wo ??? ist MINIMAL oder NETZWERK. Dies wird bei jedem Start aktualisiert.

Allan
quelle