¿Cómo puedo saber si Windows se está ejecutando en modo seguro?

14

Tengo un servidor de Windows que a veces se reiniciará en modo seguro después de las actualizaciones. Estoy trabajando en ese problema, pero lo que realmente me gustaría saber es cómo puedo verificar si Windows se está ejecutando en modo seguro o no.

Idealmente, me gustaría incorporarlo a un script que enviaría una verificación pasiva a nuestro cuadro Nagios con el estado.

¿Hay alguna variable ambiental que pueda usar o alguna forma de obtener esta información a través de la línea de comando?

cwd
fuente
1
No hay un "modo de usuario único" en Windows ... ¿estás hablando del modo seguro?
Massimo
1
pregunta actualizada y cambio de "modo de usuario único" a "modo seguro" - disculpas
cwd
La pregunta es realmente interesante, busqué en Google un poco y no pude encontrar ninguna manera razonable (como en "sin ser un controlador de dispositivo") para verificar mediante programación si un sistema se está ejecutando en modo seguro ... Estoy votando, pero, por favor, no acepte la respuesta de @ joeqwerty, ya que estaba hablando de Terminal Services.
Massimo
3
Estás haciendo esto completamente mal. Si tiene un servidor que a veces arranca en modo seguro, debe buscar la causa raíz, no una forma de tratar el síntoma. El servidor solo lo hará después de un bloqueo grave. Averigua qué está causando los accidentes y arréglalo.
John Gardeniers
2
@JohnGardeniers, para ser sincero, dijo que está trabajando en el tema ...
Massimo

Respuestas:

23

Creo que esto hace lo que buscas

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

Posibles valores de retorno:

Arranque normal
Arranque a prueba de fallos
A prueba de fallos con arranque de red
Clayton
fuente
Niiiiiiiiice ...
Massimo
Dicho de otra forma: (gwmi win32_computersystem -Property BootupState).BootupState
Jaykul el
8

De acuerdo con este artículo , una variable de entorno llamada SAFEBOOT_OPTIONse establece en Minimalo Networksi el sistema se inicia en modo seguro o en modo seguro con funciones de red; de lo contrario, la variable no está establecida.

Una prueba sobre el valor de la variable debería hacer el truco; sin embargo, tenga en cuenta que si el sistema realmente se está ejecutando en Modo a prueba de errores, no tendrá redes para comenzar, por lo que informar su estado podría ser ... difícil.

Massimo
fuente
También confirmó esto en un reinicio rápido en modo seguro.
Massimo
3

EDITAR: mi mal, no leí el KB lo suficiente como para darme cuenta de que es básicamente inútil como respuesta por sí solo.

Una forma más útil de determinar si está en modo seguro o no es de : Microsoft® Windows® Internals: Microsoft Windows ServerTM 2003, Windows XP, and Windows 2000por Mark E. Russinovich, David A. Solomon .

El kernel de Windows escanea los parámetros de arranque en busca de los conmutadores de modo seguro temprano durante el arranque y establece la variable interna InitSafeBootMode en un valor que refleje los conmutadores que encuentra el kernel. El kernel escribe el valor de InitSafeBootMode en el valor de registro HKLM \ SYSTEM \ CurrentControlSet \ SafeBoot \ Option \ Option Value para que los componentes en modo de usuario, como SCM, puedan determinar en qué modo de arranque se encuentra el sistema.

Tome lo anterior y empareje con el siguiente, y tendrá una ubicación de registro que puede verificar con un valor numérico que puede traducir en algo útil.

De support.microsoft KB titulado, "Cómo determinar si el sistema se está ejecutando en modo seguro desde un controlador de dispositivo".

El kernel del sistema operativo Windows exporta un puntero a una variable ULONG que se denomina InitSafeBootMode. Esta variable contiene la configuración del modo seguro.

Un controlador de dispositivo puede determinar si el sistema se está ejecutando en modo seguro por el valor de la variable InitSafeBootMode. Un valor de 0 significa que el sistema no se está ejecutando en modo seguro.

La siguiente tabla enumera los modos para otros valores. Modo de
valor 1 SAFEBOOT_MINIMAL 2 SAFEBOOT_NETWORK 3 * SAFEBOOT_DSREPAIR * Nota El valor de 3 se aplica solo a los controladores de dominio de Windows.



HopelessN00b
fuente
¿Alguna forma de verificar esto a través de la línea de comando o necesitaría escribir una aplicación que pudiera verificar InitSafeBootMode?
cwd
Eso es a lo que me refería con mi comentario "No pude encontrar ninguna forma razonable" ... incluso si pudiera escribir un controlador de dispositivo para verificar eso, sería bastante complicado hacer que se ejecute en el sistema de destino .
Massimo
@cwd Realmente necesitaría un controlador en modo kernel. Y tenerlo instalado. Y funcionando incluso en modo seguro. Y luego una aplicación para hablar con el conductor y reportar su estado. Esto se pondría muy feo muy rápido.
Massimo
1
@cwd ahí tienes, no lo revisé lo suficiente cuando encontré el enlace a la KB. La respuesta debe contener información útil para usted ahora.
HopelessN00b
@ HopelessN00b confirmado (en realidad reinicié en modo seguro para verificar). La clave HKLM\SYSTEM\CurrentControlSet\SafeBoot\Optionno existe en absoluto en un sistema que no sea en modo seguro, pero sí en uno seguro.
Massimo
3

También puede ejecutar la consulta WMI sugerida por Craig620 directamente desde la línea de comandos, si no está utilizando PowerShell:

> wmic COMPUTERSYSTEM GET BootupState

BootupState
Normal boot
Massimo
fuente
1

HKLM \ SYSTEM \ CurrentControlSet \ Control \ SystemStartOptions contiene una cadena y si está en modo seguro habrá un "SABOBOOT: ???" dentro de la cadena donde ??? es MÍNIMO o RED. Esto se actualiza en cada arranque.

Alano
fuente