电脑用着用着就自动关机怎么回事 电脑运行一段时间后自动关机的原因( 二 )


Microsoft-Windows-Kernel-Power 则是两个不同的来源 。
从用户或程序层面进行分析User32 是一个 Windows 系统应用程序源,它包含了许多与用户界面相关的函数,如窗口创建、消息处理、控件操作等等;它还会负责处理用户交互方面的任务,例如鼠标、键盘输入和窗口管理等 。
因此由用户或是程序发起的事件,如登录、注销、锁定或解锁计算机等,都可以通过 User32 来源来定位 。而后 | 用于进一步处理 Get-EventLog 得到的数据,这里按照 EventID 事件 ID 来group 成组 。

电脑用着用着就自动关机怎么回事 电脑运行一段时间后自动关机的原因

文章插图
目前我电脑中只有 1074 这个事件,这个 1074 事件是计算机的正常关机的主要表现形式 。如果 User32 有其他的 EventID 那么用下面的命令进一步分析:
# 本例中依然用 1074 做分析 Get-Eventlog -LogName System -Source “User32”-Newest 1 | Where-Object { $_.EventID -eq 1074} | fl *
前面的命令就不再赘述了,-Newest 1 表示选取最近的一个日志,| 用于进一步筛选 Get-EventLog 得到的数据 。Where-Object 表示筛选一个对象数组,$_ 表示当前处理的对象(也就是 | 传递过来的数据 ),.EventID 表示对象的 EventID 属性,-eq 是一个比较运算符,表示等于,这里等于的 1074 这个事件 。| 依然是用于进一步处理 Where-Object 得到的数据,由 fl(也可以用完整写法 Format-List 替代)格式化输出对象的 * 所有属性 。
电脑用着用着就自动关机怎么回事 电脑运行一段时间后自动关机的原因

文章插图
找到其中的Reason Code: 0x80020010可以得知这是一个计划内的关机请求,如果不是服务器的话,这一般由 Windows Update 自动更新发起;而由用户发起的关机则会被标识为 0x0 。以下是常见的 Reason Code 所表示的含义:
电脑用着用着就自动关机怎么回事 电脑运行一段时间后自动关机的原因

文章插图
蓝屏问题导致关机或重启,还可以进一步下方的命令进行分析 。
从电源管理相关的事件入手进行分析不过很多意外关机的事件,比如蓝屏导致的,无法被 User32 捕获,因此从
Microsoft-Windows-Kernel-Power 获取电源状态、电源事件以及与电源管理相关的错误和警告信息得到更多的信息 。
Get-EventLog -LogName System -Source “Microsoft-Windows-Kernel-Power” | Where-Object { $_.EventID -eq 41 }
代码中相似的内容不再赘述,在
Microsoft-Windows-Kernel-Power和意外关机有关的 EventID 是 41,这个事件通常是在意外关机后重启的阶段中生成的 。输入上面的命令以后,Powershell 会输出一段包含十进制 BugcheckCode 的内容,首先需要将它转换为十六进制,以做进一步分析 。
如 159 等同于 0x0000009f,209 等同于 0x000000d1 等等,转换后的十六进制就可以得到最终的含义了 。BugcheckCode 内容也和蓝屏时输出的错误码是相同的内容,有的时候蓝屏代码一跳而过,所以这也是找到问题的好办法 。以下是常见的错误的代码以及含义 :
电脑用着用着就自动关机怎么回事 电脑运行一段时间后自动关机的原因

文章插图
由于错误码的种类繁多,因此这里不太可能一一列举 。另外还需要注意的是,同一个错误可能会有不同的原因而导致,排查时可以从近期的软件改动入手去寻找电脑意外关机的原因,排查完软件以后才是排查硬件的真正时机 。
关于 Powershell 7 使用中的一些细节值得注意的是,Get-EventLog 只能使用 Windows 内的 Powershell 运行;Powershell 7 中因为相关 API 已被弃用,会提示无效指令,因此需要换用Get-WinEvent命令:
#命令 1Get-WinEvent -ProviderName ‘User32’ | group EventID#命令 2Get-WinEvent -ProviderName ”
Microsoft-Windows-Kernel-Power” | Where-Object { $_.EventID -eq 41}#命令 2 改进版Get-WinEvent -FilterHashtable @{ProviderName = “Microsoft-Windows-Kernel-Power”; Id = 41}
【电脑用着用着就自动关机怎么回事 电脑运行一段时间后自动关机的原因】Get-WinEvent 是 Powershell 7 中获取 Windows 日志的新命令,不同于此前的 Get-EventLog 能同时筛选具体的事件日志 -LogName 和事件源 -Source;Get-WinEvent在使用时只能在筛选事件日志 -Logname 和事件源 -ProviderName 中二选一 。Get-WinEvent 还 可以使用一个新的写法 -FilterHashtable,降低命令长度的同时提高索引效率 。

推荐阅读