與PowerShell查詢Windows事件日誌

Jacki

Windows事件日誌是管理員跟踪操作系統,其組件或程序記錄的錯誤,警告和其他信息報告的重要工具。您可以使用事件查看器圖形MMC快照(eventvwr.msc)查看Windows事件日誌。在某些情況下,使用PowerShell來解析和分析事件日誌中的信息要方便得多。在本文中,您將學習如何使用加入cmdlet從Windows事件日誌中獲取信息。

內容:

Windows中當前可用兩個用於訪問事件日誌條目的CMDLET:Get-Eventlog加入。我們建議您在大多數情況下使用Get-WineVent,因為它更有生產力,尤其是在需要從遠程計算機中處理大量事件的情況。 Get-Eventlog cmdlet已棄用,並用於在較早版本的Windows中獲取日誌。此外,在PowerShell Core 7.x的最新版本中,Get-Eventlog不支持Get-Eventlog。

要使用get-wineVent命令,您必須以管理員的身份運行PowerShell。如果您嘗試以非Admin用戶的身份運行Get-WineVent,則將無法訪問某些日誌,包括安全日誌。

要從特定日誌中獲取事件列表,您必須指定其名稱。例如,以下命令列出了系統日誌的最後20個事件:

Get-WinEvent -LogName Application -MaxEvents 20

系統,應用程序,安全性或設置日誌是查詢最常見的日誌。您還可以指定其他日誌名稱。您可以使用命令在Windows中獲取事件日誌的完整列表:

Get-WinEvent -ListLog *

例如,要查看計算機上的RDP連接歷史記錄,您必須指定Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational紀錄:

Get-WinEvent -LogName Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational

或者,您可以從OpenSSH/Operational Log中獲取Windows中的SSH連接日誌:

Get-WinEvent -LogName OpenSSH/Operational

您還可以一次從多個日誌中選擇事件。例如,如果您想在過去24小時內獲取有關係統和應用程序日誌的錯誤和警告的信息,請使用以下代碼:

$StartDate = (Get-Date) - (New-TimeSpan -Day 1)
Get-WinEvent Application,System | Where-Object {($_.LevelDisplayName -eq "Error" -or $_.LevelDisplayName -eq "Warning") -and ($_.TimeCreated -ge $StartDate )}

您可以使用Select-Object或Format-Table cmdlet僅顯示特定事件字段:

Get-WinEvent -LogName System | Format-Table Machinename, TimeCreated, Id, UserID

您可以進一步處理從事件日誌獲得的數據。在此示例中,我們將立即將用戶名轉換為SID:

Get-WinEvent -filterhash @{Logname="system"} |
Select-Object @{Name="Computername";Expression = {$_.machinename}},@{Name="UserName";Expression = {$_.UserId.translate([System.Security.Principal.NTAccount]).value}}, TimeCreated

使用FilterHashtable選項快速搜索

上面的方法是從事件查看器日誌中使用對象易於理解的特定事件,但是它非常慢,尤其是在您想搜索大量事件的情況下。在大多數情況下,最好使用事件查看器服務器端過濾FilterHashtable選項。

現在,讓我們嘗試在30天的時間內使用對象和filterhashtable生成錯誤和警告列表。然後我們將使用Measure-Command比較這兩個powershell命令的執行時間:

$StartDate = (Get-Date).AddDays(-30)

首先,我們使用weration-object filter檢查命令的執行時間:

(Measure-Command {Get-WinEvent Application,System | Where-Object {($_.LevelDisplayName -eq "Error" -or $_.LevelDisplayName -eq "Warning") -and ($_.TimeCreated -ge $StartDate )}}).TotalMilliseconds

具有FilterHashtable的同一命令:

閱讀更多:如何從PowerShell/CMD寫入Windows事件查看器

(Measure-Command {Get-WinEvent -FilterHashtable @{LogName="System",'Application'; Level =2,3; StartTime=$StartDate }}).TotalMilliseconds

此示例表明filterhashtable事件過濾命令是30倍更快比通常的對象過濾器(2.5第二節與76秒)。

如果您需要通過EventID查找事件,請使用以下命令與FilterHashtable參數:

Get-WinEvent -FilterHashtable @{logname="System";id=1074}|ft TimeCreated,Id,Message

在此示例中,我們收到了最新的Windows重新啟動和關閉事件,使我們能夠確定誰重新啟動或關閉Windows機器。

FilterHashtable參數允許您通過以下事件屬性過濾:

  • logName
  • providername
  • 小路
  • 關鍵字(使用9007199254740992搜索成功的事件,而4503599627370496用於失敗的事件)
  • ID
  • 級別(1 =致命,2 =錯誤,3 =警告,4 =信息,5 =調試,6 =跟踪,0 = info)
  • 啟動
  • 結束時間
  • 用戶ID(用戶的SID)
  • 數據

這是在一定時間段內搜索事件的一個示例:

Get-WinEvent -FilterHashTable @{LogName="System"; StartTime=(get-date).AddDays(-7); EndTime=(get-date).AddHours(-1); ID=1234}

如果要在事件描述中找到特定文本,則可以使用以下命令:

Get-WinEvent -FilterHashtable @{logname="System"}|Where {$_.Message -like "*USB*"}

使用FilterXML高級Get-WineVent過濾

帶有FilterHashtable選項的Get-WineVent過濾器有一些限制。如果您需要使用帶有許多標準的複雜查詢來選擇事件,則需要使用FilterXML標誌,它允許您使用XML查詢進行選擇。與FilterHashtable類似,FilterXML過濾器是服務器端。這意味著您很快就能獲得結果。

例如,這是過去30天從系統日誌中獲取最新錯誤的另一種方法:

$xmlQuery = @'
<QueryList>
<Query Id="0" Path="System">
<Select Path="System">*[System[(Level=2 or Level=3) and TimeCreated[timediff(@SystemTime) &lt;= 2592000000]]]</Select>
</Query>
</QueryList>
'@
Get-WinEvent -FilterXML $xmlQuery

要生成複雜的XML查詢代碼,您可以使用事件查看器圖形控制台:

  1. 運行命令eventvwr.msc;
  2. 查找您要創建查詢的日誌,然後單擊過濾器當前日誌;
  3. 在過濾器表單中選擇所需的查詢參數。在此示例中,我想為特定用戶找到過去7天的特定事件的事件;
  4. 要獲取XML查詢代碼,請轉到XML選項卡,然後復制XPATH代碼(CTRL+A,,,,CTRL+C);
  5. 您可以在必要時手動編輯此查詢。

要將事件列表導出到CSV文件,請使用導出CSV CMDLET:

$Events= Get-WinEvent -FilterXML $xmlQuery
$events| Export-CSV "C:psFilterSYSEvents.csv" -NoTypeInformation -Encoding UTF8

從遠程計算機獲取事件日誌

要從遠程計算機獲取事件,只需在-computerName範圍:

$computer="mun-dc01"
Get-WinEvent -ComputerName $computer -FilterHashtable @{LogName="System"; StartTime=(get-date).AddHours(-24)} |   select Message,Id,TimeCreated

您可以立即查詢多個遠程主機以搜索特定事件。您可以從文本文件中獲取遠程計算機的列表:

$servers = Get-Content -Path C:psservers.txt

或來自Active Directory:

$servers = (Get-ADComputer -Filter 'operatingsystem -like "*Windows Server*" -and enabled -eq "true"').Name
foreach ($server in $servers) {
Get-WinEvent -ComputerName $server -MaxEvents 5 -FilterHashtable @{
LogName="System"; ID= 1234
} | Select-Object -Property ID, MachineName
}

這是在所有域控制器上搜索用戶帳戶鎖定事件的另一個示例:

$Username="a.muller"
Get-ADDomainController -fi * | select -exp hostname | % {
$GweParams = @{
'Computername' = $_
'LogName' = 'Security'
'FilterXPath' = "*[System[EventID=4740] and EventData[Data[@Name="TargetUserName"]='$Username']]"
}
$Events = Get-WinEvent @GweParams
$Events | foreach {$_.Computer + " " +$_.Properties[1].value + ' ' + $_.TimeCreated}
}