Skapar Get-WinEvent-frågor med FilterHashtable
Det här exemplet gäller endast för Windows-plattformar.
Om du vill läsa det ursprungliga blogginlägget från skriptkillen 3 juni 2014 läser du 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 cmdletens Get-WinEvent
FilterHashtable-parameter för att filtrera händelseloggar. PowerShells Get-WinEvent
cmdlet är en kraftfull metod för att filtrera Händelse- och diagnostikloggar i Windows. Prestanda förbättras när en Get-WinEvent
fråga använder parametern FilterHashtable .
När du arbetar med stora händelseloggar är det inte effektivt att skicka objekt ned i pipelinen till ett Where-Object
kommando. Innan PowerShell 6 var cmdleten Get-EventLog
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 innehåller information om hur du använder uppräknade värden i en hash-tabell. Mer information om uppräkning finns i blogginläggen från 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 skript guy-serien med blogginlägg om uppräkning.
Nyckel/värde-par för hashtabell
Om du vill skapa effektiva frågor använder du cmdleten Get-WinEvent
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 är på samma rad måste de avgränsas med ett 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.
Det här exemplet använder flera av FilterHashtable-parameterns nyckel/värde-par. Den slutförda frågan innehåller LogName, ProviderName, Nyckelord, ID och Nivå.
De godkända nyckel/värde-paren 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[]> |
Nej |
Nyckelord | <Long[]> |
Nej |
ID | <Int32[]> |
Nej |
Nivå | <Int32[]> |
Nej |
StartTime | <DateTime> |
Nej |
EndTime | <DateTime> |
Nej |
UserID | <SID> |
Nej |
Data | <String[]> |
Nej |
<named-data> |
<String[]> |
Nej |
Nyckeln <named-data>
representerar ett namngivet händelsedatafält. Perflib-händelsen 1008 kan till exempel 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 hjälp av följande kommando:
Get-WinEvent -FilterHashtable @{LogName='Application'; 'Service'='Bits'}
Kommentar
Möjligheten att fråga efter <named-data>
har lagts 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 hashtabellen ett nyckel/värde-par i taget. Frågan hämtar data från programloggen. Hash-tabellen motsvarar Get-WinEvent -LogName Application
.
Börja genom att skapa frågan Get-WinEvent
. 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 ProviderName . ProviderName är vanligtvis det namn som visas i fältet Källa i Windows Prikazivač događaja. I följande skärmbild till exempel .NET Runtime
:
Bild av Windows Prikazivač događaja-källor
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'
}
Kommentar
För vissa händelseprovidrar kan rätt ProviderName hämtas genom att titta på fliken Information i Händelseegenskaper. Till exempel händelser där fältet Källa visar , är rätt ProviderName Microsoft-Windows-Defrag
.Defrag
Om frågan behöver hämta data från arkiverade händelseloggar använder du sökvägsnyckeln. Värdet Sökväg anger den fullständiga sökvägen till loggfilen. Mer information finns i blogginlägget Skriptkille : Använd 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 värdetypen [long]
som innehåller ett stort tal. Använd följande kommando för att hitta det maximala värdet för [long]
:
[long]::MaxValue
9223372036854775807
För nyckelordsnyckeln använder PowerShell ett tal, inte en sträng som Säkerhet. Windows Prikazivač događaja 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-Prikazivač događaja och klicka på Filtrera aktuell logg i fönstret Åtgärder. Den nedrullningsbara menyn Nyckelord visar de tillgängliga nyckelorden enligt följande skärmbild:
Bild av Nyckelord för Windows Prikazivač događaja
Använd följande kommando för att visa egenskapsnamnen StandardEventKeywords
.
[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 Enumeration.
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 |
Inga | 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
}
Egenskapsvärde för statiska nyckelord (valfritt)
Nyckeln Nyckelord 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 med egenskapen Value__ .
Följande skript använder till exempel egenskapen Value__ .
$C = [System.Diagnostics.Eventing.Reader.StandardEventKeywords]::EventLogClassic
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=$C.Value__
}
Filtrering efter händelse-ID
För att få 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. Windows-Prikazivač događaja visar 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 resultatet ytterligare och endast inkludera händelser som är fel använder du nivånyckeln. Windows Prikazivač događaja 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 egenskapsnamnen StandardEventLevel
.
[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 Enumeration.
Nivånyckelns namn och uppräknade värden är följande:
Name | Värde |
---|---|
Utförlig | 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 med egenskapen Value__ .
Följande skript använder till exempel egenskapen Value__ .
$C = [System.Diagnostics.Eventing.Reader.StandardEventLevel]::Informational
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
ID=1023
Level=$C.Value__
}