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

Aby przeczytać oryginalny wpis w blogu Scripting Guy z 3 czerwca 2014 r., zobacz Use FilterHashTable to FilterHashTable to Filter Event Log with PowerShell (Używanie tabeli FilterHashTable do filtrowania dziennika zdarzeń za pomocą 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ść zwiększa 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 polecenie cmdlet było inną opcją pobierania Get-EventLog 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 zwiększa 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 Enumerations and Values (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 . Funkcja 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 oddzielnych wierszach i nie używa średników.

W tym przykładzie użyto kilku par parametru FilterHashtableklucz-wartość . 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 informacje o tym, czy symbole wieloznaczne są akceptowane dla wartości danych.

Nazwa klucza Typ danych wartości Akceptuje symbole wieloznaczne?
LogName <String[]> Tak
ProviderName <String[]> Tak
Ścieżka <String[]> Nie
Słowa kluczowe <Long[]> Nie
ID (Identyfikator) <Int32[]> Nie
Poziom <Int32[]> Nie
StartTime <DateTime> Nie
EndTime <DateTime> Nie
UserID <SID> Nie
Dane <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>

Możesz wykonać zapytanie dotyczące tych zdarzeń 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 przy użyciu tabeli skrótów

Aby zweryfikować wyniki i rozwiązać problemy, pomaga utworzyć tabelę skrótów jedną parę klucz-wartość jednocześnie. 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 kompilowanie tabeli skrótów przy użyciu klucza ProviderName . Zazwyczaj nazwa ProviderName 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 przedstawiający źródła Podgląd zdarzeń systemu Windows

Zaktualizuj tabelę skrótów i dołącz parę klucz-wartość za pomocą 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 pole Źródło pokazuje Defrag, poprawna nazwa dostawcy to Microsoft-Windows-Defrag.

Jeśli zapytanie musi pobierać dane z zarchiwizowanych dzienników zdarzeń, użyj klucza ścieżka . Wartość Ścieżka określa pełną ścieżkę do pliku dziennika. Aby uzyskać więcej informacji, zobacz wpis w blogu Scripting Guy , Użyj 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ść elementu [long]:

[long]::MaxValue
9223372036854775807

W przypadku klucza słów kluczowych 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łów kluczowych 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 .NET Framework. Aby uzyskać więcej informacji, zobacz StandardEventKeywords, wyliczenie.

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

Nazwa Wartość
AuditFailure 4503599627370496
AuditSuccess 9007199254740992
CorrelationHint2 18014398509481984
EventLogClassic 36028797018963968
M kw. 2251799813685248
WdiDiagnostic 1125899906842624
WdiContext 562949953421312
Czas odpowiedzi 281474976710656
Brak 0

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

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 w zapytaniu tabeli skrótów można użyć nazwy właściwości statycznej. 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 zdarzenia o identyfikatorze 1023.

Zaktualizuj tabelę skrótów i dołącz parę klucz-wartość za pomocą klucza, identyfikatora 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ą wyliczone. W tabeli skrótów, jeśli używasz klucza poziomu z wartością ciągu, zostanie wyświetlony komunikat o błędzie.

Poziom ma wartości, takie jak Error, Warning lub Informational. 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 .NET Framework. Aby uzyskać więcej informacji, zobacz StandardEventLevel, wyliczenie.

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

Nazwa Wartość
Pełny 5
Informacyjne 4
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ć statycznej nazwy właściwości 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__
}