Come posso sapere se Windows è in esecuzione in modalità provvisoria?


14

Ho un server Windows che a volte si riavvia in modalità provvisoria dopo gli aggiornamenti. Sto lavorando a questo problema, ma quello che mi piacerebbe davvero sapere è come posso verificare se Windows funziona in modalità provvisoria o no.

Idealmente, vorrei incorporarlo in uno script che avrebbe inviato un controllo passivo alla nostra casella Nagios con lo stato.

Esiste una variabile ambientale che posso usare o un modo per ottenere queste informazioni dalla riga di comando?


1
Non esiste una "modalità utente singolo" su Windows ... stai parlando della modalità provvisoria?
Massimo

1
domanda aggiornata e cambiato "modalità utente singolo" in "modalità sicura" - le mie scuse
cwd

La domanda è in realtà interessante, ho cercato su Google un po 'e non sono riuscito a trovare un modo ragionevole (come in "senza essere un driver di dispositivo") per verificare a livello di programmazione se un sistema funziona in modalità provvisoria ... ma per favore accetta la risposta di @ joeqwerty, mentre parlava di Servizi terminal.
Massimo

3
Lo stai facendo del tutto sbagliato. Se hai un server che a volte si avvia in modalità provvisoria, dovresti cercare la causa principale, non un modo per trattare il sintomo. Il server lo farà solo dopo un grave arresto. Scopri cosa sta causando gli arresti anomali e correggilo.
John Gardeniers,

2
@JohnGardeniers, a dire il vero, ha detto che sta lavorando al problema ...
Massimo

Risposte:



8

Secondo questo articolo , una variabile di ambiente chiamata SAFEBOOT_OPTIONè impostata su Minimalo Networkse il sistema è avviato in modalità provvisoria o in modalità sicura con rete; in caso contrario, la variabile non è impostata.

Un test sul valore della variabile dovrebbe fare il trucco; tuttavia, tieni presente che se il sistema è effettivamente in esecuzione in modalità provvisoria, non avrà reti per cominciare, quindi segnalarne lo stato potrebbe essere ... difficile.


Confermato anche in un riavvio rapido in Modalità provvisoria.
Massimo

3

EDIT: mio male, non ho letto abbastanza bene la KB per rendermi conto che è praticamente inutile come risposta da solo.

Un modo più utile per determinare se si è in modalità provvisoria di non è da : Microsoft® Windows® Internals: Microsoft Windows ServerTM 2003, Windows XP, and Windows 2000da Mark E. Russinovich, David A. Solomon .

Il kernel di Windows esegue la scansione dei parametri di avvio alla ricerca degli switch in modalità provvisoria durante l'avvio e imposta la variabile interna InitSafeBootMode su un valore che rifletta gli switch trovati dal kernel. Il kernel scrive il valore InitSafeBootMode nel valore del registro HKLM \ SYSTEM \ CurrentControlSet \ SafeBoot \ Option \ Option in modo che i componenti in modalità utente, come SCM, possano determinare in quale modalità di avvio si trova il sistema.

Prendi il sopra e abbina il sotto, e avrai una posizione del registro che puoi controllare con un valore numerico che puoi tradurre in qualcosa di utile.

Dal supporto.microsoft KB intitolato "Come determinare se il sistema è in esecuzione in modalità provvisoria da un driver di dispositivo".

Il kernel del sistema operativo Windows esporta un puntatore a una variabile ULONG che si chiama InitSafeBootMode. Questa variabile contiene le impostazioni della modalità provvisoria.

Un driver di dispositivo può determinare se il sistema è in esecuzione in modalità provvisoria in base al valore della variabile InitSafeBootMode. Un valore pari a 0 indica che il sistema non è in esecuzione in modalità provvisoria.

La tabella seguente elenca le modalità per altri valori.
Value Mode
1 SAFEBOOT_MINIMAL
2 SAFEBOOT_NETWORK
3 * SAFEBOOT_DSREPAIR
* Nota Il valore di 3 si applica solo ai controller di dominio Windows.


Un modo per verificarlo tramite la riga di comando o avrei bisogno di scrivere un'applicazione in grado di verificare InitSafeBootMode?
Cwd

Questo è ciò a cui mi riferivo con il mio commento "Non riuscivo a trovare un modo ragionevole" ... anche se potessi scrivere un driver di dispositivo per verificarlo, farlo funzionare sul sistema di destinazione sarebbe piuttosto complicato.
Massimo

@cwd Avresti effettivamente bisogno di un driver in modalità kernel. E averlo installato. E in esecuzione anche in modalità provvisoria. E poi un'applicazione per parlare con l'autista e segnalarne lo stato. Questo sarebbe davvero brutto molto in fretta.
Massimo

1
@cwd ecco, non ho controllato abbastanza attentamente quando ho trovato il link alla KB. La risposta dovrebbe contenere informazioni utili per te ora.
HopelessN00b,

@ HopelessN00b Confermato (in realtà ho riavviato in modalità provvisoria per verificare). La chiave HKLM\SYSTEM\CurrentControlSet\SafeBoot\Optionnon esiste affatto su un sistema in modalità non sicura, ma su una modalità provvisoria.
Massimo

3

Puoi anche eseguire la query WMI suggerita da Craig620 direttamente dalla riga di comando, se non stai usando PowerShell:

> wmic COMPUTERSYSTEM GET BootupState

BootupState
Normal boot

1

HKLM \ SYSTEM \ CurrentControlSet \ Control \ SystemStartOptions contiene una stringa e se sei in modalità provvisoria ci sarà un "SAFEBOOT: ???" all'interno della stringa dove ??? è MINIMO o RETE. Questo viene aggiornato ad ogni avvio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.