使用 FilterHashtable 建立 Get-WinEvent 查詢

此範例僅適用於 Windows 平臺。

若要閱讀原始的 2014 年 6 月 3 日 Scripting Guy 部落格文章,請參閱 使用 FilterHashTable 搭配 PowerShell 篩選事件記錄檔。

本文是原始部落格文章的摘錄,並說明如何使用 Get-WinEvent Cmdlet 的 FilterHashtable 參數來篩選事件記錄。 PowerShell 的 Get-WinEvent Cmdlet 是篩選 Windows 事件和診斷記錄的強大方法。 當查詢使用 FilterHashtable 參數時Get-WinEvent,效能會改善。

當您使用大型事件記錄檔時,將物件向下傳送至 Where-Object 命令並無效率。 在 PowerShell 6 之前, Get-EventLog Cmdlet 是取得記錄數據的另一個選項。 例如,下列命令對篩選 Microsoft-Windows-Defrag 記錄沒有效率:

Get-EventLog -LogName Application | Where-Object Source -Match defrag

Get-WinEvent -LogName Application | Where-Object { $_.ProviderName -Match 'defrag' }

下列命令會使用哈希表來改善效能:

Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='*defrag'
}

關於列舉的部落格文章

本文提供如何在哈希表中使用列舉值的相關信息。 如需列舉的詳細資訊,請閱讀這些 Scripting Guy 部落格文章。 若要建立傳回列舉值的函式,請參閱 列舉和值。 如需詳細資訊,請參閱 有關列舉的 Scripting Guy 系列部落格文章。

哈希表索引鍵/值組

若要建置有效率的 Get-WinEvent 查詢,請使用 Cmdlet 搭配 FilterHashtable 參數。 FilterHashtable 接受哈希表做為篩選條件,以從 Windows 事件記錄檔取得特定資訊。 哈希表使用 索引鍵/值 組。 如需有關雜湊表的詳細資訊,請參閱 about_Hash_Tables

如果索引鍵/值組位於同一行,則必須以分號分隔。 如果每個 機碼/值 組都位於個別行上,則不需要分號。 例如,本文會將索引鍵/值組放在不同的行上,而且不會使用分號。

此範例會使用 FilterHashtable 參數的個索引鍵/值組。 已完成的查詢包括 LogName、ProviderName關鍵詞標識碼層級

下表顯示可接受的索引鍵/值組,並包含在 Get-WinEventFilterHashtable 參數的檔中。

下表顯示索引鍵名稱、數據類型,以及數據值是否接受通配符。

索引鍵名稱 實值數據類型 接受通配符?
LogName <String[]> Yes
ProviderName <String[]> Yes
路徑 <String[]> No
關鍵字 <Long[]> No
識別碼 <Int32[]> No
層級 <Int32[]> No
StartTime <DateTime> No
EndTime <DateTime> No
UserID <SID> No
資料 <String[]> No
<named-data> <String[]> No

索引 <named-data> 鍵代表具名事件數據欄位。 例如,Perflib 事件 1008 可以包含下列事件數據:

<EventData>
  <Data Name="Service">BITS</Data>
  <Data Name="Library">C:\Windows\System32\bitsperf.dll</Data>
  <Data Name="Win32Error">2</Data>
</EventData>

您可以使用下列命令來查詢這些事件:

Get-WinEvent -FilterHashtable @{LogName='Application'; 'Service'='Bits'}

注意

PowerShell 6 已新增查詢 <named-data> 的功能。

使用哈希表建置查詢

若要驗證結果並針對問題進行疑難解答,它可協助一次建置一個 索引鍵/值 組的哈希表。 查詢會從 應用程式 記錄檔取得數據。 哈希表相當於 Get-WinEvent -LogName Application

若要開始,請建立 Get-WinEvent 查詢。 使用 FilterHashtable 參數的索引鍵/值組搭配機碼、LogName 和值 Application

Get-WinEvent -FilterHashtable @{
   LogName='Application'
}

繼續使用 ProviderName 金鑰建置哈希表。 通常,ProviderName 是出現在 Windows 事件檢視器 [來源] 字段中的名稱。 例如, .NET Runtime 在下列螢幕快照中:

Windows 事件檢視器 來源的影像

更新哈希表,並包含機碼、ProviderName 和值.NET Runtime的機碼/值組。

Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='.NET Runtime'
}

注意

對於某些事件提供者,可以藉由查看事件屬性中的 [詳細數據] 索引標籤來取得正確的 ProviderName。 例如,Source 欄位顯示 Defrag的事件,正確的 ProviderNameMicrosoft-Windows-Defrag

如果您的查詢需要從封存的事件記錄檔取得數據,請使用 Path 索引鍵。 Path 值會指定記錄檔的完整路徑。 如需詳細資訊,請參閱 Scripting Guy 部落格文章: 使用 PowerShell 剖析已儲存的事件記錄檔中的錯誤

在哈希表中使用列舉值

關鍵詞是哈希表中的下一個索引鍵。 Keywords 數據類型是包含大量數位之[long]實值型別的陣列。 使用下列命令來尋找 的最大值 [long]

[long]::MaxValue
9223372036854775807

針對關鍵詞索引鍵,PowerShell 會使用數位,而不是安全性之類的字串。 Windows 事件檢視器 會將關鍵詞顯示為字串,但它們是列舉值。 在哈希表中,如果您使用 關鍵詞 索引鍵搭配字串值,則會顯示錯誤訊息。

開啟 Windows 事件檢視器,然後從 [動作] 窗格中,按兩下 [篩選目前記錄檔]。 [ 關鍵詞] 下拉功能表會顯示可用的關鍵詞,如下列螢幕快照所示:

Windows 事件檢視器 關鍵詞的影像

使用下列命令來顯示 StandardEventKeywords 屬性名稱。

[System.Diagnostics.Eventing.Reader.StandardEventKeywords] |
    Get-Member -Static -MemberType Property
   TypeName: System.Diagnostics.Eventing.Reader.StandardEventKeywords
Name             MemberType Definition
—-             ———- ———-
AuditFailure     Property   static System.Diagnostics.Eventing.Reader.StandardEventKey…
AuditSuccess     Property   static System.Diagnostics.Eventing.Reader.StandardEventKey…
CorrelationHint  Property   static System.Diagnostics.Eventing.Reader.StandardEventKey…
CorrelationHint2 Property   static System.Diagnostics.Eventing.Reader.StandardEventKey…
EventLogClassic  Property   static System.Diagnostics.Eventing.Reader.StandardEventKey…
None             Property   static System.Diagnostics.Eventing.Reader.StandardEventKey…
ResponseTime     Property   static System.Diagnostics.Eventing.Reader.StandardEventKey…
Sqm              Property   static System.Diagnostics.Eventing.Reader.StandardEventKey…
WdiContext       Property   static System.Diagnostics.Eventing.Reader.StandardEventKey…
WdiDiagnostic    Property   static System.Diagnostics.Eventing.Reader.StandardEventKey…

列舉值記載於 .NET Framework 中。 如需詳細資訊,請參閱 StandardEventKeywords 列舉

關鍵字名稱與列舉值如下所示:

名稱
AuditFailure 4503599627370496
AuditSuccess 9007199254740992
CorrelationHint2 18014398509481984
EventLogClassic 36028797018963968
平方米 2251799813685248
WdiDiagnostic 1125899906842624
WdiContext 562949953421312
ResponseTime 281474976710656
0

更新哈希表,並包含索引鍵、關鍵詞EventLogClassic 列舉值的索引鍵/值組,36028797018963968

Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='.NET Runtime'
   Keywords=36028797018963968
}

關鍵字靜態屬性值 (選擇性)

會列舉 Keywords 索引鍵,但您可以在哈希表查詢中使用靜態屬性名稱。 屬性名稱必須轉換成具有 Value__ 屬性的值,而不是使用傳回的字串。

例如,下列腳本會使用 Value__ 屬性。

$C = [System.Diagnostics.Eventing.Reader.StandardEventKeywords]::EventLogClassic
Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='.NET Runtime'
   Keywords=$C.Value__
}

依事件標識碼篩選

若要取得更特定的數據,查詢的結果會依事件標識符進行篩選。哈希表中會參考事件標識碼做為索引鍵標識碼,而值是特定的事件標識碼Windows 事件檢視器 會顯示事件標識碼。此範例使用事件標識碼 1023

更新哈希表,並包含機碼、標識碼和值 1023 的索引鍵/值組。

Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='.NET Runtime'
   Keywords=36028797018963968
   ID=1023
}

依層級篩選

若要進一步精簡結果,並只包含錯誤的事件,請使用 Level 索引鍵。 Windows 事件檢視器 會將 Level 顯示為字串值,但會列舉這些值。 在哈希表中,如果您使用 Level 索引鍵搭配字串值,則會顯示錯誤訊息。

層級具有錯誤、警告資訊值。 使用下列命令來顯示 StandardEventLevel 屬性名稱。

[System.Diagnostics.Eventing.Reader.StandardEventLevel] |
    Get-Member -Static -MemberType Property
   TypeName: System.Diagnostics.Eventing.Reader.StandardEventLevel

Name          MemberType Definition
----          ---------- ----------
Critical      Property   static System.Diagnostics.Eventing.Reader.StandardEventLevel Critical {get;}
Error         Property   static System.Diagnostics.Eventing.Reader.StandardEventLevel Error {get;}
Informational Property   static System.Diagnostics.Eventing.Reader.StandardEventLevel Informational {get;}
LogAlways     Property   static System.Diagnostics.Eventing.Reader.StandardEventLevel LogAlways {get;}
Verbose       Property   static System.Diagnostics.Eventing.Reader.StandardEventLevel Verbose {get;}
Warning       Property   static System.Diagnostics.Eventing.Reader.StandardEventLevel Warning {get;}

列舉值記載於 .NET Framework 中。 如需詳細資訊,請參閱 StandardEventLevel 列舉

Level 索引鍵的名稱和列舉值如下所示:

名稱
詳細資訊 5
資訊 4
警告 3
錯誤 2
重大 1
LogAlways 0

已完成查詢的哈希表包含索引鍵、 層級和值 2

Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='.NET Runtime'
   Keywords=36028797018963968
   ID=1023
   Level=2
}

列舉中的 Level static 屬性 (選擇性)

會列舉 Level 索引鍵,但您可以在哈希表查詢中使用靜態屬性名稱。 屬性名稱必須轉換成具有 Value__ 屬性的值,而不是使用傳回的字串。

例如,下列腳本會使用 Value__ 屬性。

$C = [System.Diagnostics.Eventing.Reader.StandardEventLevel]::Informational
Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='.NET Runtime'
   Keywords=36028797018963968
   ID=1023
   Level=$C.Value__
}