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

Aby przeczytać oryginalny wpis w blogu 3 czerwca 2014 skryptów Guy , zobacz Używanie FilterHashTable do filtrowania dziennika zdarzeń przy użyciu programu PowerShell.To read the original June 3, 2014 Scripting Guy blog post, see Use FilterHashTable to Filter Event Log with PowerShell.

Ten artykuł stanowi fragment oryginalnego wpisu w blogu i wyjaśnia, jak użyć Get-WinEvent parametru FilterHashtable polecenia cmdlet do filtrowania dzienników zdarzeń.This article is an excerpt of the original blog post and explains how to use the Get-WinEvent cmdlet's FilterHashtable parameter to filter event logs. Get-WinEventPolecenie cmdlet programu PowerShell jest zaawansowaną metodą filtrowania zdarzeń systemu Windows i dzienników diagnostycznych.PowerShell's Get-WinEvent cmdlet is a powerful method to filter Windows event and diagnostic logs. Wydajność jest zwiększona Get-WinEvent , gdy zapytanie używa parametru FilterHashtable .Performance improves when a Get-WinEvent query uses the FilterHashtable parameter.

Podczas pracy z dużymi dziennikami zdarzeń nie jest efektywne wysyłanie obiektów w dół potoku do Where-Object polecenia.When you work with large event logs, it's not efficient to send objects down the pipeline to a Where-Object command. Przed uruchomieniem programu PowerShell 6 Get-EventLog polecenie cmdlet było kolejną opcją pobrania danych dziennika.Prior to PowerShell 6, the Get-EventLog cmdlet was another option to get log data. Na przykład następujące polecenia są niewydajne do filtrowania dzienników defragmentacji systemu Microsoft Windows :For example, the following commands are inefficient to filter the Microsoft-Windows-Defrag logs:

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ść:The following command uses a hash table that improves the performance:

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

Wpisy w blogu dotyczące wyliczaniaBlog posts about enumeration

W tym artykule przedstawiono informacje dotyczące sposobu używania wartości wyliczanych w tabeli skrótów.This article presents information about how to use enumerated values in a hash table. Aby uzyskać więcej informacji na temat wyliczenia, przeczytaj te skrypty Guy wpisy w blogu.For more information about enumeration, read these Scripting Guy blog posts. Aby utworzyć funkcję zwracającą wartości wyliczane, zobacz wyliczenia i wartości.To create a function that returns the enumerated values, see Enumerations and Values. Aby uzyskać więcej informacji, zapoznaj się z artykułem Guying Series of the Scripting The Posts for Enumeration.For more information, see the Scripting Guy series of blog posts about enumeration.

Pary klucz-wartość tabeli skrótówHash table key-value pairs

Aby utworzyć wydajne zapytania, użyj Get-WinEvent polecenia cmdlet z parametrem FilterHashtable .To build efficient queries, use the Get-WinEvent cmdlet with the FilterHashtable parameter. FilterHashtable akceptuje tablicę skrótów jako filtr, aby uzyskać szczegółowe informacje z dzienników zdarzeń systemu Windows.FilterHashtable accepts a hash table as a filter to get specific information from Windows event logs. W tabeli skrótów są stosowane pary klucz-wartość .A hash table uses key-value pairs. Aby uzyskać więcej informacji na temat tabel skrótów, zobacz about_Hash_Tables.For more information about hash tables, see about_Hash_Tables.

Jeśli pary klucz-wartość są w tym samym wierszu, muszą być oddzielone średnikami.If the key-value pairs are on the same line, they must be separated by a semicolon. Jeśli każda para klucz-wartość znajduje się w osobnym wierszu, średnik nie jest wymagany.If each key-value pair is on a separate line, the semicolon isn't needed. Na przykład ten artykuł umieszcza pary klucz-wartość w oddzielnych wierszach i nie używa średników.For example, this article places key-value pairs on separate lines and doesn't use semicolons.

Ten przykład używa kilku par klucz-wartość parametru FilterHashtable .This sample uses several of the FilterHashtable parameter's key-value pairs. Zakończone zapytanie zawiera Nazwa, ProviderName, Keywords, IDi Level.The completed query includes LogName, ProviderName, Keywords, ID, and Level.

Zaakceptowane pary klucz-wartość są pokazane w poniższej tabeli i znajdują się w dokumentacji dotyczącej parametru Get-WinEvent FilterHashtable .The accepted key-value pairs are shown in the following table and are included in the documentation for the Get-WinEvent FilterHashtable parameter.

W poniższej tabeli przedstawiono nazwy kluczy, typy danych i określające, czy symbole wieloznaczne są akceptowane dla wartości danych.The following table displays the key names, data types, and whether wildcard characters are accepted for a data value.

