Skapa 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 3 juni 2014 Scripting Guy 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 Get-WinEvent
-cmdletens parameter FilterHashtable 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. 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 Microsoft-Windows-Defrag loggar:
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 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 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ärdepar. Mer information om hash-tabeller finns i about_Hash_Tables.
Om nyckel/värde- par är på samma rad måste de avgränsas med semikolon. Om varje nyckelvärde par är på en separat rad behövs inte semikolonet. Den här artikeln placerar till exempel nyckelvärde par på separata rader och använder inte semikolon.
I det här exemplet används flera av FilterHashtable parameterns nyckel-värdepar. Den slutförda frågan innehåller LogName, ProviderName, Keywords, IDoch Level.
De godkända nyckel-värde--paren visas i följande tabell och ingår i dokumentationen för Get-WinEventFilterHashtable-parametern.
I följande tabell visas nyckelnamn, datatyper och om jokertecken accepteras för ett datavärde.
Nyckelnamn | Värdedatatyp | Accepterar ersättningstecken? |
---|---|---|
Loggnamn | <String[]> |
Ja |
Leverantörsnamn | <String[]> |
Ja |
Väg | <String[]> |
Nej |
Nyckelord | <Long[]> |
Nej |
ID-nummer | <Int32[]> |
Nej |
Nivå | <Int32[]> |
Nej |
Starttid | <DateTime> |
Nej |
Sluttid | <DateTime> |
Nej |
UserID | <SID> |
Nej |
Uppgifter | <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'}
Anmärkning
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 en nyckelvärde par i taget. Frågan hämtar data från loggen Application. Hash-tabellen motsvarar Get-WinEvent -LogName Application
.
Börja genom att skapa frågan Get-WinEvent
. Använd FilterHashtable parameterns nyckelvärde par med nyckeln, LogNameoch värdet Application.
Get-WinEvent -FilterHashtable @{
LogName='Application'
}
Fortsätt att skapa hash-tabellen med nyckeln ProviderName. Vanligtvis är ProviderName det namn som visas i fältet Source i Windows Event Viewer. Till exempel .NET Runtime
i följande skärmbild:
Bild på källor i Windows Event Viewer
Uppdatera hash-tabellen och inkludera nyckel-värdeparet med nyckeln ProviderNamesamt värdet .NET Runtime
.
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
}
Anmärkning
För vissa händelseprovidrar kan rätt ProviderName hämtas genom att titta på fliken Information i Händelseegenskaper. Händelser där fältet Source visar till exempel Defrag
, är rätt ProviderNameMicrosoft-Windows-Defrag
.
Om frågan behöver hämta data från arkiverade händelseloggar använder du nyckeln Path. Värdet Path anger den fullständiga sökvägen till loggfilen. För mer information, se blogginlägget Scripting GuyAnvänd PowerShell för att analysera sparade händelseloggfiler efter fel.
Använda uppräknade värden i en hash-tabell
Nyckelord är nästa nyckel i hash-tabellen.
Nyckelord-datatypen är en matris av [long]
-värdetypen som rymmer ett stort antal värden. Använd följande kommando för att hitta det maximala värdet för [long]
:
[long]::MaxValue
9223372036854775807
För nyckeln Nyckelord använder PowerShell ett tal, inte en sträng som Security. Windows Loggboken visar Nyckelord som strängar, men de är uppräknade värden. Om du använder Nyckelord nyckel med ett strängvärde i hash-tabellen visas ett felmeddelande.
Öppna Windows Händelsevisaren och i Åtgärder-rutan klickar du på Filtrera aktuell logg. Den nedrullningsbara menyn Nyckelord visar tillgängliga nyckelord, enligt följande skärmbild:
bild av Nyckelord i Windows Händelseloggen
Använd följande kommando för att visa StandardEventKeywords
egenskapsnamn.
[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.
Nyckelord namn och uppräknade värden är följande:
Namn | Värde |
---|---|
GranskningMisslyckande | 4 503 599 627 370 496 |
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 Nyckelordoch uppräkningsvärdet EventLogClassic samt vä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 nyckeln ID och värdet är ett specifikt händelse-ID. Windows Event Viewer visar händelse-ID:t. I det här exemplet används händelse-ID 1023.
Uppdatera hash-tabellen och inkludera nyckel-värdepar med nyckeln ID 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 nyckeln nivå. Windows Händelsevisaren visar nivån som strängvärden, men de är uppräknade. Om du använder nyckeln nivå med ett strängvärde i hash-tabellen visas ett felmeddelande.
nivå har värden som Fel, Varningeller Informational. Använd följande kommando för att visa StandardEventLevel
egenskapsnamn.
[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.
level-nyckelns namn och uppräknade värden är följande:
Namn | Värde |
---|---|
Utförlig | 5 |
Informativt | 4 |
Varning | 3 |
Fel | 2 |
Kritisk | 1 |
LogAlways | 0 |
Hash-tabellen för den slutförda frågan innehåller nyckeln Leveloch värdet 2.
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
ID=1023
Level=2
}
Nivå i uppräkning som statisk egenskap (valfritt)
Nyckeln nivå 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__
}