Get-WinEvent-query's maken met FilterHashtable

Dit voorbeeld is alleen van toepassing op Windows-platforms.

Als u het oorspronkelijke blogbericht van 3 juni 2014 Scripting Guy wilt lezen, raadpleegt u FilterHashTable gebruiken om gebeurtenislogboek te filteren met PowerShell.

Dit artikel is een fragment van het oorspronkelijke blogbericht en legt uit hoe u de FilterHashtable-parameter van de Get-WinEvent cmdlet gebruikt om gebeurtenislogboeken te filteren. De cmdlet van Get-WinEvent PowerShell is een krachtige methode voor het filteren van Windows-gebeurtenis- en diagnostische logboeken. De prestaties worden verbeterd wanneer een Get-WinEvent query gebruikmaakt van de parameter FilterHashtable .

Wanneer u met grote gebeurtenislogboeken werkt, is het niet efficiënt om objecten in de pijplijn naar een Where-Object opdracht te verzenden. Vóór PowerShell 6 was de Get-EventLog cmdlet een andere optie om logboekgegevens op te halen. De volgende opdrachten zijn bijvoorbeeld inefficiënt om de Microsoft-Windows-Defragmentatielogboeken te filteren:

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

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

De volgende opdracht maakt gebruik van een hash-tabel die de prestaties verbetert:

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

Blogberichten over opsomming

In dit artikel vindt u informatie over het gebruik van geïnventareerde waarden in een hash-tabel. Lees deze blogposts van Scripting Guy voor meer informatie over opsomming. Als u een functie wilt maken die de geïnventareerde waarden retourneert, raadpleegt u Opsommingen en Waarden. Zie de reeks Scripting Guy-blogberichten over opsomming voor meer informatie.

Sleutel-waardeparen van hashtabel

Als u efficiënte query's wilt maken, gebruikt u de Get-WinEvent cmdlet met de parameter FilterHashtable . FilterHashtable accepteert een hash-tabel als filter om specifieke informatie op te halen uit Windows-gebeurtenislogboeken. Een hashtabel maakt gebruik van sleutel-waardeparen . Zie about_Hash_Tables voor meer informatie over hashtabellen.

Als de sleutel-waardeparen zich op dezelfde regel bevinden, moeten ze worden gescheiden door een puntkomma. Als elk sleutel-waardepaar zich op een afzonderlijke regel bevindt, is de puntkomma niet nodig. In dit artikel worden bijvoorbeeld sleutel-waardeparen op afzonderlijke regels opgeslagen en worden geen puntkomma's gebruikt.

In dit voorbeeld worden verschillende sleutel-waardeparen van de parameter FilterHashtable gebruikt. De voltooide query bevat LogName, ProviderName, Trefwoorden, ID en Niveau.

De geaccepteerde sleutel-waardeparen worden weergegeven in de volgende tabel en zijn opgenomen in de documentatie voor de parameter Get-WinEventFilterHashtable.

In de volgende tabel worden de sleutelnamen, gegevenstypen en of jokertekens worden geaccepteerd voor een gegevenswaarde.

Sleutelnaam Waardegegevenstype Accepteert jokertekens?
LogName <String[]> Ja
ProviderName <String[]> Ja
Pad <String[]> Nee
Trefwoorden <Long[]> Nee
Id <Int32[]> Nee
Niveau <Int32[]> Nee
StartTime <DateTime> Nee
EndTime <DateTime> Nee
UserID <SID> Nee
Gegevens <String[]> Nee
<named-data> <String[]> Nr.

De <named-data> sleutel vertegenwoordigt een benoemd gebeurtenisgegevensveld. De Perflib-gebeurtenis 1008 kan bijvoorbeeld de volgende gebeurtenisgegevens bevatten:

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

U kunt een query uitvoeren op deze gebeurtenissen met behulp van de volgende opdracht:

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

Notitie

De mogelijkheid om een query uit te voeren <named-data> , is toegevoegd in PowerShell 6.

Een query maken met een hash-tabel

Om resultaten te controleren en problemen op te lossen, helpt het om de hash-tabel één sleutel-waardepaar tegelijk te bouwen. De query haalt gegevens op uit het toepassingslogboek . De hash-tabel is gelijk aan Get-WinEvent -LogName Application.

Maak eerst de Get-WinEvent query. Gebruik het sleutel-waardepaar van de parameter FilterHashtable met de sleutel, LogName en de waarde, Toepassing.

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

Ga door met het bouwen van de hash-tabel met de ProviderName-sleutel . Meestal is providernaam de naam die wordt weergegeven in het veld Bron in de Windows Logboeken. Bijvoorbeeld in .NET Runtime de volgende schermopname:

Afbeelding van Windows Logboeken-bronnen

Werk de hashtabel bij en neem het sleutel-waardepaar op met de sleutel, ProviderName en de waarde. .NET Runtime

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

Notitie

