Skapar Get-WinEvent-frågor med FilterHashtable
Om du vill läsa blogginlägget från scripting Guy från den 3 juni 2014 kan du läsa Använda FilterHashTable för att filtrera händelseloggen med PowerShell.
Den här artikeln är ett utdrag ur det ursprungliga blogginlägget och förklarar hur du använder Get-WinEvent cmdletens FilterHashtable-parameter för att filtrera händelseloggar. PowerShells Get-WinEvent cmdlet är en kraftfull metod för att filtrera Windows händelseloggar och diagnostikloggar. Prestandan förbättras när Get-WinEvent en fråga använder parametern FilterHashtable.
När du arbetar med stora händelseloggar är det inte effektivt att skicka objekt nedåt i pipelinen till ett Where-Object kommando. Före PowerShell 6 var Get-EventLog cmdleten ett annat alternativ för att hämta loggdata. Följande kommandon är till exempel ineffektiva för att filtrera loggarna Microsoft-Windows-Defrag:
Get-EventLog -LogName Application | Where-Object Source -Match defrag
Get-WinEvent -LogName Application | Where-Object { $_.ProviderName -Match 'defrag' }
Följande kommando använder en hash-tabell som förbättrar prestandan:
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='*defrag'
}
Blogginlägg om uppräkning
Den här artikeln visar information om hur du använder uppräknade värden i en hash-tabell. Mer information om uppräkning finns i blogginläggen om Scripting Guy. Information om hur du skapar en funktion som returnerar de uppräknade värdena finns i Uppräkningar och värden. Mer information finns i Scripting Guy-serien med blogginlägg om uppräkning.
Nyckel/värde-par för hash-tabell
Om du vill skapa effektiva frågor använder du Get-WinEvent cmdleten med parametern FilterHashtable.
FilterHashtable accepterar en hash-tabell som ett filter för att hämta specifik information från Windows händelseloggar. En hash-tabell använder nyckel/värde-par. Mer information om hash-tabeller finns i about_Hash_Tables.
Om nyckel/värde-paren finns på samma rad måste de avgränsas med semikolon. Om varje nyckel/värde-par finns på en separat rad behövs inte semikolonet. Den här artikeln placerar till exempel nyckel/värde-par på separata rader och använder inte semikolon.
I det här exemplet används flera av filterhashtable-parameterns nyckel/värde-par. Den slutförda frågan innehåller LogName, ProviderName, Nyckelord, ID och Nivå.
Godkända nyckel/värde-par visas i följande tabell och ingår i dokumentationen för parametern Get-WinEvent FilterHashtable.
I följande tabell visas nyckelnamn, datatyper och om jokertecken accepteras för ett datavärde.
| Nyckelnamn | Värdedatatyp | Accepterar jokertecken? |
|---|---|---|
| LogName | <String[]> |
Ja |
| ProviderName | <String[]> |
Ja |
| Sökväg | <String[]> |
Inga |
| Nyckelord | <Long[]> |
Inga |
| ID | <Int32[]> |
Inga |
| Nivå | <Int32[]> |
Inga |
| StartTime | <DateTime> |
Inga |
| EndTime | <DateTime> |
Inga |
| UserID | <SID> |
Inga |
| Data | <String[]> |
Inga |
<named-data> |
<String[]> |
Inga |
Nyckeln <named-data> representerar ett namngivet händelsedatafält. Till exempel kan Perflib-händelsen 1008 innehålla följande händelsedata:
<EventData>
<Data Name="Service">BITS</Data>
<Data Name="Library">C:\Windows\System32\bitsperf.dll</Data>
<Data Name="Win32Error">2</Data>
</EventData>
Du kan fråga efter dessa händelser med följande kommando:
Get-WinEvent -FilterHashtable @{LogName='Application'; 'Service'='Bits'}
Anteckning
Möjligheten att fråga efter <named-data> lades till i PowerShell 6.
Skapa en fråga med en hash-tabell
För att verifiera resultat och felsöka problem hjälper det att skapa hash-tabellen ett nyckel/värde-par i taget. Frågan hämtar data från programloggen. Hash-tabellen motsvarar Get-WinEvent -LogName Application .
Börja med att skapa Get-WinEvent frågan. Använd parametern FilterHashtables nyckel/värde-par med nyckeln LogName och värdet, Program.
Get-WinEvent -FilterHashtable @{
LogName='Application'
}
Fortsätt att skapa hash-tabellen med nyckeln Providernamn. ProviderName är vanligtvis det namn som visas i fältet Källa i Windows Loggboken. Till exempel .NET Runtime på följande skärmbild:

