Delen via


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 parameter FilterHashtable van de Get-WinEvent cmdlet gebruikt om gebeurtenislogboeken te filteren. De Get-WinEvent-cmdlet van 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 niet efficiënt voor het filteren van de Microsoft-Windows-Defrag-logboeken:

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 enumeratie

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

Hashtabel sleutel-waardeparen

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-waarde paren. Zie about_Hash_Tablesvoor meer informatie over hashtabellen.

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

In dit voorbeeld worden verschillende van de FilterHashtable parameter sleutel-waarde paren gebruikt. De voltooide query bevat LogName, ProviderName, Trefwoorden, -iden niveau.

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

In de volgende tabel staan de sleutelnamen, gegevenstypen en de acceptatie van jokertekens voor een gegevenswaarde.

Sleutelnaam Waardegegevenstype Accepteert jokertekens?
LogNaam <String[]> Ja
Naam van de aanbieder <String[]> Ja
Pad <String[]> Nee.
Zoekwoorden <Long[]> Nee.
ID-kaart <Int32[]> Nee.
Niveau <Int32[]> Nee.
Begintijd <DateTime> Nee.
Eindtijd <DateTime> Nee.
UserID <SID> Nee.
Gegevens <String[]> Nee.
<named-data> <String[]> Nee.

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 op <named-data> is toegevoegd in PowerShell 6.

Een query maken met een hash-tabel

Om de resultaten te controleren en problemen op te lossen, helpt het om de hashtabel per keer één sleutel-waardepaar op 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 de FilterHashtable parameter sleutelwaarde koppelen aan de sleutel, LogNameen de waarde, Application.

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

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

afbeelding van Windows Logboeken-bronnen

Werk de hash-tabel bij en neem het sleutel-waarde paar op met de sleutel, ProviderName, en de waarde, .NET Runtime.

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

Notitie

Voor sommige gebeurtenisproviders kunt u de juiste ProviderName- verkrijgen door te kijken naar het tabblad Details in gebeurteniseigenschappen. Gebeurtenissen waarin het veld Bron bijvoorbeeld Defragweergeeft, is de juiste ProviderName-Microsoft-Windows-Defrag.

Als uw query gegevens uit gearchiveerde gebeurtenislogboeken moet ophalen, gebruikt u de Pad sleutel. De waarde van het pad specificeert het volledige pad naar het logbestand. Voor meer informatie, zie de blogpost Scripting Guy: PowerShell gebruiken om opgeslagen gebeurtenislogboeken te parseren op fouten.

Geïnventareerde waarden gebruiken in een hash-tabel

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

[long]::MaxValue
9223372036854775807

Voor de trefwoorden sleutel gebruikt PowerShell een getal, niet een tekenreeks zoals Security. Windows Event Viewer toont de Trefwoorden als tekenreeksen, maar het zijn opgesomde waardes. Als u in de hashtabel de Trefwoorden sleutel met een tekenreekswaarde gebruikt, wordt er een foutbericht weergegeven.

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

afbeelding van trefwoorden voor Windows Gebeurtenissenlogboek

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 de .NET Framework-. Zie StandardEventKeywords Opsommingvoor meer informatie.

De trefwoorden namen en opgesomde waarden zijn als volgt:

Naam Waarde
AuditFailure 4503599627370496
AuditSucces 9007199254740992
CorrelationHint2 18014398509481984
EventLogClassic 36028797018963968
2251799813685248
WdiDiagnostic 1125899906842624
WdiContext 562949953421312
ResponseTime 281474976710656
Geen 0

Werk de hashtabel bij en voeg het sleutel-waarde paar toe met de sleutel, Trefwoorden, en de EventLogClassic-opsommingswaarde, 36028797018963968.

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

Trefwoorden statische eigenschapswaarde (optioneel)

De Trefwoorden sleutel is geïnventariseerd, maar u kunt een statische eigenschapsnaam gebruiken in de hashtabel-query. 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 verwezen als de sleutel id- en de waarde is een specifieke gebeurtenis-id. In de Windows Logboeken wordt de gebeurtenis-idweergegeven. In dit voorbeeld wordt gebeurtenis-id 1023gebruikt.

Werk de hash-tabel bij en neem de sleutelwaarde op paar 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 niveau--sleutel. Windows Logboekviewer geeft de Level weer als tekenreekswaarden, maar het zijn geënumererde waarden. Als u in de hashtabel de sleutel niveau met een tekenreekswaarde gebruikt, wordt er een foutbericht weergegeven.

niveau waarden bevat, zoals Fout, Waarschuwingof Informatieve. 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 de .NET Framework-. Zie Opsomming StandardEventLevelvoor meer informatie.

De namen en opsommingswaarden van de niveau sleutel zijn als volgt:

Naam Waarde
Breedsprakig 5
Informatief 4
Waarschuwing 3
Fout 2
Kritisch 1
LogAlways 0

De hash-tabel voor de voltooide query bevat de sleutel, niveauen 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 opgesomd, maar u kunt een statische eigenschapsnaam gebruiken in de hashtabelquery. 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__
}