Aracılığıyla paylaş


FilterHashtable ile Get-WinEvent sorguları oluşturma

Bu örnek yalnızca Windows platformları için geçerlidir.

Özgün 3 Haziran 2014 Betik Oluşturma Elemanı blog gönderisini okumak için bkz . Olay Günlüğünü PowerShell ile Filtrelemek için FilterHashTable Kullanma.

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

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

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

Numaralandırma hakkında blog gönderileri

Bu makalede, bir karma tabloda numaralandırılmış değerlerin nasıl kullanılacağı hakkında bilgi srilmektedir. Numaralandırma hakkında daha fazla bilgi için bu Scripting Guy blog 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 numaralandırma hakkında blog gönderileri betiği oluşturma guy serisine bakın.

Karma tablo anahtar-değer çiftleri

Verimli sorgular oluşturmak için FilterHashtable parametresiyle cmdlet'ini kullanınGet-WinEvent. FilterHashtable , Windows olay günlüklerinden belirli bilgileri almak için bir karma tabloyu filtre olarak 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ırdaysa, bunlar noktalı virgülle ayrılmalıdır. Her anahtar-değer çifti ayrı bir satırdaysa noktalı virgül gerekmez. Örneğin, bu makale anahtar-değer çiftlerini ayrı satırlara yerleştirir ve noktalı virgül kullanmaz.

Bu örnek FilterHashtable parametresinin anahtar-değer çiftlerinden birkaçını kullanır. Tamamlanan sorgu LogName, ProviderName, Anahtar Sözcükler, Kimlik ve Düzey bilgilerini içerir.

Kabul edilen anahtar-değer çiftleri aşağıdaki tabloda gösterilmiştir ve Get-WinEvent FilterHashtable parametresinin belgelerinde yer alır.

Aşağıdaki tabloda anahtar adları, veri türleri ve bir veri değeri için joker karakterlerin kabul edilip edilmediği gösterilir.

Anahtar adı Değer veri türü Joker karakterler kabul edilsin mi?
LogName <String[]> Yes
ProviderName <String[]> Yes
Yol <String[]> Hayır
Anahtar sözcükler <Long[]> Hayır
Kimlik <Int32[]> Hayır
Level <Int32[]> Hayır
StartTime <DateTime> Hayır
EndTime <DateTime> Hayır
UserID <SID> Hayır
Veri <String[]> Hayır
<named-data> <String[]> Hayır

anahtar, <named-data> 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ı sorgulayabilirsiniz:

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

Not

sorgulama <named-data> özelliği PowerShell 6'ya eklendi.

Karma tabloyla sorgu oluşturma

Sonuçları doğrulamak ve sorunları gidermek için karma tablosunun bir kerede bir anahtar-değer çifti oluşturulmasına yardımcı olur. Sorgu, Uygulama günlüğünden veri alır. Karma tablo ile Get-WinEvent -LogName Applicationeşdeğerdir.

Başlamak için sorguyu Get-WinEvent oluşturun. FilterHashtable parametresinin anahtar-değer çiftini key, LogName ve değeri olan Application ile kullanın.

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

ProviderName anahtarıyla karma tablo oluşturmaya devam edin. ProviderName genellikle 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 tablosunu güncelleştirin ve anahtar-değer çiftini key, ProviderName ve değeriyle .NET Runtimeekleyin.

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

Not

Bazı olay sağlayıcıları için, Olay Özellikleri'ndeki Ayrıntılar sekmesine bakılarak doğru ProviderName elde edilebilir. Örneğin, Kaynak alanının gösterdiği Defragolaylar doğru ProviderName şeklindedirMicrosoft-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, Kaydedilmiş Olay Günlüklerini Hatalar için Ayrıştırmak için PowerShell'i Kullanma makalesine bakın.

Karma tabloda numaralandırılmış değerleri kullanma

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

[long]::MaxValue
9223372036854775807

Anahtar Sözcükler anahtarı için PowerShell, Güvenlik gibi bir dizeyi değil, bir sayıyı kullanır. Windows Olay Görüntüleyicisi Anahtar Sözcükleri dize olarak görüntüler, ancak bunlar numaralandırılmış değerlerdir. Karma tabloda Anahtar Sözcükler anahtarını bir dize değeriyle kullanırsanız bir hata iletisi 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üklerinin görüntüsü

Özellik adlarını görüntülemek StandardEventKeywords için aşağıdaki komutu kullanın.

[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'te belgelenmiştir. Daha fazla bilgi için bkz . StandardEventKeywords Numaralandırması.

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

Veri Akışı Adı Değer
AuditFailure 4503599627370496
AuditSuccess 9007199254740992
CorrelationHint2 18014398509481984
EventLogClassic 36028797018963968
Sqm 2251799813685248
WdiDiagnostic 1125899906842624
WdiContext 562949953421312
ResponseTime 281474976710656
Hiçbiri 0

Karma tabloyu güncelleştirin ve anahtar-değer çiftini anahtar, Anahtar Sözcükler ve EventLogClassic numaralandırma değeriyle 36028797018963968 ekleyin.

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ırılır, ancak karma tablo sorgusunda statik özellik adı kullanabilirsiniz. Döndürülen dizeyi kullanmak yerine, özellik adı Value__ özelliğine sahip bir değere dönüştürülmelidir.

Örneğin, aşağıdaki betik Value__ özelliğini 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 filtrelenir. Karma tabloda Olay Kimliğine anahtar kimliği olarak başvurulur ve değer belirli bir Olay Kimliği'dir. Windows Olay Görüntüleyicisi Olay Kimliği'ni görüntüler. Bu örnekte Olay Kimliği 1023 kullanılır.

Karma tabloyu güncelleştirin ve anahtar-değer çiftini anahtar, kimlik ve 1023 değeriyle ekleyin.

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üzeyi dize değerleri olarak görüntüler, ancak bunlar numaralandırılmış değerlerdir. Karma tabloda Düzey anahtarını bir dize değeriyle kullanırsanız bir hata iletisi görüntülenir.

Düzey Hata, Uyarı veya Bilgilendirme gibi değerlere sahiptir. Özellik adlarını görüntülemek StandardEventLevel için aşağıdaki 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ırılmış değerler .NET Framework'te belgelenmiştir. Daha fazla bilgi için bkz . StandardEventLevel Sabit Listesi.

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

Veri Akışı Adı Değer
Ayrıntılı 5
Bilgi 4
Uyarı 3
Hata 2
Kritik 1
LogAlways 0

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

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

Numaralandırmada düzey statik özelliği (isteğe bağlı)

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

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

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