Holen Sie sich das Datum-Uhrzeit der letzten Fenster Shutdown-Ereignis mit .NET
Frage
Gibt es eine Möglichkeit, um herauszufinden, wenn das System wurde zuletzt Abschaltung?
Ich weiß, es ist ein Weg, letztes Boot, um herauszufinden, Zeit der LastBootUpTime Immobilien in Win32_OperatingSystem Namespace WMI verwenden.
Gibt es etwas ähnliches letzte Abschaltzeit, um herauszufinden?
Danke.
Lösung
(hier ist alles zu 100% mit freundlicher Genehmigung von JDunkerley frühere Antwort )
Die Lösung ist oben, aber der Ansatz von einer byte
Array geht mit weniger Aussagen mit dem DateTime
.The folgenden sechs Zeilen Code des gleiche tun erreicht BitConverter
werden und dem richtigen DateTime
aus der Registrierung geben:
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);
}
Andere Tipps
Unter der Annahme, Herunterfahren von Windows ist reibungslos. Er speichert es in der Registrierung:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\ShutdownTime
Es ist, als ein Array von Bytes gespeichert, sondern ist ein FILE.
Auch wenn es eine bessere Art und Weise sein, habe ich diese verwendete vor 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;
}
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));
}