我需要在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位有符号值中的毫秒值。