Как узнать, работает ли 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

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

Нормальная загрузка
Отказоустойчивая загрузка
Отказоустойчивый с сетевой загрузкой

Нииииииииице ...
— Массимо

Другими словами: (gwmi win32_computersystem -Property BootupState).BootupState
— Джайкуль

8

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

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


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

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.




Любой способ проверить это через командную строку или мне нужно написать приложение, которое может проверить InitSafeBootMode?
— cwd

Об этом я и говорил в своем комментарии «Я не мог найти разумного пути» ... даже если бы вы могли написать драйвер устройства, чтобы проверить это, заставить его работать на целевой системе было бы довольно сложно.
— Массимо

@cwd Вам на самом деле нужен драйвер режима ядра. И чтобы это было установлено. И работает даже в безопасном режиме. А затем приложение, чтобы поговорить с водителем и сообщить о его состоянии. Это было бы очень уродливо, очень быстро.
— Массимо

1
@cwd, вы идете, не проверили достаточно внимательно, когда я нашел ссылку на КБ. Ответ должен содержать полезную информацию для вас сейчас.
— HopelessN00b

@ HopelessN00b Подтверждено (я действительно перезагрузился в безопасном режиме, чтобы проверить). Ключ HKLM\SYSTEM\CurrentControlSet\SafeBoot\Optionне существует в системе без безопасного режима, но он существует в безопасном режиме.
— Массимо

3

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

> wmic COMPUTERSYSTEM GET BootupState

BootupState
Normal boot

1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.