Como posso saber se o Windows está sendo executado no modo de segurança?

14

Eu tenho um servidor Windows que às vezes reinicia no modo de segurança após as atualizações. Estou trabalhando nessa questão, mas o que eu realmente gostaria de saber é como posso verificar se o Windows está sendo executado no modo de segurança ou não.

Idealmente, gostaria de incorporá-lo a um script que envie uma verificação passiva para a nossa caixa do Nagios com o status

Existe alguma variável ambiental que eu possa usar ou alguma maneira de obter essas informações através da linha de comando?

cwd
fonte
1
Não existe um "modo de usuário único" no Windows ... você está falando sobre o Modo de segurança?
Massimo
1
atualizados questão e mudou "modo de usuário único" para "modo de segurança" - as minhas desculpas
CWD
A pergunta é realmente interessante, pesquisei um pouco e não consegui encontrar uma maneira razoável (como em "sem ser um driver de dispositivo") para verificar programaticamente se um sistema está sendo executado no modo de segurança ... Estou votando, mas inaceite a resposta de @ joeqwerty, pois ele estava falando sobre os Serviços de Terminal.
Massimo
3
Você está fazendo isso completamente errado. Se você possui um servidor que algumas vezes inicializa no modo de segurança, deve procurar a causa raiz, não uma maneira de tratar o sintoma. O servidor só fará isso após uma falha grave. Descubra o que está causando as falhas e corrija-o.
John Gardeniers
2
@JohnGardeniers, para ser honesto, ele disse que está trabalhando sobre a questão ...
Massimo

Respostas:

23

Eu acho que isso faz o que você está procurando

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

Possíveis valores de retorno:

Inicialização normal
Inicialização à prova de falhas
À prova de falhas com inicialização de rede
Clayton
fonte
Niiiiiiiiice ...
Massimo
Dito de outra forma: (gwmi win32_computersystem -Property BootupState).BootupState
Jaykul 23/09/2015
8

De acordo com este artigo , uma variável de ambiente chamada SAFEBOOT_OPTIONé definida como Minimalou Networkse o sistema for iniciado no Modo de Segurança ou no Modo de Segurança com Rede; caso contrário, a variável não está definida.

Um teste no valor da variável deve fazer o truque; no entanto, lembre-se de que, se o sistema estiver realmente executando no modo de segurança, ele não terá rede para começar, portanto, reportar seu status pode ser ... difícil.

Massimo
fonte
Também confirmou isso em uma reinicialização rápida do modo de segurança.
Massimo
3

Edição: meu mal, eu não li o KB completamente o suficiente para perceber que é basicamente inútil como resposta por si só.

Uma maneira mais útil de determinar se você está no modo de segurança é : Microsoft® Windows® Internals: Microsoft Windows ServerTM 2003, Windows XP, and Windows 2000de Mark E. Russinovich, David A. Solomon .

O kernel do Windows verifica os parâmetros de inicialização em busca das opções de modo de segurança no início da inicialização e define a variável interna InitSafeBootMode como um valor que reflete as opções encontradas pelo kernel. O kernel grava o valor InitSafeBootMode no valor do Registro HKLM \ SYSTEM \ CurrentControlSet \ SafeBoot \ Option \ Option Value para que componentes do modo de usuário, como o SCM, possam determinar em que modo de inicialização o sistema está.

Pegue o acima e emparelhe com o abaixo, e você terá um local de registro que poderá verificar com um valor numérico que possa ser traduzido em algo útil.

No support.microsoft KB intitulado "Como determinar se o sistema está sendo executado no Modo de Segurança a partir de um driver de dispositivo".

O kernel do sistema operacional Windows exporta um ponteiro para uma variável ULONG denominada InitSafeBootMode. Essa variável contém as configurações do modo de segurança.

Um driver de dispositivo pode determinar se o sistema está sendo executado no modo de segurança pelo valor da variável InitSafeBootMode. Um valor 0 significa que o sistema não está sendo executado no modo de segurança.

A tabela a seguir lista os modos para outros valores. Modo de
valor 1 SAFEBOOT_MINIMAL 2 SAFEBOOT_NETWORK 3 * SAFEBOOT_DSREPAIR * Observação O valor de 3 se aplica apenas aos controladores de domínio do Windows.



HopelessN00b
fonte
Alguma maneira de verificar isso através da linha de comando ou eu precisaria escrever um aplicativo que pudesse verificar InitSafeBootMode?
Cwd
É a isso que eu estava me referindo com o meu comentário "Não consegui encontrar uma maneira razoável" ... mesmo se você pudesse escrever um driver de dispositivo para verificar isso, fazê-lo rodar no sistema de destino seria bastante complicado.
Massimo
@cwd Você realmente precisaria de um driver no modo kernel. E para instalá-lo. E funcionando mesmo no modo de segurança. E, em seguida, um aplicativo para conversar com o motorista e relatar seu status. Isso ficaria muito feio muito rápido.
Massimo
1
@ CWD lá vai você, não verifiquei de perto o suficiente quando eu encontrei o link para o KB. A resposta deve conter informações úteis para você agora.
HopelessN00b
@ HopelessN00b Confirmado (na verdade, reiniciei no Modo de Segurança para verificar). A chave HKLM\SYSTEM\CurrentControlSet\SafeBoot\Optionnão existe em um sistema que não seja do modo seguro, mas existe em um sistema do modo seguro.
Massimo
3

Você também pode executar a consulta WMI sugerida por Craig620 diretamente na linha de comando, se você não estiver usando o PowerShell:

> wmic COMPUTERSYSTEM GET BootupState

BootupState
Normal boot
Massimo
fonte
1

HKLM \ SYSTEM \ CurrentControlSet \ Control \ SystemStartOptions contém uma sequência e, se você estiver no modo de segurança, haverá um "SAFEBOOT: ???" dentro da string onde ??? é MINIMAL ou REDE. Isso é atualizado em cada inicialização.

Allan
fonte