Nazwa kluczaKey name Typ danych wartościValue data type Akceptuje symbole wieloznaczne?Accepts wildcard characters?
NazwaLogName <String[]> YesYes
ProviderNameProviderName <String[]> YesYes
ŚcieżkaPath <String[]> NieNo
Słowa kluczoweKeywords <Long[]> NieNo
ID (Identyfikator)ID <Int32[]> NieNo
PoziomLevel <Int32[]> NieNo
StartTimeStartTime <DateTime> NieNo
EndTimeEndTime <DateTime> NieNo
UserIDUserID <SID> NieNo
DaneData <String[]> NieNo
<named-data> <String[]> NieNo

<named-data>Klucz reprezentuje pole dane zdarzenia nazwanego.The <named-data> key represents a named event data field. Na przykład zdarzenie Perflib 1008 może zawierać następujące dane zdarzenia:For example, the Perflib event 1008 can contain the following event data:

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

Można wykonać zapytanie dotyczące tych zdarzeń przy użyciu następującego polecenia:You can query for these events using the following command:

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

Uwaga

Możliwość wykonywania zapytania dla <named-data> została dodana w programie PowerShell 6.The ability to query for <named-data> was added in PowerShell 6.

Tworzenie zapytania z tablicą skrótówBuilding a query with a hash table

Aby sprawdzić wyniki i rozwiązać problemy, warto utworzyć tabelę skrótów po jednej parze klucz-wartość w danym momencie.To verify results and troubleshoot problems, it helps to build the hash table one key-value pair at a time. Zapytanie pobiera dane z dziennika aplikacji .The query gets data from the Application log. Tablica skrótów jest równoważna z Get-WinEvent –LogName Application .The hash table is equivalent to Get-WinEvent –LogName Application.

Aby rozpocząć, Utwórz Get-WinEvent zapytanie.To begin, create the Get-WinEvent query. Użyj pary klucz-wartość parametru FilterHashtable z kluczem, Nazwai wartością.Use the FilterHashtable parameter's key-value pair with the key, LogName, and the value, Application.

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

Kontynuuj, aby skompilować tabelę skrótów za pomocą klucza ProviderName .Continue to build the hash table with the ProviderName key. ProviderName jest nazwą wyświetlaną w polu źródłowym w Podgląd zdarzeń systemu Windows.The ProviderName is the name that appears in the Source field in the Windows Event Viewer. Na przykład środowisko uruchomieniowe platformy .NET na poniższym zrzucie ekranu:For example, .NET Runtime in the following screenshot:

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

Zaktualizuj tablicę skrótów i Dołącz parę klucz-wartość z kluczem, dostawcąnamei wartością, środowisko uruchomieniowe platformy .NET.Update the hash table and include the key-value pair with the key, ProviderName, and the value, .NET Runtime.

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

Jeśli zapytanie wymaga pobrania danych z zarchiwizowanych dzienników zdarzeń, użyj klucza ścieżki .If your query needs to get data from archived event logs, use the Path key. Wartość Path określa pełną ścieżkę do pliku dziennika.The Path value specifies the full path to the log file. Aby uzyskać więcej informacji, zobacz wpis w blogu Guy Scripting , Aby przeanalizować zapisane dzienniki zdarzeń pod kątem błędów przy użyciu programu PowerShell.For more information, see the Scripting Guy blog post, Use PowerShell to Parse Saved Event Logs for Errors.

Używanie wartości wyliczanych w tabeli skrótówUsing enumerated values in a hash table

Słowa kluczowe to następny klucz w tabeli skrótów.Keywords is the next key in the hash table. Typ danych Keywords jest tablicą [long] typu wartości, który przechowuje dużą liczbę.The Keywords data type is an array of the [long] value type that holds a large number. Użyj następującego polecenia, aby znaleźć maksymalną wartość [long] :Use the following command to find the maximum value of [long]:

[long]::MaxValue
9223372036854775807

W przypadku klucza słów kluczowych program PowerShell używa liczby, a nie ciągu, takiego jak zabezpieczenia.For the Keywords key, PowerShell uses a number, not a string such as Security. W systemie Windows Podgląd zdarzeń są wyświetlane słowa kluczowe jako ciągi, ale są one wyliczane.Windows Event Viewer displays the Keywords as strings, but they are enumerated values. 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.In the hash table, if you use the Keywords key with a string value, an error message is displayed.

Otwórz Podgląd zdarzeń systemu Windows i w okienku Akcje kliknij pozycję Filtruj bieżący dziennik.Open the Windows Event Viewer and from the Actions pane, click on Filter current log. Menu rozwijane słowa kluczowe zawiera dostępne słowa kluczowe, jak pokazano na poniższym zrzucie ekranu:The Keywords drop-down menu displays the available keywords, as shown in the following screenshot:

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

Użyj następującego polecenia, aby wyświetlić StandardEventKeywords nazwy właściwości.Use the following command to display the StandardEventKeywords property names.

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

