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:

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:

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