Erstellen von Get-WinEvent-Abfragen mit FilterHashtable

Dieses Beispiel gilt nur für Windows-Plattformen.

Den Scripting Guy-Original-Blogbeitrag vom 3. Juni 2014 können Sie unter Use FilterHashTable to Filter Event Log with PowerShell (Verwenden von FilterHashTable zum Filtern des Ereignisprotokolls mit PowerShell) lesen.

Dieser Artikel ist ein Auszug des ursprünglichen Blogbeitrags und erläutert die Verwendung des FilterHashtable-Parameters des Get-WinEvent-Cmdlets zum Filtern von Ereignisprotokollen. Das PowerShell Get-WinEvent-Cmdlet bietet ein leistungsstarkes Verfahren zum Filtern von Windows-Ereignis- und Diagnoseprotokollen. Die Leistung wird besser, wenn eine Get-WinEvent-Abfrage den FilterHashtable-Parameter nutzt.

Bei der Arbeit mit großen Ereignisprotokollen ist es nicht effizient, Objekte die Pipeline hinab an einen Where-Object-Befehl zu senden. Vor PowerShell 6 war das Get-EventLog-Cmdlet eine weitere Option, Protokolldaten abzurufen. Beispielsweise sind die folgenden Befehle zum Filtern der Microsoft-Windows-Defrag-Protokolle ineffizient:

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

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

Der folgende Befehl verwendet eine Hashtabelle, die die Leistung steigert:

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

Blogbeiträge zur Enumeration

Dieser Artikel enthält Informationen zur Verwendung von Enumerationswerten in einer Hashtabelle. Weitere Informationen über Enumeration finden Sie in diesen Scripting Guy-Blogbeiträgen. Um eine Funktion zu erstellen, die die Enumerationswerte zurückgibt, lesen Sie Enumerations and Values (Enumerationen und Werte). Weitere Informationen finden Sie in der Scripting Guy-Reihe von Blogbeiträgen zur Enumeration.

Schlüssel-Wert-Paare für Hashtabellen

Um effiziente Abfragen zu erstellen, verwenden Sie das Get-WinEvent-Cmdlet mit dem FilterHashtable-Parameter. FilterHashtable akzeptiert eine Hashtabelle als Filter, um bestimmte Informationen aus Windows-Ereignisprotokollen abzurufen. Eine Hashtabelle verwendet Schlüssel-Wert-Paare. Weitere Informationen zu Hashtabellen finden Sie unter about_Hash_Tables (Informationen zu Hashtabellen).

Wenn sich die Schlüssel-Wert-Paare in der gleichen Zeile befinden, müssen sie durch ein Semikolon getrennt werden. Wenn sich jedes Schlüssel-Wert-Paar in einer separaten Zeile befindet, ist kein Semikolon erforderlich. Beispielsweise werden in diesem Artikel Schlüssel-Wert-Paare in separaten Zeilen angeordnet und keine Semikola verwendet.

Dieses Beispiel nutzt mehrere der Schlüssel-Wert-Paare des FilterHashtable-Parameters. Die vollständige Abfrage beinhaltet LogName, ProviderName, Keywords, ID und Level.

Die akzeptierten Schlüssel-Wert-Paare sind in der folgenden Tabelle dargestellt und in der Dokumentation für den Get-WinEventFilterHashtable-Parameter enthalten.

In der folgenden Tabelle sind die Schlüsselnamen und Datentypen aufgelistet und ob für einen Datenwert Platzhalterzeichen akzeptiert werden.

Schlüsselname Wertdatentyp Platzhalterzeichen akzeptiert?
LogName <String[]> Ja
ProviderName <String[]> Ja
`Path` <String[]> Nein
Keywords <Long[]> Nein
id <Int32[]> Nein
Ebene <Int32[]> Nein
StartTime <DateTime> Nein
EndTime <DateTime> Nein
UserID <SID> Nein
Daten <String[]> Nein
<named-data> <String[]> Nein

Der <named-data>-Schlüssel stellt ein benanntes Ereignisdatenfeld dar. Beispielsweise kann das Perflib-Ereignis 1008 die folgenden Ereignisdaten enthalten:

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

Sie können diese Ereignisse mit dem folgenden Befehl abfragen:

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

Hinweis

Ab PowerShell 6 ist das Abfragen von <named-data> möglich.

Erstellen einer Abfrage mit einer Hashtabelle

Es ist sinnvoll, die Hashtabelle aus jeweils einzelnen Schlüssel-Wert-Paaren aufzubauen, um die Ergebnisse zu überprüfen und Probleme zu behandeln. Die Abfrage ruft Daten aus dem Anwendungsprotokoll ab. Die Hashtabelle ist gleichbedeutend mit Get-WinEvent -LogName Application.

Erstellen Sie zunächst die Get-WinEvent-Abfrage. Verwenden Sie das Schlüssel-Wert-Paar des FilterHashtable-Parameters mit dem Schlüssel LogName und dem Wert Application.

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

Setzen Sie den Aufbau der Hashtabelle mit dem Schlüssel ProviderName fort. Der ProviderName ist in der Regel der Name, der im Feld Source in der Windows-Ereignisanzeige angezeigt wird. Beispielsweise .NET Runtime im folgenden Screenshot:

Abbildung der Quellen der Windows-Ereignisanzeige

Aktualisieren Sie die Hashtabelle, und schließen Sie das Schlüssel-Wert-Paar mit dem Schlüssel ProviderName und dem Wert .NET Runtime ein.

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

Hinweis

