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

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 Loggboken. I följande skärmbild till exempel .NET Runtime :

Bild av Windows Loggboken-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 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. Den nedrullningsbara menyn Nyckelord visar de tillgängliga nyckelorden enligt följande skärmbild:

Bild av Nyckelord för Windows Loggboken

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ärdet36028797018963968.

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