Как узнать, работает ли Windows в безопасном режиме?

14

У меня есть сервер Windows, который после перезагрузки иногда перезагружается в безопасном режиме. Я работаю над этой проблемой, но мне бы очень хотелось узнать, как я могу проверить, работает ли Windows в безопасном режиме или нет.

В идеале я хотел бы включить его в скрипт, который бы отправил пассивную проверку на наш ящик Nagios со статусом.

Есть ли переменная окружения, которую я могу использовать, или какой-нибудь способ получить эту информацию через командную строку?

УХО
источник
1
В Windows нет «однопользовательского режима» ... вы говорите о безопасном режиме?
Массимо
1
обновил вопрос и изменил «однопользовательский режим» на «безопасный режим» - мои извинения
cwd
Вопрос на самом деле интересный, я немного погуглил и не смог найти какой-либо разумный способ (например, «не быть драйвером устройства») программно проверить, работает ли система в безопасном режиме ... Я голосую, но, пожалуйста, не принимайте ответ @ joeqwerty, поскольку он говорил о службах терминалов.
Массимо
3
Вы делаете это совершенно неправильно. Если у вас есть сервер, который иногда загружается в безопасном режиме, вы должны искать основную причину, а не способ лечения симптома. Сервер будет делать это только после серьезного сбоя. Узнайте, что вызывает сбои и исправить это.
Джон Гарденье
2
@JohnGardeniers, если честно, он сказал, что работает над проблемой ...
Массимо

Ответы:

23

Я думаю, что это делает то, что вы ищете

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

Возможные возвращаемые значения:

Нормальная загрузка
Отказоустойчивая загрузка
Отказоустойчивый с сетевой загрузкой
Clayton
источник
Нииииииииице ...
Массимо
Другими словами: (gwmi win32_computersystem -Property BootupState).BootupState
Джайкуль
8

В соответствии с этой статьей , переменная окружения называется SAFEBOOT_OPTIONлибо, Minimalлибо Networkесли система запущена в безопасном режиме или в безопасном режиме с сетевым подключением; в противном случае переменная не установлена.

Проверка значения переменной должна помочь; однако имейте в виду, что если система действительно работает в безопасном режиме, у нее не будет сети для начала, поэтому сообщать о ее состоянии может быть ... сложно.

Massimo
источник
Подтвердили это и в быстрой перезагрузке в безопасном режиме.
Массимо
3

РЕДАКТИРОВАТЬ: мой плохой, я не прочитал КБ достаточно тщательно, чтобы понять, что он в принципе бесполезен как ответ сам по себе.

Более полезный способ определить , если вы находитесь в безопасном режиме не из : Microsoft® Windows® Internals: Microsoft Windows ServerTM 2003, Windows XP, and Windows 2000от Mark E. Руссиновичем, Дэвид А. Соломона .

Ядро Windows сканирует параметры загрузки в поисках переключателей безопасного режима в начале загрузки и устанавливает для внутренней переменной InitSafeBootMode значение, которое отражает переключатели, найденные ядром. Ядро записывает значение InitSafeBootMode в значение реестра HKLM \ SYSTEM \ CurrentControlSet \ SafeBoot \ Option \ Option Value, чтобы компоненты пользовательского режима, такие как SCM, могли определить, в каком режиме загрузки находится система.

Возьмите вышеизложенное и соедините с нижеследующим, и у вас будет место в реестре, которое вы можете проверить с помощью числового значения, которое вы можете перевести во что-то полезное.

Из раздела support.microsoft KB под названием «Как определить, работает ли система в безопасном режиме из драйвера устройства».

Ядро ОС Windows экспортирует указатель на переменную ULONG с именем InitSafeBootMode. Эта переменная содержит настройки безопасного режима.

Драйвер устройства может определить, работает ли система в безопасном режиме, по значению переменной InitSafeBootMode. Значение 0 означает, что система не работает в безопасном режиме.

В следующей таблице перечислены режимы для других значений. Режим
значений 1 SAFEBOOT_MINIMAL 2 SAFEBOOT_NETWORK 3 * SAFEBOOT_DSREPAIR * Примечание. Значение 3 применяется только к контроллерам домена Windows.



HopelessN00b
источник
Любой способ проверить это через командную строку или мне нужно написать приложение, которое может проверить InitSafeBootMode?
cwd
Об этом я и говорил в своем комментарии «Я не мог найти разумного пути» ... даже если бы вы могли написать драйвер устройства, чтобы проверить это, заставить его работать на целевой системе было бы довольно сложно.
Массимо
@cwd Вам на самом деле нужен драйвер режима ядра. И чтобы это было установлено. И работает даже в безопасном режиме. А затем приложение, чтобы поговорить с водителем и сообщить о его состоянии. Это было бы очень уродливо, очень быстро.
Массимо
1
@cwd, вы идете, не проверили достаточно внимательно, когда я нашел ссылку на КБ. Ответ должен содержать полезную информацию для вас сейчас.
HopelessN00b
@ HopelessN00b Подтверждено (я действительно перезагрузился в безопасном режиме, чтобы проверить). Ключ HKLM\SYSTEM\CurrentControlSet\SafeBoot\Optionне существует в системе без безопасного режима, но он существует в безопасном режиме.
Массимо
3

Вы также можете запустить запрос WMI, предложенный Craig620, непосредственно из командной строки, если вы не используете PowerShell:

> wmic COMPUTERSYSTEM GET BootupState

BootupState
Normal boot
Massimo
источник
1

HKLM \ SYSTEM \ CurrentControlSet \ Control \ SystemStartOptions содержит строку, и если вы находитесь в безопасном режиме, будет "SAFEBOOT: ???" в строке где ??? МИНИМАЛЬНЫЙ или СЕТЬ. Это обновляется при каждой загрузке.

Аллан
источник