Obtenir la date et l'heure du dernier événement d'arrêt de Windows à l'aide de .NET
Question
Existe-t-il un moyen de savoir quand le système a été arrêté pour la dernière fois?
Je sais qu'il existe un moyen de connaître l'heure du dernier démarrage à l'aide de la propriété LastBootUpTime dans Win32_OperatingSystem à l'aide de WMI . .
Y a-t-il quelque chose de similaire pour connaître l'heure du dernier arrêt?
Merci.
La solution
(tout ici est 100% gracieuseté de Réponse précédente de JDunkerley )
La solution est ci-dessus, mais l'approche consistant à passer d'un tableau octet
à DateTime
peut être réalisée avec moins d'instructions à l'aide du BitConverter
. Les six lignes de code suivantes font la même chose et donnent le DateTime
correct 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);
}
Autres conseils
En supposant que Windows s’arrête en douceur. Il le 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 existe peut-être un meilleur moyen, je l'ai déjà utilisé et je 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;
}
La dernière heure de redémarrage peut être trouvée en utilisant ce morceau de code
static void Main(string[] args)
{
TimeSpan t = TimeSpan.FromMilliseconds(System.Environment.TickCount);
Console.WriteLine( DateTime.Now.Subtract(t));
}