電腦用著用著就自動關機怎么回事 電腦運行一段時間后自動關機的原因( 二 )


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,降低命令長度的同時提高索引效率 。

推薦閱讀