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.

War es hilfreich?

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));          
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top