FilterHashtable ile Get-WinEvent sorguları oluşturma

Özgün 3 Haziran 2014 betik Guy blog gönderisini okumak için bkz. PowerShell Ile olay günlüğünü filtrelemek Için filterhashtable kullanma.

Bu makale, özgün blog gönderisinin bir alıntısıdır ve Get-WinEvent olay günlüklerini filtrelemek için cmdlet 'In filterhashtable parametresinin nasıl kullanılacağını açıklar. PowerShell Get-WinEvent cmdlet 'i Windows olay ve tanılama günlüklerini filtrelemeye yönelik güçlü bir yöntemdir. Bir Get-WinEvent sorgu filterhashtable parametresini kullandığında performans geliştirilir.

Büyük olay günlükleriyle çalışırken, nesneleri işlem hattının altına bir komuta göndermek verimli değildir Where-Object . PowerShell 6 ' dan önce, Get-EventLog cmdlet günlük verilerini almaya yönelik başka bir seçenektir. örneğin, aşağıdaki komutlar Microsoft-Windows-Defrag günlüklerini filtrelemek için verimsiz bir örnektir:

Get-EventLog -LogName Application | Where-Object Source -Match defrag

Get-WinEvent -LogName Application | Where-Object { $_.ProviderName -Match 'defrag' }

Aşağıdaki komut, performansı geliştiren bir karma tablo kullanır:

Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='*defrag'
}

Listeleme hakkında blog gönderileri

Bu makalede, bir karma tablosunda numaralandırılmış değerlerin nasıl kullanılacağına ilişkin bilgiler sunulmaktadır. Listeleme hakkında daha fazla bilgi için bu komut dosyası Web günlüğü gönderilerini okuyun. Numaralandırılmış değerleri döndüren bir işlev oluşturmak için bkz. numaralandırmalar ve değerler. Daha fazla bilgi için bkz. Enumeration hakkında blog gönderilerinin Guy serisini komut dosyası oluşturma.

Karma tablo anahtar-değer çiftleri

Etkili sorgular oluşturmak için, Get-WinEvent cmdlet 'Ini filterhashtable parametresiyle kullanın. filterhashtable , Windows olay günlüklerinden belirli bilgileri almak için bir filtre olarak bir karma tablosu kabul eder. Karma tablo, anahtar-değer çiftlerini kullanır. Karma tabloları hakkında daha fazla bilgi için bkz. about_Hash_Tables.

Anahtar-değer çiftleri aynı satırlarsa, bunların noktalı virgülle ayrılması gerekir. Her anahtar-değer çifti ayrı bir satıralıyorsa, noktalı virgül gerekli değildir. Örneğin, bu makale, anahtar-değer çiftlerini ayrı satırlara koyar ve noktalı virgül kullanmaz.

Bu örnek, Filterhashtable parametresinin anahtar-değer çiftlerinin birkaçını kullanır. Tamamlanan sorgu logName, ProviderName, anahtar sözcükler, kimlik ve düzeyi içerir.

Kabul edilen anahtar-değer çiftleri aşağıdaki tabloda gösterilir ve Get-WinEvent filterhashtable parametresinin belgelerine eklenir.

Aşağıdaki tabloda, anahtar adları, veri türleri ve bir veri değeri için joker karakterler kabul edilip edilmeyeceğini gösterir.

Anahtar adı Değer veri türü Joker karakterler kabul ediyor mu?
Günlük adı <String[]> Yes
Adı <String[]> Yes
Yol <String[]> Hayır
Anahtar sözcükler <Long[]> Hayır
ID <Int32[]> Hayır
Level <Int32[]> Hayır
StartTime <DateTime> Hayır
EndTime <DateTime> Hayır
UserID <SID> Hayır
Veriler <String[]> Hayır
<named-data> <String[]> Hayır

<named-data>Anahtar, adlandırılmış bir olay veri alanını temsil eder. Örneğin, Perflib olayı 1008 aşağıdaki olay verilerini içerebilir:

<EventData>
  <Data Name="Service">BITS</Data>
  <Data Name="Library">C:\Windows\System32\bitsperf.dll</Data>
  <Data Name="Win32Error">2</Data>
</EventData>

Aşağıdaki komutu kullanarak bu olaylar için sorgulama yapabilirsiniz:

Get-WinEvent -FilterHashtable @{LogName='Application'; 'Service'='Bits'}

Not

Sorgu özelliği <named-data> PowerShell 6 ' da eklendi.

Karma tabloyla sorgu oluşturma

Sonuçları doğrulamak ve sorunları gidermek için, karma tabloyu bir seferde bir anahtar-değer çifti oluşturmaya yardımcı olur. Sorgu uygulama günlüğünden verileri alır. Karma tablosu ile eşdeğerdir Get-WinEvent -LogName Application .

Başlamak için Get-WinEvent sorguyu oluşturun. Filterhashtable parametresinin anahtar -değer çiftini anahtar, logName ve değer, uygulama ile birlikte kullanın.

Get-WinEvent -FilterHashtable @{
   LogName='Application'
}

ProviderName anahtarıyla karma tablo oluşturmaya devam edin. genellikle, ProviderName Windows Olay Görüntüleyicisi kaynak alanında görünen addır. Örneğin, .NET Runtime aşağıdaki ekran görüntüsünde:

Windows Olay Görüntüleyicisi kaynaklarının görüntüsü

Karma tabloyu güncelleştirin ve anahtar, ProviderName ve değeri ile anahtar-değer çiftini dahil edin .NET Runtime .

Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='.NET Runtime'
}

Not

