Tworzenie zapytań polecenia Get-WinEvent za pomocą parametru FilterHashtable

Ten przykład dotyczy tylko platform systemu Windows.

Aby przeczytać oryginalny wpis w blogu Scripting Guy z 3 czerwca 2014 r., zobacz Use FilterHashTable to Filter Event Log with PowerShell (Używanie tabeli FilterHashTable do filtrowania dziennika zdarzeń przy użyciu programu PowerShell).

Ten artykuł jest fragmentem oryginalnego wpisu w blogu i wyjaśnia, jak używać Get-WinEvent parametru FilterHashtable polecenia cmdlet do filtrowania dzienników zdarzeń. Polecenie cmdlet programu PowerShell to zaawansowana metoda filtrowania Get-WinEvent dzienników diagnostycznych i zdarzeń systemu Windows. Wydajność poprawia się, gdy Get-WinEvent zapytanie używa parametru FilterHashtable .

Podczas pracy z dużymi dziennikami zdarzeń nie jest wydajne wysyłanie obiektów w dół potoku do Where-Object polecenia. Przed programem PowerShell 6 Get-EventLog polecenie cmdlet było inną opcją pobierania danych dziennika. Na przykład następujące polecenia są nieefektywne, aby filtrować dzienniki Microsoft-Windows-Defrag :

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

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

Następujące polecenie używa tabeli skrótów, która poprawia wydajność:

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

Wpisy w blogu dotyczące wyliczenia

W tym artykule przedstawiono informacje o sposobie używania wyliczonych wartości w tabeli skrótów. Aby uzyskać więcej informacji na temat wyliczenia, przeczytaj te wpisy w blogu Scripting Guy . Aby utworzyć funkcję zwracającą wyliczone wartości, zobacz Wyliczenia i Wartości. Aby uzyskać więcej informacji, zobacz serię wpisów w blogu Scripting Guy na temat wyliczenia.

Pary klucz-wartość tabeli skrótu

Aby tworzyć wydajne zapytania, użyj Get-WinEvent polecenia cmdlet z parametrem FilterHashtable . FilterHashtable akceptuje tabelę skrótów jako filtr, aby uzyskać określone informacje z dzienników zdarzeń systemu Windows. Tabela skrótów używa par klucz-wartość . Aby uzyskać więcej informacji na temat tabel skrótów, zobacz about_Hash_Tables.

Jeśli pary klucz-wartość znajdują się w tym samym wierszu, muszą być oddzielone średnikiem. Jeśli każda para klucz-wartość znajduje się w osobnym wierszu, średnik nie jest potrzebny. Na przykład ten artykuł umieszcza pary klucz-wartość w osobnych wierszach i nie używa średników.

W tym przykładzie użyto kilku par klucz-wartość parametru FilterHashtable. Ukończone zapytanie obejmuje wartość LogName, ProviderName, Keywords, ID i Level.

Zaakceptowane pary klucz-wartość są wyświetlane w poniższej tabeli i znajdują się w dokumentacji parametru Get-WinEventFilterHashtable .

W poniższej tabeli przedstawiono nazwy kluczy, typy danych oraz to, czy dla wartości danych akceptowane są symbole wieloznaczne.

Nazwa klucza Typ danych wartości Akceptuje symbole wieloznaczne?
Logname <String[]> Tak
ProviderName <String[]> Tak
Ścieżka <String[]> Nie.
Słowa kluczowe <Long[]> Nie.
Identyfikator <Int32[]> Nie.
Poziom <Int32[]> Nie.
StartTime <DateTime> Nie.
EndTime <DateTime> Nie.
UserID <SID> Nie.
Data <String[]> Nie
<named-data> <String[]> Nie.

Klucz <named-data> reprezentuje nazwane pole danych zdarzenia. Na przykład zdarzenie Perflib 1008 może zawierać następujące dane zdarzenia:

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

Zapytania dotyczące tych zdarzeń można wykonać przy użyciu następującego polecenia:

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

Uwaga

Możliwość wykonywania zapytań dotyczących elementu <named-data> została dodana w programie PowerShell 6.

Kompilowanie zapytania za pomocą tabeli skrótów

Aby zweryfikować wyniki i rozwiązać problemy, pomaga utworzyć tabelę skrótów jedną parę klucz-wartość naraz. Zapytanie pobiera dane z dziennika aplikacji . Tabela skrótów jest równoważna .Get-WinEvent -LogName Application

Aby rozpocząć, utwórz Get-WinEvent zapytanie. Użyj pary klucz-wartość parametru FilterHashtable z kluczem, LogName i wartością Application.

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

Kontynuuj tworzenie tabeli skrótów przy użyciu klucza ProviderName . Zazwyczaj nazwa Dostawcy to nazwa wyświetlana w polu Źródło w Podgląd zdarzeń systemu Windows. Na przykład .NET Runtime na poniższym zrzucie ekranu:

Obraz źródeł Podgląd zdarzeń systemu Windows

Zaktualizuj tabelę skrótów i dołącz parę klucz-wartość przy użyciu klucza, providerName i wartości .NET Runtime.

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

Uwaga

