2012-05-21 5 views
5

Ich verwende den Gruppenrichtlinien-Editor, der Teil von Windows 7 (auch von Windows XP) ist, um ein sogenanntes Shutdown-Skript auszuführen, das bei jedem Herunterfahren oder Neustarten des Systems automatisch ausgeführt wird. Mein Problem ist: Ich muss in meinem Skript wissen, ob der Benutzer das System heruntergefahren hat oder ob er stattdessen einen Neustart gewählt hat. Beide Aktionen führen dazu, dass Windows das Shutdown-Skript ausführt, aber wie kann ich während dieser Skriptausführung feststellen, welche Aktion tatsächlich ausgeführt wurde?In Windows 7-Skript, wie kann ich feststellen, ob das aktuelle Herunterfahren des Systems tatsächlich ein Neustart ist?

Gibt es eine Möglichkeit, während des Herunterfahrens zu wissen, ob das System gerade heruntergefahren oder neu gestartet wird?

Antwort

8

Auf Pre-Vista-Systemen Sie die Registry abfragen können:

Der Shutdown Setting DWORD unter HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer speichert die Einstellung zuletzt aus der Liste auf dem Shut Down Windows-Dialog-Box für den aktuellen Benutzer ausgewählt gefunden.

Auf neueren Systemen, können Sie das -System Eventlog im Shutdown-Skript, wie diese Abfrage:

$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

Vielen Dank, das ist auch der Fall, wenn das Herunterfahren oder Neustarten programmatisch durchgeführt wurde, oder über Kommandozeile, wie wenn Sie „shutdown.exe -r“ oder „shutdown.exe -s“ vom cmd- laufen Fenster? Ich würde wirklich gerne Herunterfahren oder Neustart erkennen, egal wie es initiiert wurde. – Erik

+0

Ergänzung zu meiner vorherigen Antwort: Leider ist dieser Wert nicht auf einem meiner Windows 7-Systeme vorhanden, und es ist auch nicht beim Herunterfahren vorhanden, schrieb ich ein kleines VB-Skript für diesen Wert beim Herunterfahren/Neustart, aber die Registrierung Wert ist einfach nicht vorhanden. Können Sie bitte überprüfen, ob dieser Wert auf Ihrem Win7-Rechner vorhanden ist? Sind diese Informationen für Win7 überhaupt noch gültig? – Erik

+0

Die Antwort für Windows Vista/7 wurde aktualisiert –

1

Dieses Bash-Code verwendet die wevtutil.exe Dienstprogramm, um zu bestimmen, ob das System neu startet. Die Migration zum Batch-Skript sollte nicht schwierig sein. Ersetzen Sie für nicht-Englisch Windows mit dem äquivalenten Begriff, der in dem Ereignisprotokoll registriert wird. This blog post behandelt das Problem mit weiteren Details.

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 
Verwandte Themen