Get-WinEvent
從本機和遠端電腦上的事件記錄檔和事件追蹤記錄檔,取得事件。
語法
Get-WinEvent [-LogName] <string[]> [-ComputerName <string>] [-Credential <PSCredential>] [-FilterXPath <string>] [-Force <switch>] [-MaxEvents <int64>] [-Oldest] [<CommonParameters>]
Get-WinEvent [-Path] <string[]> [-ComputerName <string>] [-Credential <PSCredential>] [-FilterXPath <string>] [-Force <switch>] [-MaxEvents <int64>] [-Oldest] [<CommonParameters>]
Get-WinEvent [-ProviderName] <string[]> [-ComputerName <string>] [-Credential <PSCredential>] [-FilterXPath <string>] [-Force <switch>] [-MaxEvents <int64>] [-Oldest] [<CommonParameters>]
Get-WinEvent -FilterHashTable <Hashtable[]> [-ComputerName <string>] [-Credential <PSCredential>] [-Force <switch>] [-MaxEvents <int64>] [-Oldest] [<CommonParameters>]
Get-WinEvent [-ListLog] <string[]> [-ComputerName <string>] [-Credential <PSCredential>] [<CommonParameters>]
Get-WinEvent [-ListProvider] <string[]> [-ComputerName <string>] [-Credential <PSCredential>] [<CommonParameters>]
Get-WinEvent -FilterXml <XmlDocument> [-ComputerName <string>] [-Credential <PSCredential>] [-Force <switch>] [-MaxEvents <int64>] [-Oldest] [<CommonParameters>]
描述
Get-WinEvent Cmdlet 會從事件記錄檔取得事件,包括傳統記錄檔 (例如系統和應用程式記錄),以及由 Windows Vista 中引入的新 Windows 事件記錄檔技術所產生的事件記錄檔。同時也會從 Windows 事件追蹤 (ETW) 所產生的記錄檔中取得事件。
如果沒有參數,Get-WinEvent 命令會取得電腦上的所有事件記錄檔中的所有事件。若要中斷命令,請按 CTRL+C。
Get-WinEvent 也會列出事件記錄檔和事件記錄檔提供者。您可以從選取的記錄檔或者是選取的事件提供者所產生的記錄檔,取得事件。而且,您可以使用單一命令從多個來源合併事件。Get-WinEvent 可以讓您藉由使用 XPath 查詢、結構化 XML 查詢以及簡化的雜湊表查詢,篩選事件。
注意:Get-WinEvent 需要 Windows Vista、Windows Server 2008 R2 或較新版本的 Windows。此外,也需要 Microsoft .NET Framework 3.5 或以後的版本。
參數
-ComputerName <string>
從指定電腦上的事件記錄檔,取得事件。請輸入電腦的 NetBIOS 名稱、網際網路通訊協定 (IP) 位址或完整網域名稱。預設值為本機電腦。
此參數每次只能接受一個電腦名稱。若要尋找多台電腦上的事件記錄檔或事件,請使用 ForEach 陳述式。如需這個參數的詳細資訊,請參閱範例。
若要取得遠端電腦的事件和事件記錄檔,必須將事件記錄服務的防火牆連接埠設定成允許遠端存取。
此參數並不依存於 Windows PowerShell 遠端。即使沒有將電腦設定成執行遠端命令,也可以使用 ComputerName 參數。
必要? |
false |
位置? |
named |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-Credential <PSCredential>
指定具有執行此動作之權限的使用者帳戶。預設值為目前使用者。
請輸入使用者名稱,例如 User01 或 Domain01\User01。或者輸入 PSCredential 物件,例如 Get-Credential Cmdlet 所產生的物件。如果輸入使用者名稱,將會提示您提供密碼。如果您只輸入參數名稱,則會提示您輸入使用者名稱和密碼。
必要? |
false |
位置? |
named |
預設值 |
目前使用者 |
接受管線輸入? |
false |
接受萬用字元? |
false |
-FilterHashTable
必要? |
true |
位置? |
named |
預設值 |
|
接受管線輸入? |
true (ByValue) |
接受萬用字元? |
false |
-FilterXml <XmlDocument>
請使用結構化 XML 查詢,從一個或多個事件記錄檔選取事件。
若要產生有效的 XML 查詢,請使用事件檢視器中的「建立自訂檢視」和「篩選目前的記錄」功能。使用對話方塊中的項目建立查詢,然後再按一下 [XML] 索引標籤,檢視查詢的 XML 格式。您可以複製 [XML] 索引標籤中的 XML,做為 FilterXml 參數值。如需事件檢視器功能的詳細資訊,請參閱事件檢視器說明。
一般而言,您會使用 XML 查詢,建立包含數個 XPath 陳述式的複雜查詢。XML 格式也可以讓您使用「抑制」XML 元素,從查詢中排除事件。如需事件記錄檔查詢的 XML 結構描述的詳細資訊,請參閱 MSDN (Microsoft Developer Network) 文件庫中的下列主題。
-- <查詢結構描述>:https://go.microsoft.com/fwlink/?LinkId=143685
-- <事件選取範圍>中的「XML 事件查詢」:https://go.microsoft.com/fwlink/?LinkID=143608
必要? |
true |
位置? |
named |
預設值 |
無 |
接受管線輸入? |
true (ByValue) |
接受萬用字元? |
false |
-FilterXPath <string>
請使用 XPath 查詢,從一個或多個記錄檔選取事件。
如需 XPath 語言的詳細資訊,請參閱 MSDN 文件庫中<事件選取範圍>的「選取範圍篩選器」,以及<XPath 參考>。
必要? |
false |
位置? |
named |
預設值 |
無 |
接受管線輸入? |
false |
接受萬用字元? |
false |
-Force <switch>
除了其他事件記錄檔之外,取得偵錯和分析記錄檔。必須要有 Force 參數,才能在 Name 參數包含萬用字元時取得偵錯或分析記錄檔。
根據預設,Get-WinEvent 會排除這些記錄檔,除非您有指定偵錯或分析記錄檔的完整名稱。
必要? |
false |
位置? |
named |
預設值 |
沒有傳回偵錯與分析記錄以回應使用萬用字元的查詢。 |
接受管線輸入? |
false |
接受萬用字元? |
false |
-ListLog <string[]>
取得指定的事件記錄檔。請以逗號分隔的清單輸入事件記錄檔名稱。允許使用萬用字元。若要取得所有記錄檔,請輸入值 *。
必要? |
true |
位置? |
1 |
預設值 |
無 |
接受管線輸入? |
false |
接受萬用字元? |
true |
-ListProvider <string[]>
取得指定的事件記錄檔提供者。事件記錄檔提供者是將事件寫入事件記錄檔的程式或服務。
請以逗號分隔的清單輸入提供者名稱。允許使用萬用字元。若要取得電腦上所有事件記錄檔的提供者,請輸入值 *。
必要? |
true |
位置? |
1 |
預設值 |
無 |
接受管線輸入? |
false |
接受萬用字元? |
true |
-LogName <string[]>
從指定的事件記錄檔,取得事件。請以逗號分隔的清單輸入事件記錄檔名稱。允許使用萬用字元。您也可以經由管道將記錄檔名稱輸出至 Get-WinEvent。
必要? |
true |
位置? |
1 |
預設值 |
無 |
接受管線輸入? |
true (ByValue) |
接受萬用字元? |
true |
-MaxEvents <int64>
指定 Get-WinEvent 所傳回的事件數目上限。請輸入整數。預設為傳回記錄檔或檔案中的所有事件。
必要? |
false |
位置? |
named |
預設值 |
所有事件 |
接受管線輸入? |
false |
接受萬用字元? |
false |
-Oldest
以先進先出的順序傳回事件。根據預設,事件的傳回順序為後進先出。
必須要有此參數,才能從 .etl 檔、.evt 檔、偵錯記錄檔和分析記錄檔取得事件。在這些檔案中,記錄事件的順序為先進先出,而且只能根據先進先出的順序傳回事件。
必要? |
false |
位置? |
named |
預設值 |
|
接受管線輸入? |
false |
接受萬用字元? |
false |
-Path <string[]>
從指定的事件記錄檔,取得事件。請以逗號區隔的清單輸入記錄檔路徑,或是使用萬用字元建立檔案路徑模式。
Get-WinEvent 支援副檔名為 .evt、.evtx 和 .etl 的檔案。您可以在相同命令中,包含不同檔案和檔案類型的事件。
必要? |
true |
位置? |
1 |
預設值 |
無 |
接受管線輸入? |
false |
接受萬用字元? |
true |
-ProviderName <string[]>
取得指定事件記錄檔提供者所寫入的事件。請以逗號區隔的清單輸入提供者名稱,或是使用萬用字元建立提供者名稱模式。
事件記錄檔提供者是將事件寫入事件記錄檔的程式或服務。並不是 Windows PowerShell 提供者。
必要? |
true |
位置? |
1 |
預設值 |
無 |
接受管線輸入? |
false |
接受萬用字元? |
true |
<CommonParameters>
這個 Cmdlet 支援一般參數:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。如需詳細資訊,請參閱 about_Commonparameters.
輸入和輸出
輸入型別是可經由管道輸出至 Cmdlet 的物件型別。傳回型別則是 Cmdlet 所傳回的物件型別。
輸入 |
System.String, System.Xml.XmlDocument, System.Collections.Hashtable 您可以透過管道方式將 LogName (字串)、FilterXML 查詢或 FilterHashTable 查詢輸出至 Get-WinEvent。 |
輸出 |
System.Diagnostics.Eventing.Reader.EventLogConfiguration, System.Diagnostics.Eventing.Reader.EventLogRecord, System.Diagnostics.Eventing.Reader.ProviderMetadata 如果指定有 ListLog 參數,Get-WinEvent 會傳回 System.Diagnostics.Eventing.Reader.EventLogConfiguration 物件。如果指定有 ListProvider 參數,Get-WinEvent 傳回 System.Diagnostics.Eventing.Reader.ProviderMetadata 物件。搭配所有其他參數,Get-WinEvent 則會傳回 System.Diagnostics.Eventing.Reader.EventLogRecord 物件。 |
附註
Get-WinEvent 設計的用意是要在執行 Windows Vista 和較新版本的 Windows 電腦上,取代 Get-EventLog cmdlet。Get-EventLog 只會取得傳統事件記錄檔中的事件。Windows PowerShell 2.0 中仍有保留 Get-EventLog,以供比 Windows Vista 還要早的系統使用。
範例 1
C:\PS>get-winevent -listlog *
描述
-----------
這個命令會取得本機電腦上的所有記錄檔。
記錄檔會以 Get-WinEvent 取得的順序列出。通常會先擷取傳統記錄檔,接著是新的 Windows Eventing 記錄檔。
因為通常會有上百個事件記錄檔,這個參數需要有記錄檔名稱或名稱模式。若要取得所有記錄檔,請使用 *。
範例 2
C:\PS>get-winevent -listlog Setup | format-list -property *
FileSize : 69632
IsLogFull : False
LastAccessTime : 2/14/2008 12:55:12 AM
LastWriteTime : 7/9/2008 3:12:05 AM
OldestRecordNumber : 1
RecordCount : 3
LogName : Setup
LogType : Operational
LogIsolation : Application
IsEnabled : True
IsClassicLog : False
SecurityDescriptor : O:BAG:SYD:(A;;0xf0007;;;SY)(A;
(A;;0x1;;;S-1-5-32-573)
LogFilePath : %SystemRoot%\System32\Winevt\L
MaximumSizeInBytes : 1052672
LogMode : Circular
OwningProviderName : Microsoft-Windows-Eventlog
ProviderNames : {Microsoft-Windows-WUSA, Micro
ProviderLevel :
ProviderKeywords :
ProviderBufferSize : 64
ProviderMinimumNumberOfBuffers : 0
ProviderMaximumNumberOfBuffers : 64
ProviderLatency : 1000
ProviderControlGuid :
描述
-----------
這些命令取得的物件表示本機電腦上的傳統系統記錄檔。物件包含有用的記錄檔相關資訊,包括其大小、事件記錄檔提供者、檔案路徑以及其啟用狀況。
範例 3
C:\PS>get-winevent -listlog * -computername Server01| where {$_.recordcount}
描述
-----------
這個命令只會取得 Server01 電腦上包含事件的事件記錄檔。許多記錄檔有可能是空的。
這個命令使用的 RecordCount 屬性,屬於您使用 ListLog 參數時 Get-WinEvent 所傳回的 EventLogConfiguration 物件。
範例 4
C:\PS>$s = "Server01", "Server02", "Server03"
C:\PS> foreach ($server in $s)
{$server; get-winevent -listlog "Windows PowerShell" -computername $server}
描述
-----------
這個範例中的命令所取得的物件,表示 Server01、Server02 和 Server03 電腦上的 Windows PowerShell 事件記錄檔。因為 ComputerName 參數只能接受一個值,所以這個命令會使用 Foreach 關鍵字。
第一個命令會將電腦名稱儲存在 $s 變數中。
第二個命令則使用 Foreach 陳述式。針對 $s 變數中的每個電腦,陳述式會執行指令碼區塊 (位於大括號內) 中的命令。首先,命令會列印電腦名稱。接著,會執行 Get-WinEvent 命令,取得代表 Windows PowerShell 記錄的物件。
範例 5
C:\PS>get-winevent -listprovider *
描述
-----------
這個命令會取得本機電腦上的事件記錄檔提供者,以及其寫入的記錄檔 (若有的話)。
範例 6
C:\PS>(get-winevent -listlog Application).providernames
描述
-----------
這個命令會取得本機電腦上寫入應用程式記錄檔的所有提供者。
範例 7
C:\PS>>get-winevent -listprovider *policy*
描述
-----------
這個命令會取得名稱包含 "policy" 一字的事件記錄檔提供者。
範例 8
C:\PS>(get-winevent -listprovider microsoft-windows-grouppolicy).events | format-table id, description -auto
描述
-----------
這個命令會列出 Microsoft-Windows-GroupPolicy 事件提供者所產生的事件識別碼,以及事件描述。
其中會使用您在使用 ListProvider 參數時 Get-WinEvent 所傳回物件的 Events 屬性,並使用 Events 屬性中物件的 ID 和 Description 屬性。
範例 9
C:\PS>$events = get-winevent -logname "Windows PowerShell"
C:\PS> $events.count
195
C:\PS> $events | group-object id -noelement | sort-object count -desc
Count Name
----- ----
147 600
22 400
21 601
3 403
2 103
C:\PS> $events | group-object leveldisplayname -noelement
Count Name
----- ----
2 Warning
193 Information
描述
-----------
這個範例示範如何使用 Get-WinEvent 所傳回事件物件的屬性,了解事件記錄檔中的事件。
第一個命令使用 Get-WinEvent cmdlet,會取得 Windows PowerShell 事件記錄檔中的所有事件。然後將事件儲存在 $events 變數中。因為記錄檔名稱包含空格,所以置於引號中。
第二個命令使用物件集合的 Count 屬性,以找出事件記錄檔中的項目數目。
第三個命令則顯示記錄檔中每個事件的發生率,最頻繁的事件會最先列出。在這個範例中,事件識別碼 600 為最常發生的事件。
第四個命令會依據項目的 LevelDisplayName 屬性值進行分組,以顯示記錄檔中有多少 Error、Warning 和 Information 事件。
範例 10
C:\PS>get-winevent -logname *disk*, Microsoft-Windows-Kernel-WHEA
描述
-----------
這個命令會從電腦上名稱包含 "disk" 的所有事件記錄檔中,以及從 Microsoft-Windows-Kernel-WHEA 事件記錄檔中,取得錯誤事件。
範例 11
C:\PS>get-winevent -path 'c:\ps-test\Windows PowerShell.evtx'
描述
-----------
這個命令會從位於測試目錄的 Windows PowerShell 事件記錄檔複本中,取得事件。因為記錄檔名稱包含空格,所以會將路徑置於引號中。
範例 12
C:\PS>get-winevent -path 'c:\tracing\tracelog.etl' -maxevents 100 -oldest
C:\PS> get-winevent -path 'c:\tracing\tracelog.etl' -oldest | sort-object -property timecreated -desc | select-object -first 100
描述
-----------
這些命令會從 Windows 事件追蹤 (ETW) 事件追蹤記錄檔中,取得前 100 個事件。
第一個命令會取得記錄檔中最舊的 100 個事件,它使用 Get-WinEvent cmdlet 從 Tracelog.etl 檔案取得事件。還會使用 MaxEvents 參數限制擷取 100 個事件。因為事件是依據寫入記錄檔的順序而列出的 (先進先出),所以需要使用 Oldest 參數。
第二個命令會取得記錄檔中最新的 100 個事件。它使用 Get-WinEvent Cmdlet 從 Tracing.etl 檔案取得所有事件。並將
事件傳遞給 Sort-Object cmdlet,後者會依據 TimeCreated 屬性以遞減順序進行排序。接著,會將排序的事件傳送給 Select-Object Cmdlet,以選取最新的 100 個事件。
範例 13
C:\PS>get-winevent -path "c:\tracing\tracelog.etl", "c:\Logs\Windows PowerShell.evtx" -oldest | where {$_.id -eq "103"}
描述
-----------
這個範例示範如何從事件追蹤記錄檔 (.etl),以及從儲存在測試目錄的 Windows PowerShell 記錄檔 (.evtx) 複本中,取得事件
您可以使用單一命令合併多種檔案類型。因為檔案包含相同類型的 .NET Framework 物件 (EventLogRecord 物件),所以您可以使用相同的屬性進行篩選。
請注意,因為要從 .etl 檔案進行讀取,所以這個命令需要 Oldest 參數,但 Oldest 參數會套用到這兩個檔案。
範例 14
C:\PS># Use the Where-Object cmdlet
C:\PS> $yesterday = (get-date) - (new-timespan -day 1)
C:\PS> get-winevent -logname "Windows PowerShell" | where {$_.timecreated -ge $yesterday}
# Uses FilterHashTable
C:\PS> $yesterday = (get-date) - (new-timespan -day 1)
C:\PS> get-winevent -FilterHashTable @{LogName='Windows PowerShell'; Level=3; StartTime=$yesterday}
# Use FilterXML
C:\PS> get-winevent -FilterXML "<QueryList><Query><Select Path='Windows PowerShell'>*[System[Level=3 and TimeCreated[timediff(@SystemTime) <= 86400000]]]</Select></Query></QueryList>"
# Use FilterXPath
C:\PS> get-winevent -LogName "Windows Powershell" -FilterXPath "*[System[Level=3 and TimeCreated[timediff(@SystemTime) <= 86400000]]]"
描述
-----------
這個範例示範可用於從事件記錄檔選取事件的不同篩選方法。這些命令都會從 Windows PowerShell 事件記錄檔中取得過去 24 小時內所發生的事件。
篩選方法比使用 Where-Object Cmdlet 更有效率,因為在擷取物件的同時就會套用篩選條件,而不是先擷取所有物件後再進行篩選。
因為日期難以使用 XML 和 XPath 格式制定,為了要建立日期的 XML 內容,您要使用事件檢視器的「篩選目前的記錄」功能。如需這個功能的詳細資訊,請參閱事件檢視器說明。
範例 15
C:\PS>$date = (get-date).AddDays(-2)
C:\PS> $events = get-winevent -FilterHashTable @{ logname = "Microsoft-Windows-Diagnostics-Performance/Operational"; StartTime = $date; ID = 100 }
描述
-----------
這個範例使用篩選雜湊表,從效能記錄檔取得事件。
第一個命令使用 Get-Date cmdlet 和 AddDays 方法,取得代表目前日期前兩天的日期。然後將日期儲存在 $date 變數中。
第二個命令使用 Get-WinEvent cmdlet 搭配 FilterHashTable 參數。雜湊表中索引鍵所定義的篩選條件,會從效能記錄檔中選取過去兩天內發生的且事件識別碼為 100 的事件。
LogName 索引鍵用於指定事件記錄檔、StartTime 索引鍵用於指定日期,而 ID 索引鍵則用於指定事件識別碼。
範例 16
C:\PS>$starttime = (get-date).adddays(-7)
C:\PS> $ie-error = Get-WinEvent -FilterHashtable @{logname="application"; providername="Application Error"; data="iexplore.exe"; starttime=$starttime}
描述
-----------
這個範例使用篩選雜湊表,找出發生於過去一週內的 Internet Explorer 應用程式錯誤。
第一個命令會取得代表目前日期前七天的日期,並儲存在 $starttime 變數中。
第二個命令使用 Get-WinEvent cmdlet 搭配 FilterHashTable 參數。雜湊表中索引鍵所定義的篩選條件,會從應用程式記錄檔中選取由 Application Error 提供者所寫入的且包含字詞 "iexplore.exe" 的事件。
LogName 索引鍵用於指定事件記錄檔。ProviderName 索引鍵用於指定事件提供者,StartTime 索引鍵用於指定事件的開始日期,而 Data 索引鍵則用於指定事件訊息中的文字。