Bazı olay sağlayıcıları için, olay özelliklerindeki Ayrıntılar sekmesine bakarak doğru ProviderName elde edilebilir. Örneğin, kaynak alanın gösterdiği olaylar Defrag doğru sağlayıcıdır Microsoft-Windows-Defrag .

Sorgunuzun arşivlenmiş olay günlüklerinden veri alması gerekiyorsa, yol anahtarını kullanın. Yol değeri, günlük dosyasının tam yolunu belirtir. Daha fazla bilgi için bkz. Guy blog gönderisi betiği, kaydedilen olay günlüklerini hatalara göre ayrıştırmak Için PowerShell 'i kullanın.

Bir karma tabloda numaralandırılmış değerleri kullanma

Anahtar sözcükler karma tablodaki bir sonraki anahtardır. Anahtar sözcükler veri türü, [long] büyük bir sayıyı tutan değer türünün bir dizisidir. En büyük değerini bulmak için aşağıdaki komutu kullanın [long] :

[long]::MaxValue
9223372036854775807

Anahtar sözcükler anahtarı Için, PowerShell güvenlik gibi bir dize değil bir sayı kullanır. Windows Olay Görüntüleyicisi , anahtar sözcükleri dizeler olarak görüntüler, ancak bunlar numaralandırılır. Karma tablosunda, anahtar sözcükler anahtarını bir dize değeriyle kullanırsanız bir hata mesajı görüntülenir.

Windows Olay Görüntüleyicisi açın ve eylemler bölmesinde geçerli günlüğü filtrele' ye tıklayın. Anahtar sözcükler açılan menüsünde, aşağıdaki ekran görüntüsünde gösterildiği gibi kullanılabilir anahtar sözcükler görüntülenir:

Windows Olay Görüntüleyicisi anahtar sözcüklerin görüntüsü

Özellik adlarını göstermek için aşağıdaki komutu kullanın 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…

Numaralandırılmış değerler .NET Framework belgelenmiştir. Daha fazla bilgi için bkz. StandardEventKeywords Enumeration.

Anahtar sözcük adları ve numaralandırılmış değerler aşağıdaki gibidir:

Name Değer
AuditFailure 4503599627370496
AuditSuccess 9007199254740992
CorrelationHint2 18014398509481984
EventLogClassic 36028797018963968
'Si 2251799813685248
Wdıdiagnostic 1125899906842624
WdiContext 562949953421312
ResponseTime 281474976710656
Hiçbiri 0

Karma tabloyu güncelleştirin ve anahtar-değer çiftini anahtar sözcükler, Keywords ve EventLogClassic enumeration değeriyle (veya ) 36028797018963968.

Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='.NET Runtime'
   Keywords=36028797018963968
}

Anahtar sözcükler statik özellik değeri (isteğe bağlı)

Anahtar Sözcükler anahtarı numaralandı, ancak karma tablo sorgusunda statik bir özellik adı kullanabilirsiniz. Döndürülen dizeyi kullanmak yerine, özellik adının Value__ özelliğine sahip bir değere dönüştürülmesi gerekir.

Örneğin, aşağıdaki betik Value__ kullanır.

$C = [System.Diagnostics.Eventing.Reader.StandardEventKeywords]::EventLogClassic
Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='.NET Runtime'
   Keywords=$C.Value__
}

Olay Kimliğine Göre Filtreleme

Daha belirli veriler almak için sorgunun sonuçları Olay Kimliğine göre filtrelenmiş olur. Olay Kimliğine karma tabloda anahtar kimliği olarak başvurulması ve değerin belirli bir Olay Kimliği olduğudur. Komut Windows Olay Görüntüleyicisi Olay Kimliğini görüntüler. Bu örnekte Olay Kimliği 1023 mektedir.

Karma tabloyu güncelleştirin ve anahtar-değer çiftini anahtar, kimlik ve değer olan 1023 ile birlikte girin.

Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='.NET Runtime'
   Keywords=36028797018963968
   ID=1023
}

Düzeye Göre Filtreleme

Sonuçları daha da geliştirmek ve yalnızca hata olan olayları dahil etmek için Düzey anahtarını kullanın. Windows Olay Görüntüleyicisi düzey dize değerleri olarak görüntülenir, ancak bunlar numaralandı değerlerdir. Karma tablosunda, Düzey anahtarını bir dize değeriyle kullanırsanız bir hata iletisi görüntülenir.

Düzeyin Error , Warning veya Informational gibi değerleri vardır. Özellik adlarını görüntülemek için aşağıdaki StandardEventLevel komutu kullanın.

[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;}

Numaralandı değerleri, içinde belgelenmiş .NET Framework. Daha fazla bilgi için bkz. StandardEventLevel Enumeration.

Düzey anahtarının adları ve numaralandı değerleri aşağıdaki gibidir:

Name Değer
Ayrıntılı 5
Bilgilendirici 4
Uyarı 3
Hata 2
Kritik 1
LogAlways 0

Tamamlanan sorgunun karma tablosu, Düzey anahtarını ve 2 değerini içerir.

Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='.NET Runtime'
   Keywords=36028797018963968
   ID=1023
   Level=2
}

Sabit numaralamada düzey statik özelliği (isteğe bağlı)

Düzey anahtarı numaralandı, ancak karma tablo sorgusunda statik bir özellik adı kullanabilirsiniz. Döndürülen dizeyi kullanmak yerine, özellik adının Value__ özelliğine sahip bir değere dönüştürülmesi gerekir.

Örneğin, aşağıdaki betik Value__ kullanır.

$C = [System.Diagnostics.Eventing.Reader.StandardEventLevel]::Informational
Get-WinEvent -FilterHashtable @{
   LogName='Application'
   ProviderName='.NET Runtime'
   Keywords=36028797018963968
   ID=1023
   Level=$C.Value__
}