Wartości wyliczane są udokumentowane w .NET Framework.The enumerated values are documented in the .NET Framework. Aby uzyskać więcej informacji, zobacz StandardEventKeywords Enumeration.For more information, see StandardEventKeywords Enumeration.

Nazwy słów kluczowych i wartości wyliczane są następujące:The Keywords names and enumerated values are as follows:

NazwaName WartośćValue
AuditFailureAuditFailure 45035996273704964503599627370496
AuditSuccessAuditSuccess 90071992547409929007199254740992
CorrelationHint2CorrelationHint2 1801439850948198418014398509481984
EventLogClassicEventLogClassic 3602879701896396836028797018963968
SQMSqm 22517998136852482251799813685248
WdiDiagnosticWdiDiagnostic 11258999068426241125899906842624
WdiContextWdiContext 562949953421312562949953421312
Czas odpowiedzi zgodnieResponseTime 281474976710656281474976710656
BrakNone 00

Zaktualizuj tablicę skrótów i Dołącz parę klucz-wartość za pomocą klucza, słów kluczowychi wartości wyliczenia EventLogClassic , 36028797018963968.Update the hash table and include the key-value pair with the key, Keywords, and the EventLogClassic enumeration value, 36028797018963968.

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

Wartość statycznej właściwości Keywords (opcjonalnie)Keywords static property value (optional)

Klucz słów kluczowych jest wyliczany, ale można użyć nazwy właściwości statycznej w zapytaniu tabeli skrótów.The Keywords key is enumerated, but you can use a static property name in the hash table query. Zamiast używać zwracanego ciągu, nazwa właściwości musi być konwertowana na wartość właściwością value__ .Rather than using the returned string, the property name must be converted to a value with the Value__ property.

Na przykład poniższy skrypt używa właściwości value__ .For example, the following script uses the Value__ property.

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

Filtrowanie według identyfikatora zdarzeniaFiltering by Event Id

Aby uzyskać bardziej szczegółowe dane, wyniki zapytania są filtrowane według identyfikatora zdarzenia. Identyfikator zdarzenia jest przywoływany w tabeli skrótów jako Identyfikator klucza i wartość jest określonym identyfikatorem zdarzenia. Podgląd zdarzeń systemu Windows wyświetla Identyfikator zdarzenia. Ten przykład używa zdarzenia o identyfikatorze 1023.To get more specific data, the query's results are filtered by Event Id. The Event Id is referenced in the hash table as the key ID and the value is a specific Event Id. The Windows Event Viewer displays the Event Id. This example uses Event Id 1023.

Zaktualizuj tablicę skrótów i Dołącz parę klucz-wartość o kluczu, identyfikatorze i wartości 1023.Update the hash table and include the key-value pair with the key, ID and the value, 1023.

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

Filtrowanie według poziomuFiltering by Level

Aby dodatkowo uściślić wyniki i uwzględnić tylko zdarzenia, które są błędami, użyj klucza poziomu .To further refine the results and include only events that are errors, use the Level key. System Windows Podgląd zdarzeń wyświetla poziom jako wartości ciągu, ale są one wyliczane.Windows Event Viewer displays the Level as string values, but they are enumerated values. W tabeli skrótów, jeśli używasz klucza poziomu z wartością ciągu, zostanie wyświetlony komunikat o błędzie.In the hash table, if you use the Level key with a string value, an error message is displayed.

Poziom zawiera wartości, takie jak błąd, Ostrzeżenielub informacyjny.Level has values such as Error, Warning, or Informational. Użyj następującego polecenia, aby wyświetlić StandardEventLevel nazwy właściwości.Use the following command to display the StandardEventLevel property names.

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

Wartości wyliczane są udokumentowane w .NET Framework.The enumerated values are documented in the .NET Framework. Aby uzyskać więcej informacji, zobacz StandardEventLevel Enumeration.For more information, see StandardEventLevel Enumeration.

Nazwy klucza poziomu i wartości wyliczane są następujące:The Level key's names and enumerated values are as follows:

NazwaName WartośćValue
PełnyVerbose 55
InformacyjneInformational 44
OstrzeżenieWarning 33
BłądError 22
KrytyczneCritical 11
LogAlwaysLogAlways 00

Tabela skrótów dla ukończonego zapytania zawiera klucz, poziomi wartość, 2.The hash table for the completed query includes the key, Level, and the value, 2.

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

Właściwość statyczna poziomu w wyliczeniu (opcjonalnie)Level static property in enumeration (optional)

Klucz poziomu jest wyliczany, ale w zapytaniu tabeli skrótów można użyć nazwy właściwości statycznej.The Level key is enumerated, but you can use a static property name in the hash table query. Zamiast używać zwracanego ciągu, nazwa właściwości musi być konwertowana na wartość właściwością value__ .Rather than using the returned string, the property name must be converted to a value with the Value__ property.

Na przykład poniższy skrypt używa właściwości value__ .For example, the following script uses the Value__ property.

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