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:

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

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:

Bild av Windows Loggboken nyckelord

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