2009-10-27 8 views
7

Gibt es eine Möglichkeit, um herauszufinden, wenn das System wurde zuletzt Abschaltung?Holen Sie sich das Datum-Uhrzeit der letzten Herunterfahren von Windows Ereignis .NET

Ich weiß, es gibt einen Weg letzte Boot-up-Zeit mit der LastBootUpTime Eigenschaft in Win32_OperatingSystem Namespace WMI, um herauszufinden.

Gibt es etwas Ähnliches, um die letzte Abschaltzeit herauszufinden?

Danke.

+3

Sie auch schon daran gedacht werden, ob Sie sich interessieren, wenn eine Maschine seine Kraft gezogen hat - du bist Ich werde dafür keine Veranstaltung bekommen. – serialhobbyist

Antwort

8

(hier ist alles zu 100% mit freundlicher Genehmigung von JDunkerley's earlier answer)

Die Lösung ist oben, aber der Ansatz von einem byte Array zu DateTime gehen kann mit weniger Anweisungen mit dem BitConverter erreicht werden. Die folgenden sechs Zeilen Code tun das gleiche und geben die richtige DateTime aus der Registrierung:

public static DateTime GetLastSystemShutdown() 
{ 
    string sKey = @"System\CurrentControlSet\Control\Windows"; 
    Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(sKey); 

    string sValueName = "ShutdownTime"; 
    byte[] val = (byte[]) key.GetValue(sValueName); 
    long valueAsLong = BitConverter.ToInt64(val, 0); 
    return DateTime.FromFileTime(valueAsLong); 
} 
+0

Hmm, vielen Dank für die Annahme, aber die hier angebotene Lösung basiert total auf JDunkerleys Antwort, er sollte grundsätzlich alles bekommen ;-) – Abel

+0

Es sieht so aus Wert wird nicht, wenn der Computer abstürzt aktualisiert :( – Pavenhimself

+1

@Pavenhimself: wenn der Computer abstürzt, ein Ereignis in den eventlog _after_ nächsten Start erstellt wird (die BSOD selbst verhindert offensichtlich die tatsächliche Shutdowntime in der Registrierung geschrieben werden, oder irgendetwas anderes was das betrifft, ist das einzige, was das System tut auf BSOD eine Dump-Datei) zu erstellen. Sie suchten nach EreignisID überprüfen 6008, Quelle EventLog. die aktuelle Zeit zu finden, überprüfen Sie die Zeitstempel auf der BSOD-Dump-Datei. – Abel

8

Angenommen, Windows wird problemlos heruntergefahren. Es speichert es in der Registrierung:

Es wird als ein Array von Bytes gespeichert, ist aber ein FILETIME.

Zwar gibt es einen besseren Weg sein, ich habe das vorhin verwendet und denke, es funktioniert:

public static DateTime GetLastSystemShutdown() 
    { 
     string sKey = @"System\CurrentControlSet\Control\Windows"; 
     Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(sKey); 

     string sValueName = "ShutdownTime"; 
     object val = key.GetValue(sValueName); 

     DateTime output = DateTime.MinValue; 
     if (val is byte[] && ((byte[])val).Length == 8) 
     { 
      byte[] bytes = (byte[])val; 

      System.Runtime.InteropServices.ComTypes.FILETIME ft = new System.Runtime.InteropServices.ComTypes.FILETIME(); 
      int valLow = bytes[0] + 256 * (bytes[1] + 256 * (bytes[2] + 256 * bytes[3])); 
      int valTwo = bytes[4] + 256 * (bytes[5] + 256 * (bytes[6] + 256 * bytes[7])); 
      ft.dwLowDateTime = valLow; 
      ft.dwHighDateTime = valTwo; 

      DateTime UTC = DateTime.FromFileTimeUtc((((long) ft.dwHighDateTime) << 32) + ft.dwLowDateTime); 
      TimeZoneInfo lcl = TimeZoneInfo.Local; 
      TimeZoneInfo utc = TimeZoneInfo.Utc; 
      output = TimeZoneInfo.ConvertTime(UTC, utc, lcl); 
     } 
     return output; 
    } 
+0

+1 feinen Ansatz, löschte ich meinen Beitrag, da dies viel genauer ist scheint es – Abel

+0

Entschuldigung, ich konnte nicht widerstehen, es scheint etwas leichter zu sein, um eine Byte-Array in eine 'DateTime' zu ​​konvertieren, hoffe, dass Sie don ' Aber bitte, ich hätte es ohne deine Antwort nicht schaffen können :) – Abel

4

Last Restart-Zeit kann mit diesem Stück Code gefunden werden

static void Main(string[] args) 
    {   
     TimeSpan t = TimeSpan.FromMilliseconds(System.Environment.TickCount); 
     Console.WriteLine(DateTime.Now.Subtract(t));   
    } 
Verwandte Themen