.NET를 사용하여 마지막 Windows Shutdown 이벤트의 날짜 시간을 얻으십시오.

StackOverflow https://stackoverflow.com/questions/1631933

  •  06-07-2019
  •  | 
  •  

문제

시스템이 마지막 종료시기를 알 수있는 방법이 있습니까?

나는 마지막 부트 업 시간을 사용하여 lastbootuptime 속성 Win32_operatingsystem 네임 스페이스 사용 WMI.

마지막 종료 시간을 찾는 것과 비슷한 점이 있습니까?

감사.

도움이 되었습니까?

해결책

(여기의 모든 것은 100%의 예의입니다 Jdunkerley의 이전 답변)

해결책은 위에 있지만 byte 배열 DateTime 더 적은 수의 진술로 달성 할 수 있습니다 BitConverter. 다음 6 줄의 코드는 동일하게하고 올바른 DateTime 레지스트리에서 :

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);
}

다른 팁

Windows가 부드럽게 종료되었다고 가정합니다. 레지스트리에 저장합니다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\ShutdownTime

바이트 배열로 저장되지만 필더 타임입니다.

더 나은 방법이있을 수 있지만, 나는 이것을 전에 사용했고 그것이 효과가 있다고 생각합니다.

    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;
    }

마지막 재시작 시간은이 코드를 사용하여 찾을 수 있습니다.

static void Main(string[] args)
    {          
        TimeSpan t = TimeSpan.FromMilliseconds(System.Environment.TickCount);
        Console.WriteLine( DateTime.Now.Subtract(t));          
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top