Bei einigen Ereignisanbietern kann der richtige ProviderName abgerufen werden, indem Sie auf der Registerkarte Details unter den Ereigniseigenschaften nachsehen. Bei Ereignissen, bei denen im Feld Quelle z. B. Defrag angezeigt wird, lautet der richtige Wert für ProviderName entsprechend Microsoft-Windows-Defrag.

Wenn Ihre Abfrage Daten aus archivierten Ereignisprotokollen abrufen muss, verwenden Sie den Schlüssel Path. Der Wert von Path gibt den vollständigen Pfad zur Protokolldatei an. Weitere Informationen finden Sie im Scripting Guy-Blogbeitrag Use PowerShell to Parse Saved Event Logs for Errors (Verwenden von PowerShell zum Analysieren von gespeicherten Ereignisprotokollen auf Fehler).

Verwenden von Enumerationswerten in einer Hashtabelle

Keywords ist der nächste Schlüssel in der Hashtabelle. Der Datentyp Keywords ist ein Array vom Werttyp [long], der eine große Zahl enthält. Verwenden Sie den folgenden Befehl, um den Maximalwert von [long] zu ermitteln:

[long]::MaxValue
9223372036854775807

Für den Schlüssel Keywords verwendet PowerShell eine Zahl, nicht eine Zeichenfolge, wie etwa Security. In der Windows-Ereignisanzeige werden die Schlüsselwörter als Zeichenfolgen dargestellt, sie sind jedoch Enumerationswerte. Wenn Sie in der Hashtabelle den Schlüssel Keywords zusammen mit einem Zeichenfolgenwert verwenden, wird eine Fehlermeldung angezeigt.

Öffnen Sie die Windows-Ereignisanzeige, und klicken Sie im Bereich Aktionen auf Aktuelles Protokoll filtern. Im Dropdownmenü Schlüsselwörter werden die verfügbaren Schlüsselwörter angezeigt, wie im folgenden Screenshot zu sehen:

Abbildung der Schlüsselwörter der Windows-Ereignisanzeige

Verwenden Sie den folgenden Befehl, um die Eigenschaftsnamen für StandardEventKeywords anzuzeigen.

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

Die aufgezählten Werte sind im .NET Framework dokumentiert. Weitere Informationen finden Sie unter StandardEventKeywords Enumeration.

Die Namen und Enumerationswerte der Schlüsselwörter sind wie folgt:

Name Wert
AuditFailure 4503599627370496
AuditSuccess 9007199254740992
CorrelationHint2 18014398509481984
EventLogClassic 36028797018963968
Sqm 2251799813685248
WdiDiagnostic 1125899906842624
WdiContext 562949953421312
ResponseTime 281474976710656
Keine 0

Aktualisieren Sie die Hashtabelle, und schließen Sie das Schlüssel-Wert-Paar mit dem Schlüssel Keywordsund dem EventLogClassic-Aufzählungswert 36028797018963968 ein.

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

Statischer Eigenschaftswert der Keywords-Eigenschaft (optional)

Der Schlüssel Keywords ist aufgezählt, Sie können in der Hashtabellenabfrage aber einen statischen Eigenschaftsnamen verwenden. Anstatt die zurückgegebene Zeichenfolge zu verwenden, muss der Eigenschaftsname mit der Eigenschaft Value__ in einen Wert konvertiert werden.

Beispielsweise verwendet das folgende Skript die Eigenschaft Value__ .

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

Filtern nach Ereignis-ID

Um spezifischere Daten zu erhalten, werden die Ergebnisse der Abfrage nach der Ereignis-ID gefiltert. Auf die Ereignis-ID wird in der Hashtabelle in Form des Schlüssels ID Bezug genommen, und der Wert ist eine spezifische Ereignis-ID. In der Windows-Ereignisanzeige wird die Ereignis-ID angezeigt. In diesem Beispiel wird die Ereignis-ID 1023 verwendet.

Aktualisieren Sie die Hashtabelle, und schließen Sie das Schlüssel-Wert-Paar mit dem Schlüssel ID und dem Wert 1023 ein.

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

Filtern nach Ebene

Um die Ergebnisse weiter einzugrenzen und nur Ereignisse aufzunehmen, die Fehler darstellen, verwenden Sie den Schlüssel Level. In der Windows-Ereignisanzeige wird der Schlüssel Level als Zeichenfolgenwert dargestellt, es handelt sich jedoch um einen Enumerationswert. Wenn Sie in der Hashtabelle den Schlüssel Level zusammen mit einem Zeichenfolgenwert verwenden, wird eine Fehlermeldung angezeigt.

Level weist Werte wie Error, Warning oder Informational auf. Verwenden Sie den folgenden Befehl, um die Eigenschaftsnamen für StandardEventLevel anzuzeigen.

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

Die aufgezählten Werte sind im .NET Framework dokumentiert. Weitere Informationen finden Sie unter StandardEventLevel Enumeration.

Die Namen und Enumerationswerte von Level sind wie folgt:

Name Wert
Ausführlich 5
Informational 4
Warnung 3
Fehler 2
Kritisch 1
LogAlways 0

Die Hash-Tabelle für die vollständige Abfrage enthält den Schlüssel Level und den Wert 2.

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

Statische Level-Eigenschaft in der Enumeration (optional)

Der Schlüssel Level ist aufgezählt, Sie können in der Hashtabellenabfrage aber einen statischen Eigenschaftsnamen verwenden. Anstatt die zurückgegebene Zeichenfolge zu verwenden, muss der Eigenschaftsname mit der Eigenschaft Value__ in einen Wert konvertiert werden.

Beispielsweise verwendet das folgende Skript die Eigenschaft Value__ .

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