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-WinEvent FilterHashtable .
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 Defrag
wartość , 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 |
Sqm | 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__
}