如何知道Windows何时启动或closures?

我需要在C#中开发一个程序,找出Windows启动或closures的时间。

有一个日志文件,我可以阅读知道Windows启动和关机时间? 或者你有什么想法如何做?

编辑:

在Reed Copsey先生的帮助下,在这个问题下find了最好的答案。

您可以使用System.Diagnostics.Eventing.Reader中的类访问系统事件日志。

根据这篇文章,你可以使用WMI来获取最后一次启动日期/时间

// define a select query SelectQuery query = new SelectQuery(@"SELECT LastBootUpTime FROM Win32_OperatingSystem WHERE Primary='true'"); // create a new management object searcher and pass it // the select query ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); // get the datetime value and set the local boot // time variable to contain that value foreach(ManagementObject mo in searcher.Get()) { dtBootTime = ManagementDateTimeConverter.ToDateTime( mo.Properties["LastBootUpTime"].Value.ToString()); // display the start time and date txtDate.Text = dtBootTime.ToLongDateString(); txtTime.Text = dtBootTime.ToLongTimeString(); } 

正如里德指出的,你可以访问事件日志,看看它们是什么时候创建的。 AFAIK没有系统启动/关闭的特定事件条目,但是您可以查找通常在Windows启动/停止的服务。 虽然使用这种方法意味着它不会100%准确,比如说崩溃或手动启动/停止/重新启动。 我认为一个事件是最准确的EventLog服务启动/停止事件。

 if (EventLog.Exists("System")) { var log = new EventLog("System", Environment.MachineName, "EventLog"); var entries = new EventLogEntry[log.Entries.Count]; log.Entries.CopyTo(entries, 0); var startupTimes = entries.Where(x => x.InstanceId == 2147489653).Select(x => x.TimeGenerated); var shutdownTimes = entries.Where(x => x.InstanceId == 2147489654).Select(x => x.TimeGenerated); } 

编辑

结果发现有一个关机事件。 您可以替换Linq来获取它:

 var shutdownEvents = entries.Where(x => x.InstanceId == 2147484722); 

您可以使用“System Up Time”性能计数器来获取系统的启动时间:

  PerformanceCounter systemUpTime = new PerformanceCounter("System", "System Up Time"); systemUpTime.NextValue(); TimeSpan upTimeSpan = TimeSpan.FromSeconds(systemUpTime.NextValue()); Console.Out.WriteLine(DateTime.Now.Subtract(upTimeSpan).ToShortTimeString()); 

希望这可以帮助。

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

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

一些更多的选择:

System.Environment.TickCount有24.8天的限制。
这是因为TickCount是一个包含在32位有符号值中的毫秒值。