PowerShell 2.0 實踐(六)管理Windows日志
上一次我們對Windows注冊表進行了簡單的管理操作,重在理解"項"和"值"的概念。練習了新建、修改、刪除、查看注冊表項、值的命令,此外,借助于.NET框架,我們同樣可以遠程管理注冊表,前提是遠程計算機上的"Remote Registry"服務要啟動。本次我們來重點關注一下Windows日志,Windows日志記錄了各種軟件、硬件發生的變化,當計算機出現問題時,方便管理員快速排錯、恢復計算機等。尤其在一些軟件安裝失敗時,根據日志中的EventID和詳細信息能夠幫助我們查找解決方案。
本系列所有腳本均在Windows Server 2008 R2 DataCenter (PowerShell 2.0) + PowerGUI Script Editor Free Edition x64中測試通過。
- Windows日志按嚴重程度區分有5種類型:
Error
Warning
Information
SuccessAudit
FailureAudit
從名稱就可以看出其相應含義,使用EventLogEntryType枚舉可以查看這些類型:
[enum]::GetNames([System.Diagnostics.EventLogEntryType])
運行結果:
在【開始】à【運行】輸入:eventvwr調出事件查看器,這里以Windows Server 2008 R2上的事件查看器為例,可以看到Windows內置的事件分類:
Windows按照程序、安全、安裝程序、系統等對日志進行了分類,對程序和服務還進行了更細粒度的分類,方便管理員查看特定應用程序的日志。當然,我們可以添加自定義的分類,稍后將練習這種操作。
2、PowerShell 2.0中關于日志操作的命令有如下一些:
Get-EventLog
Get-WinEvent
New-EventLog
Clear-EventLog
Remove-EventLog
Show-EventLog
Write-EventLog
Limit-EventLog
- 查看日志分類列表。
Get-EventLog –List
運行結果:
這里你可能會奇怪,怎么返回的分類這么少呢?剛才可是看到了很多的分類啊,這是因為從Windows Vista/2008開始,Windows使用了一種新的日志格式:.evtx,代替了之前的.evt,而Get-EventLog命令只能查看之前的日志格式。后面會看到如何查看.evtx格式的日志。
Get-EventLog提供了查看遠程計算機上日志的能力,類似的,只需要添加-ComputerName參數即可:
PS:今天的遠程測試有點杯具,本機連接VMWare中的虛擬機時老是有問題,一會提示RPC服務器不可用,一會認證失敗,于是用兩個虛擬機進行測試:
操作系統 | IP | 作用 |
Windows HPC Server 2008 R2 | 192.168.220.133 | 模擬本地計算機 |
Hyper-V 2008 R2 | 192.168.220.134 | 模擬遠程計算機 |
Get-EventLog -ComputerName 192.168.220.134 –List
運行結果:
- 在Windows Vista/2008/7/2008R2中,可以使用Get-WinEvent查看.evtx格式的日志。
Get-WinEvent -ListLog * | Select LogName,RecordCount
運行結果:
遠程調用時提示RPC服務器不可用,不知是哪里配置錯了:
- 查看指定類別的最新日志。
Get-EventLog -LogName "Windows PowerShell" -Newest 10 | Format-Table Index,Source,Message –AutoSize
運行結果:
遠程調用結果:
對于.evtx格式,這樣使用:
Get-WinEvent -LogName "Windows PowerShell" -MaxEvents 10 | Format-Table EventID,Source,Message –AutoSize
運行結果:
.evtx格式遠程調用依然出錯:
6、篩選日志信息,Windows日志存儲的內容非常多,如果不進行一些篩選,管理員難以獲取有價值的信息。
如:篩選日志信息中包含【vmware】的日志,
Get-EventLog -LogName System | Where {$_.Message -like "*vmware*"}
運行結果:
在【Windows PowerShell】類別中查詢EventID小于500的日志信息:
Get-EventLog -LogName "Windows PowerShell" | Where {$_.EventID -lt 500}
運行結果:
使用Format-List可以查看詳細信息:
Get-EventLog -LogName "Windows PowerShell" | Where {$_.EventID -lt 500} | Format-List
運行結果:
查詢自昨天這個時候到今天這個時候的日志,并按照EventID排序、分組:
Get-EventLog -LogName "Windows PowerShell" | Where {$_.TimeWritten -gt ((Get-Date).AddDays(-1))} | Sort EventID | Group EventID
運行結果:
- 使用Get-WinEvent命令還可以使用一些高級命令來進行篩選。
使用Hashtable進行篩選,注意,只能在Win7/2008 R2上使用:
Get-WinEvent -FilterHashtable @{LogName="Windows PowerShell";ProviderName="PowerShell"} | Where {$_.TimeCreated -gt (Get-Date).AddDays(-1)}
運行結果:
有效的鍵值對如下:
-- LogName=<String[]>
-- ProviderName=<String[]>
-- Path=<String[]>
-- Keywords=<Long[]>
-- ID=<Int32[]>
-- Level=<Int32[]>
-- StartTime=<DateTime>
-- EndTime=<DataTime>
-- UserID=<SID>
-- Data=<String[]>
-- *=<String[]>
通過XML來篩選。
在事件查看器中可以自定義篩選規則:
在Filter中填寫項篩選的規則:
在XML選項卡中可以看到自動生成的代碼:
將這段XML復制出來,在PowerShell中通過-FilterXml查詢:
$xml = @'
<QueryList>
<Query Id="0" Path="Windows PowerShell">
<Select Path="Windows PowerShell">*[System[(Level=3) and TimeCreated[timediff(@SystemTime) <= 43200000]]]</Select>
</Query>
</QueryList>
'@
Get-WinEvent -FilterXml $xml
運行結果:
因為EventLog使用了內置的XML來存儲,還可以使用XPath表達式進行篩選:
Get-WinEvent -LogName "System" -FilterXPath "*[System[EventID > 1000]]"
運行結果:
- 導入、導出日志。
Get-WinEvent -ListLog * | Export-Clixml -Path F:\PSTest\EventLog.clixml -Force
Import-Clixml -Path F:\PSTest\EventLog.clixml | Group Source
運行結果:
Clixml要優于csv格式,它將對象序列化為xml格式,方便后續的查詢。
使用記事本來查看其存儲結構:
- 讀寫日志。
創建一個類別為Script,來源為PSScript的日志類別:
New-EventLog -LogName Script -Source PSScript
運行結果:
向剛剛創建的這個類別中寫入一條日志:
Write-EventLog -LogName Script -Source PSScript -Message "Test" -EntryType "Information" -EventId 1
運行結果:
限制日志的容量,避免單個日志文件太大:
Limit-EventLog -LogName Script -MaximumSize 2MB
運行結果:
調用Event Viewer查看日志:
Show-EventLog
運行后將打開事件查看器。
清空、刪除日志(慎用):
Clear-EventLog -LogName Script
Remove-EventLog -LogName Script
小結:
本次我們練習了WIdnows系統日志的相關操作,重在設置不同的篩選條件來查詢我們感興趣的日志,熟練掌握這些命令后,將大大提高解決問題的效率。Get-WInEvent提供了一些高級的刪選命令,如Hashtable、XPath、XML等,可酌情使用。類似的WIdnows日志同樣允許遠程操作,但是這次我遇到了很多問題,主要分為兩類:RPC服務器不可用、無訪問權限。關于PowerShell的遠程管理是個很大的話題,后續篇章我們再討論,現在我也在找原因。Windows自帶了一個日志管理的命令行工具:wevtutil.exe,功能也很強大,后面我們專門來測試一下這個工具。

浙公網安備 33010602011771號