2009-10-27 3 views
7

Y a-t-il un moyen de savoir quand le système a été arrêté pour la dernière fois?Récupère la date et l'heure du dernier événement d'arrêt de Windows en utilisant .NET

Je sais qu'il ya un moyen de découvrir la dernière fois de démarrage à l'aide du LastBootUpTime propriété Win32_OperatingSystem espace de noms utilisant WMI.

Y a-t-il quelque chose de similaire pour connaître la dernière heure d'arrêt?

Merci.

+3

Vous aurez également besoin d'examiner si vous soin lorsqu'une machine a son pouvoir tiré - vous êtes ne va pas avoir un événement pour ça. – serialhobbyist

Répondre

8

(tout ici est 100% avec la permission de JDunkerley's earlier answer)

La solution est ci-dessus, mais l'approche de passer d'un tableau byte à DateTime peut être obtenue avec moins d'instructions en utilisant le BitConverter. Les six lignes de code suivantes font la même chose et donnent le bon DateTime du registre:

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, merci d'avoir accepté, mais la solution fournie ici est totalement basée sur la réponse de JDunkerley, il devrait recevoir tout le crédit, essentiellement ;-) – Abel

+0

Il semble que ce soit La valeur n'est pas mise à jour lorsque l'ordinateur tombe en panne :( – Pavenhimself

+1

@Pavenhimself: si l'ordinateur tombe en panne, un événement dans le journal des événements est créé _après_ le prochain démarrage (le BSOD lui-même évite évidemment que le Shutdowntime soit écrit dans le registre ou autre d'ailleurs, la seule chose que fait le système sur BSOD est de créer un fichier de vidage.) Vous pouvez vérifier EventID 6008, source EventLog Pour trouver l'heure réelle, vérifiez l'horodatage sur le Fichier de vidage BSOD. – Abel

8

En supposant que Windows soit arrêté correctement. Il stocke dans le Registre:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\ShutdownTime 

Il est stocké sous la forme d'un tableau d'octets, mais est un FILETIME.

Bien qu'il puisse y avoir une meilleure façon, j'ai utilisé auparavant et pense que cela fonctionne:

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 bonne approche, j'ai supprimé mon message, car c'est beaucoup plus précis, il semble – Abel

+0

désolé, je ne pouvais pas résister, il semble y avoir un moyen un peu plus facile de convertir un tableau d'octets en 'DateTime', j'espère que vous ne Mais je ne pourrais pas l'avoir fait sans votre réponse :) – Abel

4

La dernière fois que Restart peut être trouvé en utilisant ce morceau de code

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