如何获取Windows上次重启的原因

Fre*_*ric 57 windows winapi reboot shutdown

我想知道什么是Windows API函数(如果存在),它提供有关上一次Windows重新启动源的信息.有三个主要可能的原因:

  1. 电脑在蓝屏上坠毁
  2. 用户或程序关闭/重新启动计算机
  3. 失去了力量

我可以越多越好.但是,我至少需要知道主要原因是什么.

我需要支持Windows Vista和Windows 7.

回答:

似乎没有直接的API来获取该信息.相反,我们必须收获Windows事件日志.系统重新引导信息位于事件查看器/ Windows日志/系统中.以下是事件ID提供的各种信息:

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

我还没有看到断电和系统崩溃之间的区别,但这是一个好的开始.

Mah*_*nta 49

文章详细解释了如何找到最后一个启动/关机的原因.在我的情况下,这是由于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)这将为您提供关闭电源(关闭)的列表,并在事件查看器的中间窗格顶部重新启动关闭事件类型.

    D)您可以滚动浏览这些列出的事件,以查找关闭电源的事件作为关闭类型.您将注意到日期和时间,以及用户在列出的每个断电事件中关闭计算机的责任.

    E)转到步骤7.

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

    A)在" 所有事件ID"字段中,键入6008,然后单击" 确定".

    B)这将为您提供事件查看器中中间窗格顶部的意外关闭事件列表.您可以滚动浏览这些列出的事件,以查看每个事件的日期和时间.

  • 如果系统由于 bugcheck/BSOD 而重新启动,事件 ID 将为 1001,而不是 6008。 [此链接包含您可能在事件查看器中找到的不同 bugcheck 代码的说明](https://learn.microsoft.com/ en-us/windows-hardware/drivers/debugger/bug-check-code-reference2)。 (2认同)

Ale*_*ler 17

看一下Event Log API.情况a)(蓝屏,用户切断电源和弦或系统挂起)导致系统重新正常重启时留在"系统"事件日志中的注释("系统未正确关闭"或类似情况).您应该能够使用上面的API以编程方式访问它(老实说,我从来没有使用它,但它应该工作).

  • 我注意到当系统冻结时会出现此消息:"系统已重新启动而没有先干净关闭.如果系统意外停止响应,崩溃或断电,可能会导致此错误." 这似乎是一般信息.有谁知道是否有办法区分蓝屏和系统冻结? (3认同)
  • 找到了它,它在系统事件日志中。 (2认同)

Thi*_*ard 17

您可以使用以下 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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述