Jak sprawdzić, czy system Windows działa w trybie awaryjnym?

14

Mam serwer Windows, który czasami aktualizuje się ponownie w trybie awaryjnym po aktualizacji. Pracuję nad tym problemem, ale tak naprawdę chciałbym wiedzieć, jak mogę sprawdzić, czy system Windows działa w trybie awaryjnym, czy nie.

Idealnie chciałbym włączyć go do skryptu, który wysyłałby pasywne sprawdzenie do naszego pola Nagios ze statusem.

Czy jest jakaś zmienna środowiskowa, której mogę użyć, lub jakiś sposób na uzyskanie tych informacji za pomocą wiersza poleceń?

cwd
źródło
1
W systemie Windows nie ma „trybu pojedynczego użytkownika” ... czy mówisz o trybie awaryjnym?
Massimo,
1
zaktualizowałem pytanie i zmieniłem „tryb pojedynczego użytkownika” na „tryb awaryjny” - przepraszam
cwd
Pytanie jest w rzeczywistości interesujące. Przeszukałem trochę i nie mogłem znaleźć żadnego rozsądnego sposobu (np. „Nie będąc sterownikiem urządzenia”), aby programowo sprawdzić, czy system działa w trybie awaryjnym ... ale proszę nie akceptować odpowiedzi @ joeqwerty, ponieważ mówił o usługach terminalowych.
Massimo
3
Robisz to całkowicie źle. Jeśli masz serwer, który czasami uruchamia się w trybie awaryjnym, powinieneś poszukać przyczyny, a nie sposobu leczenia tego objawu. Serwer zrobi to dopiero po poważnej awarii. Dowiedz się, co powoduje awarie i napraw je.
John Gardeniers
2
@JohnGardeniers, szczerze mówiąc, powiedział, że pracuje nad tą kwestią ...
Massimo,

Odpowiedzi:

8

Zgodnie z tym artykułem , zmienna środowiskowa nazywany SAFEBOOT_OPTIONjest ustawiony albo Minimalalbo Network, jeżeli system zostanie uruchomiony w trybie awaryjnym lub w trybie awaryjnym z obsługą sieci; w przeciwnym razie zmienna nie jest ustawiona.

Test wartości zmiennej powinien załatwić sprawę; Należy jednak pamiętać, że jeśli system faktycznie działa w trybie awaryjnym, nie będzie miał na początku sieci, więc zgłoszenie jego statusu może być ... trudne.

Massimo
źródło
Potwierdził to również podczas szybkiego ponownego uruchomienia w trybie awaryjnym.
Massimo
3

EDYCJA: moje złe, nie przeczytałem KB wystarczająco dokładnie, aby zdać sobie sprawę, że jest to w zasadzie bezużyteczne jako odpowiedź sama w sobie.

Bardziej przydatny sposób ustalić, czy jesteś w trybie awaryjnym nie jest od : Microsoft® Windows® Internals: Microsoft Windows ServerTM 2003, Windows XP, and Windows 2000przez Mark E. Russinovichem, David A. Salomona .

Jądro systemu Windows skanuje parametry rozruchu w poszukiwaniu przełączników trybu awaryjnego na wczesnym etapie rozruchu i ustawia zmienną wewnętrzną InitSafeBootMode na wartość odzwierciedlającą przełączniki znalezione przez jądro. Jądro zapisuje wartość InitSafeBootMode do wartości rejestru HKLM \ SYSTEM \ CurrentControlSet \ SafeBoot \ Option \ Option Value, aby składniki trybu użytkownika, takie jak SCM, mogły określić tryb rozruchu systemu.

Weź powyższe i sparuj z poniższym, a będziesz mieć lokalizację rejestru, którą możesz sprawdzić za pomocą wartości liczbowej, którą możesz przełożyć na coś użytecznego.

Na stronie support.microsoft KB zatytułowanej „Jak ustalić, czy system działa w trybie awaryjnym ze sterownika urządzenia”.

Jądro systemu operacyjnego Windows eksportuje wskaźnik do zmiennej ULONG o nazwie InitSafeBootMode. Ta zmienna zawiera ustawienia trybu awaryjnego.

Sterownik urządzenia może ustalić, czy system działa w trybie awaryjnym na podstawie wartości zmiennej InitSafeBootMode. Wartość 0 oznacza, że ​​system nie działa w trybie awaryjnym.

W poniższej tabeli wymieniono tryby dla innych wartości. Tryb
wartości 1 SAFEBOOT_MINIMAL 2 SAFEBOOT_NETWORK 3 * SAFEBOOT_DSREPAIR * Uwaga Wartość 3 dotyczy tylko kontrolerów domen Windows.



Beznadziejny
źródło
Jakikolwiek sposób, aby to sprawdzić za pomocą wiersza polecenia, czy też musiałbym napisać aplikację, która mogłaby to sprawdzić InitSafeBootMode?
cwd
Do tego miałem na myśli mój komentarz „Nie mogłem znaleźć żadnego rozsądnego sposobu” ... nawet jeśli możesz napisać sterownik urządzenia, aby to sprawdzić, uruchomienie go w systemie docelowym byłoby dość trudne.
Massimo
@cwd Tak naprawdę potrzebujesz sterownika trybu jądra. I mieć to zainstalowane. I działa nawet w trybie awaryjnym. A następnie aplikacja do rozmowy ze sterownikiem i zgłoszenia jego statusu. To stałoby się naprawdę brzydkie, naprawdę szybkie.
Massimo
1
@ cwd proszę bardzo, nie sprawdziłem wystarczająco dokładnie, kiedy znalazłem link do KB. Odpowiedź powinna teraz zawierać przydatne informacje.
HopelessN00b
@ Potwierdzony HopelessN00b (zrestartowałem się w trybie awaryjnym, aby sprawdzić). Klucz w HKLM\SYSTEM\CurrentControlSet\SafeBoot\Optionogóle nie istnieje w systemie innym niż tryb awaryjny, ale działa w trybie awaryjnym.
Massimo
3

Możesz również uruchomić zapytanie WMI sugerowane przez Craig620 bezpośrednio z wiersza poleceń, jeśli nie używasz PowerShell:

> wmic COMPUTERSYSTEM GET BootupState

BootupState
Normal boot
Massimo
źródło
1

HKLM \ SYSTEM \ CurrentControlSet \ Control \ SystemStartOptions zawiera ciąg znaków, a jeśli jesteś w trybie awaryjnym, pojawi się komunikat „SAFEBOOT: ???” w ciągu gdzie? jest MINIMALNY lub SIEĆ. To jest aktualizowane przy każdym uruchomieniu.

Allan
źródło