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:

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. 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:

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 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
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__
}