在對系統進(jìn)行日志分析和審核時(shí),系統管理員經(jīng)常都需要手動(dòng)去篩選并統計出 Windows 的關(guān)機事件。以前我一直都是直接在事件查看器中進(jìn)行手動(dòng)篩選,如果你要管理的服務(wù)器很多,手動(dòng)操作起來(lái)會(huì )十分麻煩并低效率。所以想起了用 PowerShell 的 Get-EventLog cmdlet 來(lái)自動(dòng)篩選 Windows 事件日志中的關(guān)機事件。
使用Get-EventLog cmdlet超簡(jiǎn)單
Windows 中提供了 2 個(gè)分析事件日志的 PowerShell cmdlet:一個(gè)是Get-WinEvent,超級強大,但使用起來(lái)比較麻煩;另一個(gè)是Get-EventLog,使得起來(lái)相當簡(jiǎn)單,可以實(shí)時(shí)篩選。今天我們就來(lái)細說(shuō)一下Get-EventLog的簡(jiǎn)單用法。
從 Windows XP 和 Windows Server 2003 開(kāi)始,Windows 中便有了關(guān)機事件跟蹤程序,它可以跟蹤 Windows 操作系統的關(guān)機事件并將其寫(xiě)入到來(lái)源為 USER32 的系統日志當中。因此,我們便可以直接使用 Get-EventLog cmdlet 到系統日志中搜索這樣的信息:
Get-EventLog -LogName system -Source user32
通常對于管理員或用戶(hù)來(lái)說(shuō),關(guān)機事件也是有 2 種的,即:正常關(guān)機和非正常關(guān)機事件。通常我們都僅關(guān)心如藍屏、掉電等引起的非正常關(guān)機事件。
在關(guān)機事件的篩選上,我們可以使用如下命令按 EventID 將事件進(jìn)行分組:
Get-EventLog -LogName system -Source user32 | group EventID
從上圖中可以看到,我們目前僅有 EventID: 1074 的事件共 25 次。
如果你想查看關(guān)機事件的詳細信息,我們可以將其丟到 Format-List cmdlet 來(lái)格式化輸出。(fl 是 Format-List 的別名)
Get-EventLog -LogName system -Source user32 -Newest 1 | fl *
詳細信息的輸出包括:機器名、事件生成時(shí)間、用戶(hù)名、消息等一條串內容,對于這些信息我們可以挑有用的進(jìn)行選擇性輸出。例如,我們只對關(guān)機事件的生成時(shí)間(TimeGenerated)和消息(Message)感興趣,就可以這樣來(lái)輸出。
Get-EventLog -LogName system -Source user32 | Select TimeGenerated, Message
從上圖中我們可以看到關(guān)機事件的排序是按時(shí)間順序進(jìn)行排列的,如果你希望按關(guān)機事件的發(fā)起進(jìn)程分類(lèi)排序可以這樣寫(xiě):
Get-EventLog -LogName system -Source user32 | Select TimeGenerated, Message | sort message
這樣看起來(lái)就好一點(diǎn)了,不過(guò) Message 列的輸出太長(cháng),我們再來(lái)整理下:
Get-EventLog -LogName system -Source user32 | Select TimeGenerated, Message | sort message | ft -Wrap
到這里大家對使用 PowerShell 的 Get-EventLog cmdlet 來(lái)篩選 Windows 事件日志中的關(guān)機事件應該有個(gè)初步了解了,使用起來(lái)是不是非常簡(jiǎn)單。使用 PowerShell 的遠程管理等特性,就可以批量在服務(wù)器上執行信息收集,非常方便。