Get-WinEvent-query's maken met FilterHashtable
Zie FilterHashTablegebruiken om gebeurtenislogboek te filteren met PowerShell voor het lezen van het oorspronkelijke blogbericht over Scripting Guy van 3 juni 2014.
Dit artikel is een fragment van de oorspronkelijke blogpost en legt uit hoe u de Get-WinEvent parameter FilterHashtable van de cmdlet kunt gebruiken om gebeurtenislogboeken te filteren. De powershell-cmdlet is een krachtige methode voor het Get-WinEvent filteren van Windows en diagnostische logboeken. De prestaties verbeteren wanneer een Get-WinEvent query de parameter FilterHashtable gebruikt.
Wanneer u met grote gebeurtenislogboeken werkt, is het niet efficiënt om objecten via de pijplijn naar een opdracht te Where-Object verzenden. Vóór PowerShell 6 Get-EventLog was de cmdlet een andere optie om logboekgegevens op te halen. De volgende opdrachten zijn bijvoorbeeld inefficiënt om de microsoft-Windows-defrag-logboeken 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'
}
Blogposts over de semanier
In dit artikel wordt informatie gegeven over het gebruik van geïndeereerde waarden in een hash-tabel. Lees deze blogberichten over Scripting Guy voor meer informatie over de -enumeratie. Zie Enumerations and Valuesvoor het maken van een functie die de geïndeereerde waarden retourneert. Zie de Scripting Guy-reeks blogposts over de -enumeratie voor meer informatie.
Sleutel-waardeparen voor hash-tabel
Als u efficiënte query's wilt maken, gebruikt u Get-WinEvent de cmdlet met de parameter FilterHashtable.
FilterHashtable accepteert een hashtabel als filter om specifieke informatie op te halen uit Windows gebeurtenislogboeken. Een hash-tabel maakt gebruik van sleutel-waardeparen. Zie voor meer informatie over hashtabellen about_Hash_Tables.
Als de sleutel-waardeparen zich op dezelfde regel, moeten ze worden gescheiden door een puntkomma. Als elk sleutel-waardepaar zich op een afzonderlijke regel, is de puntkomma niet nodig. Dit artikel plaatst sleutel-waardeparen bijvoorbeeld op afzonderlijke regels en maakt geen gebruik van puntkomma's.
In dit voorbeeld worden verschillende sleutel-waardeparen van de parameter FilterHashtable gebruikt. De voltooide query bevat LogName, ProviderName, Keywords, ID en Level.
De geaccepteerde sleutel-waardeparen worden weergegeven in de volgende tabel en zijn opgenomen in de documentatie voor de parameter Get-WinEvent FilterHashtable.
In de volgende tabel worden de sleutelnamen en gegevenstypen weergegeven en wordt weergegeven of jokertekens worden geaccepteerd voor een gegevenswaarde.
| Sleutelnaam | Waardegegevenstype | Accepteert u jokertekens? |
|---|---|---|
| LogName | <String[]> |
Yes |
| ProviderName | <String[]> |
Yes |
| Pad | <String[]> |
No |
| Trefwoorden | <Long[]> |
No |
| Id | <Int32[]> |
No |
| Niveau | <Int32[]> |
No |
| StartTime | <DateTime> |
No |
| EndTime | <DateTime> |
No |
| UserID | <SID> |
No |
| Gegevens | <String[]> |
Nee |
<named-data> |
<String[]> |
Nee |
De <named-data> sleutel vertegenwoordigt een benoemd veld gebeurtenisgegevens. De gebeurtenis Perflib 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 deze gebeurtenissen opvragen met behulp van de volgende opdracht:
Get-WinEvent -FilterHashtable @{LogName='Application'; 'Service'='Bits'}
Notitie
De mogelijkheid om te zoeken <named-data> naar is toegevoegd in PowerShell 6.
Een query bouwen met een hash-tabel
Als u resultaten wilt controleren en problemen wilt oplossen, kunt u de hashtabel met één sleutel-waardepaar tegelijk bouwen. De query haalt gegevens op uit het toepassingslogboek. De hash-tabel is gelijk aan Get-WinEvent -LogName Application .
Maak om te beginnen de Get-WinEvent query. Gebruik het sleutel-waardepaar van de parameter FilterHashtable met de sleutel, LogName en de waarde Application.
Get-WinEvent -FilterHashtable @{
LogName='Application'
}
Ga door met het bouwen van de hash-tabel met de sleutel ProviderName. Meestal is de ProviderName de naam die wordt weergegeven in het veld Bron in Windows Logboeken. Bijvoorbeeld in .NET Runtime de volgende schermopname:

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. Gebeurtenissen waarbij in het veld Bron bijvoorbeeld wordt weer Defrag geven, de juiste ProviderName is Microsoft-Windows-Defrag .
Als uw query gegevens moet opvragen uit gearchiveerde gebeurtenislogboeken, gebruikt u de padsleutel. Met de waarde Pad geeft u het volledige pad naar het logboekbestand op. Zie het blogbericht Scripting Guy use PowerShell to Parse Saved Event Logs for Errors (PowerShellgebruiken om opgeslagen gebeurtenislogboeken voor fouten te parseren) voor meer informatie.
Geïndeereerde waarden gebruiken in een hash-tabel
Trefwoorden is de volgende sleutel in de hashtabel. Het gegevenstype Trefwoorden is een matrix van het [long] waardetype dat een groot getal bevat. Gebruik de volgende opdracht om de maximumwaarde van te [long] vinden:
[long]::MaxValue
9223372036854775807
Voor de sleutel Trefwoorden gebruikt PowerShell een getal, niet een tekenreeks zoals Beveiliging. Windows Logboeken trefwoorden worden weergegeven als tekenreeksen, maar het zijn geïndeereerde waarden. Als u in de hashtabel de sleutel Trefwoorden met een tekenreekswaarde gebruikt, wordt er een foutbericht weergegeven.
Open de Windows Logboeken en klik in het deelvenster Acties op Huidig logboek filteren. In de vervolgkeuzelijst Trefwoorden worden de beschikbare trefwoorden weergegeven, zoals wordt weergegeven in de volgende schermopname:

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 geïndeereerde waarden worden beschreven in de .NET Framework. Zie StandardEventKeywords Enumeration voor meer informatie.
De trefwoordennamen en geïndeereerde waarden zijn als volgt:
| Name | Waarde |
|---|---|
| AuditFailure | 4503599627370496 |
| AuditSuccess | 9007199254740992 |
| CorrelationHint2 | 18014398509481984 |
| EventLogClassic | 36028797018963968 |
| M² | 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 waarde van de EventLogClassic-36028797018963968 .
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
}
Sleutelwoorden statische eigenschapswaarde (optioneel)
De sleutel Sleutelwoorden wordt geïnsemaneerd, maar u kunt een statische eigenschapsnaam gebruiken in de query van de hash-tabel. In plaats van de geretourneerde tekenreeks te gebruiken, moet de eigenschapsnaam worden geconverteerd naar een waarde met de Value__ eigenschap.
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
Om specifiekere gegevens op te halen, worden de resultaten van de query gefilterd op Gebeurtenis-id. Er wordt in de hashtabel naar de gebeurtenis-id verwezen als de sleutel-id en de waarde is een specifieke gebeurtenis-id. In Windows Logboeken wordt de gebeurtenis-id weergegeven. In dit voorbeeld wordt gebeurtenis-id 1023 gebruikt.
Werk de hashtabel bij en neem het sleutel-waardepaar met de sleutel, id en de waarde 1023 op.
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. Windows Logboeken niveau wordt weergegeven als tekenreekswaarden, maar het zijn geïndeereerde waarden. Als u in de hashtabel de sleutel Niveau met een tekenreekswaarde gebruikt, wordt er een foutbericht weergegeven.
Niveau heeft waarden zoals Fout, Waarschuwing of Informatief. 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 geïndeereerde waarden worden beschreven in de .NET Framework. Zie StandardEventLevel Enumeration voor meer informatie.
De namen en geïndeereerde waarden van de sleutel Niveau zijn als volgt:
| Name | Waarde |
|---|---|
| Uitgebreid | 5 |
| Informatief | 4 |
| Waarschuwing | 3 |
| Fout | 2 |
| Kritiek | 1 |
| LogAlways | 0 |
De hashtabel voor de voltooide query bevat de sleutel, Niveau en de waarde, 2.
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
ID=1023
Level=2
}
Statische eigenschap op niveau in enumeratie (optioneel)
De sleutel Niveau wordt opgeseed, maar u kunt een statische eigenschapsnaam gebruiken in de query voor de hash-tabel. In plaats van de geretourneerde tekenreeks te gebruiken, moet de eigenschapsnaam worden geconverteerd naar een waarde met de Value__ eigenschap.
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__
}