如何获取Windows最后一次重启的原因。

103

我想知道是否存在Windows API函数可以提供有关上次Windows重新启动来源的信息。可能有三种主要原因:

  1. 计算机在蓝屏时崩溃
  2. 用户或程序关闭/重新启动计算机
  3. 电源丢失

我能得到的细节越多越好。但是,我至少需要知道其中的主要原因。

我需要支持Windows Vista和Windows 7。

答案:

似乎没有直接的API可以获取该信息。相反,我们必须收集Windows事件日志。系统重新启动信息位于Event Viewer / Windows Logs / System中。以下是事件ID提供的各种信息:

  • 6005:Windows启动
  • 6006:Windows关闭(正确关闭)
  • 6008:Windows关闭(意外关闭)

我还不太明白电源丢失和系统崩溃之间的区别,但这是一个好的开始。


可能重复:http://stackoverflow.com/questions/1315858/get-windows-server-shutdown-reason-in-c - George Johnston
5
本篇文章涉及C#,我需要Windows API(C/C++)的内容翻译。 - Frederic
4个回答

123

这篇文章详细介绍了如何查找最后一次启动/关闭的原因。在我的情况下,这是由于Windows SCCM推送更新,即使我在本地禁用它也是如此。请访问文章以获取完整的详细信息和图片。以下是从网站复制粘贴的步骤:

  1. 按下 Windows + R 键打开 运行 对话框,输入 eventvwr.msc,然后按 Enter

  2. 如果提示 UAC,请点击/点按是(Windows 7/8)或继续(Vista)。

  3. 事件查看器 的左侧窗格中,双击/点按 Windows 日志 展开它,点击/点按 系统 选择它, 然后右键点击 系统 并点击/点按 筛选当前日志

  4. 根据您想要查看的关闭事件执行步骤5或6中的任一个。

  5. 要查看计算机所有用户关闭计算机的日期和时间

    A) 在 事件来源 中,点击/点按下拉箭头并勾选 USER32 框。

    B) 在 所有事件 ID 字段中,输入 1074,然后点击/点按 确定

    C) 这将在事件查看器中间窗格的顶部给您一个关于关闭类型为 Power off (关闭电源) 和 restart shutdown 类型的事件列表。

    D)您可以滚动查看这些列出的事件,以找到关闭类型为 Power off 的事件。您会注意到日期、时间以及哪个用户负责关闭计算机的每个 Power off 事件。

    E)继续执行步骤7。

  6. 查看计算机的所有意外关机时间和日期

    A. 在“全部事件 ID”字段中键入6008,然后单击/点按“确定”。

    B. 这将在“事件查看器”的中间面板顶部显示未预期关闭事件列表。您可以滚动浏览这些列出的事件以查看每个事件的日期和时间。

  7. 完成后,您可以关闭事件查看器。


其他有用的事件 ID (来源)

ID 描述
41 系统在没有正常关闭的情况下重新启动。
1074 系统已经由用户或进程正确关闭。
1076 跟随事件 ID 6008,表示在意外重启或关闭后,第一个具有关闭特权的用户登录到服务器并指定原因。
6005 事件日志服务已启动。表示系统启动。
6006 事件日志服务已停止。表示正确的系统关闭。
6008 上一个系统关闭是意外的。
6009 检测到的操作系统版本在系统启动时。
6013 系统运行时间(以秒为单位)。

1
太好了。我使用了带有USER32的事件源过滤器,发现戴尔恢复正在重新启动我的系统。 - max
1
谢谢!使用事件ID为6008的过滤系统事件,列出导致关机的关键事件。 - Noam Manos
这本质上是一个仅包含链接的回答。如果链接变得无法访问,这个回答将不再提供任何有用的信息。另外,OP正在寻求一个API调用。你的链接通过引导用户完成一系列手动步骤来提供答案。这并不能构成求解所问问题的解决方案。 - IInspectable
很奇怪..它告诉我管理员正在调用关机。最近发生得更频繁了,甚至注意到每隔几分钟就会发生一次。我一定被攻击了 :( - Piotr Kula
2
如果系统由于错误检查/蓝屏而重新启动,则事件ID将为1001,而不是6008。此链接包含有关事件查看器中可能找到的不同错误检查代码的解释 - aviraldg
由于Windows 10上的一个bugcheck,我刚刚重新启动了计算机,它具有6008和1001事件ID。1001(bugcheck报告)是更具信息性的一个。6008仅说明“<日期+时间>之前的系统关闭是意外的”,但未给出原因。 - Fred vdP

19

请查看事件日志 API。如果出现情况 a)(蓝屏、用户断电或系统挂起),则会在下一次正确重启系统时在“系统”事件日志中留下一条注释(类似于“系统未正确关闭”)。您应该能够使用上述 API 以编程方式访问它(老实说,我从未使用过,但它应该能够工作)。


2
找到了,它在系统事件日志中。 - Frederic
3
我注意到当系统冻结时会出现这个信息:“系统在关机前没有干净地关闭就重新启动了。如果系统无响应、崩溃或不可预期地停电,可能会出现此错误。” 这似乎是一条通用信息。 有人知道是否有办法区分蓝屏和系统冻结吗? - Luiz C.

16
您可以使用此 PowerShell 脚本自动化过去 5 天的调查:
$today = Get-Date
$startDay = $today.AddDays(-5)
$eventIds=(6005,6006,6008,6009,1074,1076,12,13,43,109)
$systEvents=Get-WinEvent -LogName System 
$rebootEvents=$systEvents| Where-Object {$_.TimeCreated -gt $startDay} | Where-Object {$_.Id -in $eventIds}  
format-table TimeCreated,Id,Message -AutoSize -wrap -InputObject $rebootEvents

enter image description here


-1

有一种简单的方法可以使用PowerShell。

PowerShell "Get-WinEvent -FilterHashtable @{logname = 'System'; id = 1074, 6005, 6006, 6008} -MaxEvents 6 | Format-Table -wrap"

你也可以设置要显示的最大事件数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接