Uppdatera hash-tabellen och inkludera nyckel/värde-paret med nyckeln Providername och värdet , .NET Runtime .
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
}
Anteckning
För vissa händelseproviders kan rätt ProviderName hämtas genom att titta på fliken Information i Händelseegenskaper. Händelser där fältet Källa till exempel visar Defrag är rätt ProviderNamn Microsoft-Windows-Defrag .
Om din fråga behöver hämta data från arkiverade händelseloggar använder du nyckeln Sökväg. Värdet Sökväg anger den fullständiga sökvägen till loggfilen. Mer information finns i blogginlägget Scripting Guy, Use PowerShell to Parse Saved Event Logs for Errors (Använda PowerShell för att parsa sparade händelseloggar för fel).
Använda uppräknade värden i en hash-tabell
Nyckelord är nästa nyckel i hash-tabellen. Datatypen Nyckelord är en matris av [long] värdetypen som innehåller ett stort tal. Använd följande kommando för att hitta det högsta värdet för [long] :
[long]::MaxValue
9223372036854775807
För nyckeln Nyckelord använder PowerShell ett tal, inte en sträng, till exempel Security. Windows Loggboken visar Nyckelord som strängar, men de är uppräknade värden. Om du använder nyckeln Nyckelord med ett strängvärde i hash-tabellen visas ett felmeddelande.
Öppna Windows Loggboken och klicka på Filtrera aktuell logg i fönstret Åtgärder. I listrutan Nyckelord visas tillgängliga nyckelord, som du ser i följande skärmbild:

Använd följande kommando för att visa StandardEventKeywords egenskapsnamnen.
[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 uppräknade värdena dokumenteras i .NET Framework. Mer information finns i StandardEventKeywords-uppräkning.
Nyckelordens namn och uppräknade värden är följande:
| Name | Värde |
|---|---|
| AuditFailure | 4503599627370496 |
| AuditSuccess | 9007199254740992 |
| CorrelationHint2 | 18014398509481984 |
| EventLogClassic | 36028797018963968 |
| Kvm | 2251799813685248 |
| WdiDiagnostic | 1125899906842624 |
| WdiContext | 562949953421312 |
| ResponseTime | 281474976710656 |
| Ingen | 0 |
Uppdatera hash-tabellen och inkludera nyckel/värde-paret med nyckeln, Nyckelord och EventLogClassic-uppräkningsvärdet, 36028797018963968.
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
}
Statiskt egenskapsvärde för nyckelord (valfritt)
Nyckeln Keywords räknas upp, men du kan använda ett statiskt egenskapsnamn i hash-tabellfrågan. I stället för att använda den returnerade strängen måste egenskapsnamnet konverteras till ett värde Value__ egenskapen.
Följande skript använder till exempel Value__.
$C = [System.Diagnostics.Eventing.Reader.StandardEventKeywords]::EventLogClassic
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=$C.Value__
}
Filtrera efter händelse-ID
För att hämta mer specifika data filtreras frågans resultat efter händelse-ID. Händelse-ID refereras i hash-tabellen som nyckel-ID och värdet är ett specifikt händelse-ID. I Windows Loggboken visas händelse-ID:t. I det här exemplet används händelse-ID 1023.
Uppdatera hash-tabellen och inkludera nyckel/värde-paret med nyckeln, ID:t och värdet, 1023.
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
ID=1023
}
Filtrering efter nivå
Om du vill förfina resultaten ytterligare och endast inkludera händelser som är fel använder du nivånyckeln. Windows Loggboken visar Nivå som strängvärden, men de är uppräknade värden. Om du använder nivånyckeln med ett strängvärde i hash-tabellen visas ett felmeddelande.
Nivån har värden som Fel, Varning eller Information. Använd följande kommando för att visa StandardEventLevel egenskapsnamnen.
[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 uppräknade värdena dokumenteras i .NET Framework. Mer information finns i StandardEventLevel-uppräkning.
Nivånyckelns namn och uppräknade värden är följande:
| Name | Värde |
|---|---|
| Verbose | 5 |
| Information | 4 |
| Varning | 3 |
| Fel | 2 |
| Kritiskt | 1 |
| LogAlways | 0 |
Hash-tabellen för den slutförda frågan innehåller nyckeln, nivå och värdet, 2.
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
ID=1023
Level=2
}
Nivå statisk egenskap i uppräkning (valfritt)
Nivånyckeln räknas upp, men du kan använda ett statiskt egenskapsnamn i hash-tabellfrågan. I stället för att använda den returnerade strängen måste egenskapsnamnet konverteras till ett värde Value__ egenskapen.
Följande skript använder till exempel Value__.
$C = [System.Diagnostics.Eventing.Reader.StandardEventLevel]::Informational
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
ID=1023
Level=$C.Value__
}