【问题标题】:Get the date-time of last windows shutdown event using .NET使用 .NET 获取上次 Windows 关闭事件的日期时间
【发布时间】:2009-10-27 16:12:32
【问题描述】:

有没有办法查出系统上次关闭的时间?

我知道有一种方法可以使用 Win32_OperatingSystem 命名空间中的 LastBootUpTime 属性(使用 WMI)找出上次启动时间。

有什么类似的可以查到上次关机时间吗?

谢谢。

【问题讨论】:

  • 您还需要考虑您是否关心机器何时断电 - 您不会为此获得事件。

标签: c# .net time wmi shutdown


【解决方案1】:

(此处所有内容均 100% 由 JDunkerley's earlier answer 提供)

解决方案如上,但从byte 数组到DateTime 的方法可以通过使用BitConverter 的更少语句来实现。以下六行代码执行相同操作并给出正确的@987654325 @来自注册表:

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

【讨论】:

  • 嗯,感谢您的接受,但这里提供的解决方案完全基于 JDunkerley 的回答,他应该获得所有功劳,基本上 ;-)
  • 计算机崩溃时似乎没有更新此值:(
  • @Pavenhimself:如果计算机崩溃,则在下一次启动 之后会在事件日志中创建一个事件(BSOD 本身显然会阻止将实际的 Shutdowntime 写入注册表,或其他任何事情,系统在 BSOD 上做的唯一事情就是创建一个转储文件)。您可以检查 EventID 6008,源 EventLog。要查找实际时间,请检查 BSOD 转储文件上的时间戳。
  • 谢谢 Abel,在 Log = "System" 和 Source = "EventLog" 中找到它,然后过滤 EventLogEntry for EventID == 6008 :) 就像一个魅力
  • 在 Windows 10 中“ShutdownTime”无法正常工作
【解决方案2】:

假设 Windows 顺利关闭。它将它存储在注册表中:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\ShutdownTime

它被存储为一个字节数组,但它是一个 FILETIME。

虽然可能有更好的方法,但我以前使用过,认为它有效:

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

【讨论】:

  • +1 好方法,我删除了我的帖子,因为这似乎更准确
  • 对不起,我忍不住了,似乎有更简单的方法可以将字节数组转换为DateTime,希望你不介意,但如果没有我就做不到你的答案:)
【解决方案3】:

使用这段代码可以找到上次重启时间

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

【讨论】:

  • OP 想要最后一次关机日期时间。上次重启时间不是一回事!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 2017-12-20
  • 2017-08-20
  • 2021-03-22
  • 2017-06-14
  • 1970-01-01
相关资源
最近更新 更多