Dela via


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