【发布时间】:2011-01-01 23:21:33
【问题描述】:
是否有任何“引导会话 ID”或(可靠的)“引导时间戳”? 对于安装,我需要检测确实发生了预定的重启。
我想我可以用MOVEFILE_DELAY_UNTIL_REBOOT 做一个虚拟的MoveFileEx(),但我确实希望更简单一些。
(我们必须安装一个在修复/更新后有时会出现异常行为的第三方包。在这种状态下,访问设备甚至可能会锁定系统)
(Windows XP、Vista、7)
【问题讨论】:
是否有任何“引导会话 ID”或(可靠的)“引导时间戳”? 对于安装,我需要检测确实发生了预定的重启。
我想我可以用MOVEFILE_DELAY_UNTIL_REBOOT 做一个虚拟的MoveFileEx(),但我确实希望更简单一些。
(我们必须安装一个在修复/更新后有时会出现异常行为的第三方包。在这种状态下,访问设备甚至可能会锁定系统)
(Windows XP、Vista、7)
【问题讨论】:
对于这样的事情,WMI(Windows Management Instrumentation)通常是一个很好的起点。我知道您可以直接通过它获取当前的正常运行时间,这可以让您确定机器最近是否重新启动。
这是一篇博客文章,其中也包含一些代码示例: http://blogs.technet.com/heyscriptingguy/archive/2004/09/07/how-can-i-tell-if-a-server-has-rebooted.aspx
根据您的实现语言,您可能只想从 vbscript 中提取查询代码。
【讨论】:
显然 Windows 相当于“正常运行时间”。这里有更多信息:http://support.microsoft.com/kb/555737
据我了解,这应该告诉您系统启动了多久。这些信息能解决您的问题吗?
【讨论】:
您可以在系统事件日志中从 EventLog 源中搜索事件 6009 - 这是每次重启后记录的第一个事件。
【讨论】:
我认为这里已经给出了最好的答案:Find out if computer rebooted since the last time my program ran?
这似乎是最简单的方法。使用GlobalFindAtom() 查看它是否存在并创建它,如果不存在则使用GlobalAddAtom()。它会在你的程序执行之后持续存在。如果您的应用程序再次运行,并且看到原子存在,那么它不是自重启后的第一次运行。
如果计算机重新启动,则原子将不存在,表明这是您的程序自重新启动后的第一次运行。
【讨论】: