Vytváření dotazů Get-WinEvent pomocí parametru FilterHashtable

Tato ukázka platí jenom pro platformy Windows.

Pokud si chcete přečíst původní blogový příspěvek 3. června 2014 Scripting Guy , přečtěte si téma Použití FilterHashTable k filtrování protokolu událostí pomocí PowerShellu.

Tento článek je výňatek původního blogového příspěvku a vysvětluje, jak pomocí Get-WinEvent parametru FilterHashtable rutiny filtrovat protokoly událostí. Rutina PowerShellu Get-WinEvent je výkonná metoda filtrování událostí a diagnostických protokolů Windows. Výkon se zlepší, když Get-WinEvent dotaz použije parametr FilterHashtable .

Při práci s velkými protokoly událostí není efektivní odesílat objekty z kanálu do Where-Object příkazu. Před PowerShellem 6 byla rutina Get-EventLog další možností získání dat protokolu. Například následující příkazy jsou neefektivní k filtrování protokolů Microsoft-Windows-Defrag :

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

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

Následující příkaz používá tabulku hash, která zlepšuje výkon:

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

Blogové příspěvky o výčtu

Tento článek obsahuje informace o tom, jak používat výčtové hodnoty v tabulce hash. Další informace o výčtu najdete v těchto blogových příspěvcích o Scripting Guy . Chcete-li vytvořit funkci, která vrací výčtové hodnoty, viz výčty a hodnoty. Další informace naleznete v sérii Skripting Guy série blogových příspěvků o výčtu.

Páry klíč-hodnota v tabulce hash

Pokud chcete vytvářet efektivní dotazy, použijte rutinu Get-WinEvent s parametrem FilterHashtable . FilterHashtable přijímá tabulku hash jako filtr pro získání konkrétních informací z protokolů událostí Windows. Tabulka hash používá páry klíč-hodnota . Další informace o tabulkách hash najdete v tématu about_Hash_Tables.

Pokud jsou páry klíč-hodnota na stejném řádku, musí být oddělené středníkem. Pokud je každý pár klíč-hodnota na samostatném řádku, středník není potřeba. Tento článek například umístí páry klíč-hodnota na samostatné řádky a nepoužívá středníky.

Tato ukázka používá několik dvojic klíč-hodnota parametru FilterHashtable. Dokončený dotaz zahrnuje LogName, ProviderName, Keywords, ID a Level.

Přijaté páry klíč-hodnota jsou uvedeny v následující tabulce a jsou zahrnuty v dokumentaci pro Get-WinEventFilterHashtable parametr.

Následující tabulka zobrazuje názvy klíčů, datové typy a informace o tom, jestli jsou pro datovou hodnotu přijímány zástupné znaky.

Název klíče Datový typ Hodnoty Přijímá zástupné znaky?
Logname <String[]> Ano
ProviderName <String[]> Ano
Cesta <String[]> No
Klíčová slova <Long[]> No
ID <Int32[]> No
Level <Int32[]> No
Počáteční čas <DateTime> No
EndTime <DateTime> No
UserID <SID> No
Data <String[]> No
<named-data> <String[]> Ne

Klíč <named-data> představuje pojmenované datové pole události. Například událost Perflib 1008 může obsahovat následující data událostí:

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

K dotazování na tyto události můžete použít následující příkaz:

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

Poznámka:

Možnost dotazování <named-data> byla přidána v PowerShellu 6.

Vytvoření dotazu pomocí hashovací tabulky

Pokud chcete ověřit výsledky a řešit problémy, pomůže vám vytvořit tabulku hash po jednom páru klíč-hodnota najednou. Dotaz získá data z protokolu aplikace . Tabulka hash je ekvivalentní hodnotě Get-WinEvent -LogName Application.

Začněte vytvořením Get-WinEvent dotazu. Použijte dvojici klíč-hodnota parametru FilterHashtable s klíčem, LogName a hodnotou Application.

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

Pokračujte vytvořením hashovací tabulky pomocí klíče ProviderName . Název ProviderName je obvykle název, který se zobrazí v poli Zdroj v Prohlížeč událostí Windows. Například .NET Runtime na následujícím snímku obrazovky:

Obrázek zdrojů windows Prohlížeč událostí

Aktualizujte tabulku hash a zahrňte pár klíč-hodnota s klíčem, ProviderName a hodnotou. .NET Runtime

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

Poznámka:

U některých zprostředkovatelů událostí je možné získat správný název ProviderName tak, že se podíváte na kartu Podrobnosti ve vlastnostech události. Například události, ve kterých se zobrazí pole Zdroj , je správný Název_zprostředkovateleMicrosoft-Windows-Defrag.Defrag

Pokud váš dotaz potřebuje získat data z archivovaných protokolů událostí, použijte klíč Path . Hodnota Cesta určuje úplnou cestu k souboru protokolu. Další informace najdete v blogovém příspěvku Scripting Guy , pomocí PowerShellu parsovat uložené protokoly událostí pro chyby.

Použití výčtových hodnot v tabulce hash

Klíčová slova jsou dalším klíčem v tabulce hash. Datový typ Klíčová slova je pole [long] typu hodnoty, které obsahuje velké číslo. Pomocí následujícího příkazu vyhledejte maximální hodnotu [long]:

[long]::MaxValue
9223372036854775807

Pro klíč Klíčových slov používá PowerShell číslo, ne řetězec, jako je zabezpečení. Windows Prohlížeč událostí zobrazí klíčová slova jako řetězce, ale jsou uvedené hodnoty. Pokud v tabulce hash použijete klíč Keywords s řetězcovou hodnotou, zobrazí se chybová zpráva.

Otevřete Prohlížeč událostí Windows a v podokně Akce klikněte na filtr aktuálního protokolu. Rozevírací nabídka Klíčová slova zobrazuje dostupná klíčová slova, jak je znázorněno na následujícím snímku obrazovky:

Obrázek klíčových slov windows Prohlížeč událostí

K zobrazení StandardEventKeywords názvů vlastností použijte následující příkaz.

[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…

Výčtové hodnoty jsou zdokumentované v rozhraní .NET Framework. Další informace naleznete v tématu StandardEventKeywords – výčet.

Názvy klíčových slov a výčtové hodnoty jsou následující:

Jméno Hodnota
AuditFailure 4503599627370496
AuditSuccess 9007199254740992
CorrelationHint2 18014398509481984
EventLogClassic 36028797018963968
M2 2251799813685248
WdiDiagnostic 1125899906842624
WdiContext 562949953421312
Doba odezvy 281474976710656
Nic 0

Aktualizujte tabulku hash a zahrňte pár klíč-hodnota s klíčem, klíčovými slovy a hodnotou výčtu EventLogClassic 36028797018963968.

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

Hodnota statické vlastnosti klíčových slov (volitelné)

Klíč Klíčových slov je vyčíslen, ale v dotazu na tabulku hash můžete použít název statické vlastnosti. Místo použití vráceného řetězce musí být název vlastnosti převeden na hodnotu s Value__ vlastnost.

Například následující skript používá vlastnost Value__ .

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

Filtrování podle ID události

Pokud chcete získat konkrétnější data, výsledky dotazu se filtrují podle ID události. ID události se odkazuje v tabulce hash jako ID klíče a hodnota je konkrétní ID události. Windows Prohlížeč událostí zobrazí ID události. V tomto příkladu se používá ID události 1023.

Aktualizujte tabulku hash a zahrňte pár klíč-hodnota s klíčem, ID a hodnotou 1023.

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

Filtrování podle úrovně

K dalšímu upřesnění výsledků a zahrnutí pouze událostí, které jsou chyby, použijte klíč úrovně . Windows Prohlížeč událostí zobrazí úroveň jako řetězcové hodnoty, ale jsou uvedené hodnoty. Pokud v tabulce hash použijete klíč úrovně s řetězcovou hodnotou, zobrazí se chybová zpráva.

Úroveň obsahuje hodnoty, jako je chyba, upozornění nebo informační. K zobrazení StandardEventLevel názvů vlastností použijte následující příkaz.

[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;}

Výčtové hodnoty jsou zdokumentované v rozhraní .NET Framework. Další informace naleznete v tématu StandardEventLevel – výčet.

Názvy a výčtové hodnoty klíče úrovně jsou následující:

Jméno Hodnota
Podrobnosti 5
Informační 4
Upozorňující 3
Chyba 2
Kritické 0
LogAlways 0

Tabulka hash dokončeného dotazu obsahuje klíč, úroveň a hodnotu 2.

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

Úroveň statické vlastnosti v výčtu (volitelné)

Klíč úrovně je vyčíslen, ale v dotazu na tabulku hash můžete použít název statické vlastnosti. Místo použití vráceného řetězce musí být název vlastnosti převeden na hodnotu s Value__ vlastnost.

Například následující skript používá vlastnost Value__ .

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