W przypadku niektórych dostawców zdarzeń można uzyskać poprawną nazwę dostawcy , wyszukując kartę Szczegóły we właściwościach zdarzeń. Na przykład zdarzenia, w których w polu Źródło jest wyświetlana Defragwartość , prawidłowa nazwa dostawcy to Microsoft-Windows-Defrag.

Jeśli zapytanie musi pobrać dane z zarchiwizowanych dzienników zdarzeń, użyj klucza ścieżki. Wartość Ścieżka określa pełną ścieżkę do pliku dziennika. Aby uzyskać więcej informacji, zobacz wpis w blogu Scripting Guy , Używanie programu PowerShell do analizowania zapisanych dzienników zdarzeń pod kątem błędów.

Używanie wyliczonych wartości w tabeli skrótów

Słowa kluczowe to następny klucz w tabeli skrótów. Typ danych Słowa kluczowe to tablica [long] typu wartości, która zawiera dużą liczbę. Użyj następującego polecenia, aby znaleźć maksymalną wartość :[long]

[long]::MaxValue
9223372036854775807

W przypadku klucza słowa kluczowego program PowerShell używa liczby, a nie ciągu, takiego jak Zabezpieczenia. System Windows Podgląd zdarzeń wyświetla słowa kluczowe jako ciągi, ale są wyliczane wartości. W tabeli skrótów , jeśli używasz klucza słowa kluczowego z wartością ciągu, zostanie wyświetlony komunikat o błędzie.

Otwórz Podgląd zdarzeń systemu Windows i w okienku Akcje kliknij pozycję Filtruj bieżący dziennik. Menu rozwijane Słowa kluczowe wyświetla dostępne słowa kluczowe, jak pokazano na poniższym zrzucie ekranu:

Obraz słów kluczowych Podgląd zdarzeń systemu Windows

Użyj następującego polecenia, aby wyświetlić StandardEventKeywords nazwy właściwości.

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

Wyliczone wartości są udokumentowane w programie .NET Framework. Aby uzyskać więcej informacji, zobacz StandardEventKeywords, wyliczenie.

Nazwy słów kluczowych i wyliczone wartości są następujące:

Nazwa/nazwisko Wartość
AuditFailure 4503599627370496
AuditSuccess 9007199254740992
CorrelationHint2 18014398509481984
EventLogClassic 36028797018963968
Mkw 2251799813685248
WdiDiagnostic 1125899906842624
WdiContext 562949953421312
Czas odpowiedzi 281474976710656
None 0

Zaktualizuj tabelę skrótów i dołącz parę klucz-wartość za pomocą klucza, słów kluczowych i wartości wyliczenia EventLogClassic 36028797018963968.

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

Wartość właściwości statycznej słów kluczowych (opcjonalnie)

Klucz słów kluczowych jest wyliczany, ale można użyć nazwy właściwości statycznej w zapytaniu tabeli skrótów. Zamiast używać zwracanego ciągu, nazwa właściwości musi zostać przekonwertowana na wartość z właściwością Value__ .

Na przykład poniższy skrypt używa właściwości Value__ .

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

Filtrowanie według identyfikatora zdarzenia

Aby uzyskać bardziej szczegółowe dane, wyniki zapytania są filtrowane według identyfikatora zdarzenia. Identyfikator zdarzenia jest przywołyny w tabeli skrótów jako identyfikator klucza, a wartość jest określonym identyfikatorem zdarzenia. Podgląd zdarzeń systemu Windows wyświetla identyfikator zdarzenia. W tym przykładzie użyto identyfikatora zdarzenia 1023.

Zaktualizuj tabelę skrótów i dołącz parę klucz-wartość z kluczem, identyfikatorem i wartością 1023.

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

Filtrowanie według poziomu

Aby dodatkowo uściślić wyniki i uwzględnić tylko zdarzenia, które są błędami, użyj klucza poziomu . System Windows Podgląd zdarzeń wyświetla wartość Level jako wartości ciągu, ale są wyliczane. W tabeli skrótów , jeśli używasz klucza level z wartością ciągu, zostanie wyświetlony komunikat o błędzie.

Poziom ma wartości, takie jak Błąd, Ostrzeżenie lub Informacje. Użyj następującego polecenia, aby wyświetlić StandardEventLevel nazwy właściwości.

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

Wyliczone wartości są udokumentowane w programie .NET Framework. Aby uzyskać więcej informacji, zobacz StandardEventLevel, wyliczenie.

Nazwy i wyliczone wartości klucza poziomu są następujące:

Nazwa/nazwisko Wartość
Pełne informacje 5
Informacyjny 100
Ostrzeżenie 3
Błąd 2
Krytyczne 1
LogAlways 0

Tabela skrótów dla ukończonego zapytania zawiera klucz, poziom i wartość 2.

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

Poziom właściwości statycznej w wyliczenie (opcjonalnie)

Klucz poziomu jest wyliczany, ale można użyć nazwy właściwości statycznej w zapytaniu tabeli skrótów. Zamiast używać zwracanego ciągu, nazwa właściwości musi zostać przekonwertowana na wartość z właściwością Value__ .

Na przykład poniższy skrypt używa właściwości Value__ .

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