Voor sommige gebeurtenisproviders kan de juiste ProviderName worden verkregen door te kijken op het tabblad Details in Gebeurteniseigenschappen. Bijvoorbeeld gebeurtenissen waarin het veld Bron wordt weergegeven Defrag, de juiste ProviderName is Microsoft-Windows-Defrag.

Als uw query gegevens uit gearchiveerde gebeurtenislogboeken moet ophalen, gebruikt u de padsleutel . De padwaarde geeft het volledige pad naar het logboekbestand op. Zie het blogbericht Scripting Guy , PowerShell gebruiken om opgeslagen gebeurtenislogboeken te parseren voor fouten voor meer informatie.

Geïnventareerde waarden gebruiken in een hash-tabel

Trefwoorden is de volgende sleutel in de hash-tabel. Het gegevenstype Trefwoorden is een matrix van het [long] waardetype dat een groot getal bevat. Gebruik de volgende opdracht om de maximumwaarde van [long]:

[long]::MaxValue
9223372036854775807

Voor de sleutel Trefwoorden gebruikt PowerShell een getal, niet een tekenreeks zoals Beveiliging. In Windows Logboeken worden de trefwoorden weergegeven als tekenreeksen, maar ze zijn geïnventariseerd. Als u in de hashtabel de sleutel Trefwoorden gebruikt met een tekenreekswaarde, wordt er een foutbericht weergegeven.

Open de Windows Logboeken en klik in het deelvenster Acties op Huidig logboek filteren. In het vervolgkeuzemenu Trefwoorden worden de beschikbare trefwoorden weergegeven, zoals wordt weergegeven in de volgende schermopname:

Afbeelding van Windows Logboeken trefwoorden

Gebruik de volgende opdracht om de StandardEventKeywords eigenschapsnamen weer te geven.

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

De opgesomde waarden worden beschreven in . NET Framework. Zie StandardEventKeywords Opsomming voor meer informatie.

De namen en opsommingswaarden van trefwoorden zijn als volgt:

Naam Weergegeven als
AuditFailure 4503599627370496
AuditSuccess 9007199254740992
CorrelationHint2 18014398509481984
EventLogClassic 36028797018963968
2251799813685248
WdiDiagnostic 1125899906842624
WdiContext 562949953421312
ResponseTime 281474976710656
Geen 0

Werk de hashtabel bij en neem het sleutel-waardepaar op met de sleutel, trefwoorden en de opsommingswaarde EventLogClassic 36028797018963968.

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

Trefwoorden statische eigenschapswaarde (optioneel)

De sleutel Trefwoorden is geïnventariseerd, maar u kunt een statische eigenschapsnaam gebruiken in de hash-tabelquery. In plaats van de geretourneerde tekenreeks te gebruiken, moet de eigenschapsnaam worden geconverteerd naar een waarde met de eigenschap Value__ .

In het volgende script wordt bijvoorbeeld de eigenschap Value__ gebruikt.

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

Filteren op gebeurtenis-id

Voor specifiekere gegevens worden de resultaten van de query gefilterd op gebeurtenis-id. De gebeurtenis-id wordt in de hash-tabel als sleutel-idverwezen en de waarde is een specifieke gebeurtenis-id. In de Windows-Logboeken wordt de gebeurtenis-id weergegeven. In dit voorbeeld wordt gebeurtenis-id 1023 gebruikt.

Werk de hashtabel bij en neem het sleutel-waardepaar op met de sleutel, id en de waarde 1023.

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

Filteren op niveau

Als u de resultaten verder wilt verfijnen en alleen gebeurtenissen wilt opnemen die fouten zijn, gebruikt u de sleutel Niveau . In Windows Logboeken wordt het niveau weergegeven als tekenreekswaarden, maar ze zijn geïnventariseerd. Als u in de hashtabel de sleutel Niveau gebruikt met een tekenreekswaarde, wordt er een foutbericht weergegeven.

Niveau bevat waarden zoals Fout, Waarschuwing of Informatie. Gebruik de volgende opdracht om de StandardEventLevel eigenschapsnamen weer te geven.

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

De opgesomde waarden worden beschreven in . NET Framework. Zie StandardEventLevel Opsomming voor meer informatie.

De namen en opsommingswaarden van de niveausleutel zijn als volgt:

Naam Weergegeven als
Uitgebreid 5
Informatief 4
Waarschuwing 3
Error 2
Kritiek 1
LogAlways 0

De hashtabel voor de voltooide query bevat de sleutel, het niveau en de waarde 2.

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

Statische eigenschap op niveau in opsomming (optioneel)

De sleutel Niveau is geïnventariseerd, maar u kunt een statische eigenschapsnaam gebruiken in de hash-tabelquery. In plaats van de geretourneerde tekenreeks te gebruiken, moet de eigenschapsnaam worden geconverteerd naar een waarde met de eigenschap Value__ .

In het volgende script wordt bijvoorbeeld de eigenschap Value__ gebruikt.

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