2012-05-21 9 views
5

Uso l'editor di criteri di gruppo che fa parte di Windows 7 (anche di Windows XP) per eseguire uno script di spegnimento, che verrà eseguito automaticamente ogni volta che il sistema viene arrestato o riavviato. Il mio problema è: ho bisogno di sapere nel mio script se l'utente ha scelto di spegnere il sistema, o se ha selezionato il riavvio, invece. Entrambe le azioni fanno sì che Windows esegua lo script di chiusura, ma come posso determinare durante l'esecuzione dello script quale azione è stata effettivamente eseguita?In Windows 7 script, come posso determinare se l'attuale arresto del sistema è in realtà un riavvio?

C'è un modo per sapere, durante lo spegnimento, se il sistema esegue attualmente uno spegnimento o un riavvio?

risposta

8

Su sistemi pre-vista è possibile interrogare il Registro:

Il Shutdown Setting DWORD trovato sotto HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer memorizza l'impostazione selezionata più di recente dalla lista nella finestra di dialogo Chiudi sessione di Windows per l'utente corrente.

Su più recenti sistemi, è possibile interrogare il sistema Eventlog nello script di arresto, in questo modo:

$systemstateentry = get-eventlog -LogName system -Source User32 | ?{$_.eventid -eq 1074} | select -first 1 

switch -regex ($systemstateentry.message) 
    { 
     ".*restart.*" {"restart"} 
     ".*power off.*" {"power off"} 
     default {"unknown"} 
    } 
+0

Grazie mille, è questo vero anche se l'arresto o il riavvio è stato fatto programatically, o tramite riga di comando, come se si esegue "shutdown.exe -r" o "shutdown.exe -s" dal cmd- Finestra? Mi piacerebbe davvero riconoscere l'arresto o il riavvio, indipendentemente da come è stato avviato. – Erik

+0

In aggiunta alla mia risposta precedente: sfortunatamente, questo valore non è presente su nessuno dei miei sistemi Windows 7, e non è presente anche durante lo spegnimento, ho scritto un piccolo VB Script controllando quel valore durante lo spegnimento/riavvio, ma il registro il valore non è semplicemente presente. Potete verificare se questo valore è presente sulla vostra macchina Win7? Questa informazione è ancora vera per Win7? – Erik

+0

Aggiornamento della risposta per Windows Vista/7 –

1

Questo codice bash utilizza l'utilità wevtutil.exe per determinare se il sistema è in fase di riavvio. La migrazione allo script batch non dovrebbe essere difficile. Per Windows non inglese, sostituire restart con il termine equivalente registrato nel registro eventi. This blog post copre il problema con maggiori dettagli.

query='*[System[(EventID=1074) and TimeCreated[timediff(@SystemTime) <= 60000]]]' 
current_shutdown=$(wevtutil qe system -c:1 -rd:true -f:xml -q:"$query") 
rebooting=$(grep -iE "<data[^<>]*>restart</data>" <<<"$current_shutdown") 

if [[ -n "$rebooting" ]]; then echo 'System is rebooting' 
elif [[ -n "$current_shutdown" ]]; then echo 'System is shutting down' 
else echo 'System is neither rebooting nor shutting down'; fi 
Problemi correlati