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-WinEvent FilterHashtable.
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 |
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 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-id verwezen 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__
}