Membuat kueri Get-WinEvent dengan FilterHashtable

Sampel ini hanya berlaku untuk platform Windows.

Untuk membaca posting blog Scripting Guy 3 Juni 2014 asli, lihat Menggunakan FilterHashTable untuk Memfilter Log Peristiwa dengan PowerShell.

Artikel ini adalah kutipan posting blog asli dan menjelaskan cara menggunakan Get-WinEvent parameter FilterHashtable cmdlet untuk memfilter log peristiwa. Cmdlet PowerShell Get-WinEvent adalah metode yang ampuh untuk memfilter peristiwa Windows dan log diagnostik. Performa meningkat saat Get-WinEvent kueri menggunakan parameter FilterHashtable .

Saat Anda bekerja dengan log peristiwa besar, tidak efisien untuk mengirim objek ke bawah alur ke Where-Object perintah. Sebelum PowerShell 6, Get-EventLog cmdlet adalah opsi lain untuk mendapatkan data log. Misalnya, perintah berikut tidak efisien untuk memfilter log Microsoft-Windows-Defrag :

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

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

Perintah berikut menggunakan tabel hash yang meningkatkan performa:

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

Posting blog tentang enumerasi

Artikel ini menyajikan informasi tentang cara menggunakan nilai enumerasi dalam tabel hash. Untuk informasi selengkapnya tentang enumerasi, baca posting blog Scripting Guy ini. Untuk membuat fungsi yang mengembalikan nilai enumerasi, lihat Enumerasi dan Nilai. Untuk informasi selengkapnya, lihat seri posting blog Scripting Guy tentang enumerasi.

Pasangan kunci-nilai tabel hash

Untuk membangun kueri yang efisien, gunakan Get-WinEvent cmdlet dengan parameter FilterHashtable . FilterHashtable menerima tabel hash sebagai filter untuk mendapatkan informasi tertentu dari log peristiwa Windows. Tabel hash menggunakan pasangan kunci-nilai . Untuk informasi selengkapnya tentang tabel hash, lihat about_Hash_Tables.

Jika pasangan kunci-nilai berada di baris yang sama, pasangan tersebut harus dipisahkan oleh titik koma. Jika setiap pasangan kunci-nilai berada di baris terpisah, titik koma tidak diperlukan. Misalnya, artikel ini menempatkan pasangan kunci-nilai pada baris terpisah dan tidak menggunakan titik koma.

Sampel ini menggunakan beberapa pasangan nilai kunci parameter FilterHashtable. Kueri yang telah selesai mencakup LogName, ProviderName, Kata Kunci, ID, dan Tingkat.

Pasangan kunci-nilai yang diterima ditampilkan dalam tabel berikut dan disertakan dalam dokumentasi untuk parameter Get-WinEventFilterHashtable.

Tabel berikut ini menampilkan nama kunci, jenis data, dan apakah karakter kartubebas diterima untuk nilai data.

Nama kunci Jenis data nilai Menerima karakter kartubebas?
LogName <String[]> Ya
ProviderName <String[]> Ya
Jalur <String[]> No
Kata Kunci <Long[]> No
ID <Int32[]> No
Tingkat <Int32[]> No
StartTime <DateTime> No
EndTime <DateTime> No
ID Pengguna <SID> No
Data <String[]> Tidak
<named-data> <String[]> Tidak

Kunci <named-data> mewakili bidang data peristiwa bernama. Misalnya, acara Perflib 1008 dapat berisi data peristiwa berikut:

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

Anda bisa mengkueri peristiwa ini menggunakan perintah berikut:

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

Catatan

Kemampuan untuk mengkueri <named-data> ditambahkan di PowerShell 6.

Membangun kueri dengan tabel hash

Untuk memverifikasi hasil dan memecahkan masalah, ini membantu membangun tabel hash satu pasangan kunci-nilai pada satu waktu. Kueri mendapatkan data dari log Aplikasi . Tabel hash setara dengan Get-WinEvent -LogName Application.

Untuk memulai, buat Get-WinEvent kueri. Gunakan pasangan kunci-nilai parameter FilterHashtable dengan kunci, LogName, dan nilai, Aplikasi.

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

Lanjutkan untuk membangun tabel hash dengan kunci ProviderName . Biasanya, ProviderName adalah nama yang muncul di bidang Sumber di Pemantau Peristiwa Windows. Misalnya, .NET Runtime dalam cuplikan layar berikut:

Gambar sumber Windows Pemantau Peristiwa

Perbarui tabel hash dan sertakan pasangan kunci-nilai dengan kunci, ProviderName, dan nilai , .NET Runtime.

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

Catatan

Untuk beberapa penyedia peristiwa, ProviderName yang benar dapat diperoleh dengan melihat tab Detail di Properti Peristiwa. Misalnya, peristiwa di mana bidang Sumber menunjukkan Defrag, ProviderName yang benar adalah Microsoft-Windows-Defrag.

Jika kueri Anda perlu mendapatkan data dari log peristiwa yang diarsipkan, gunakan kunci Jalur . Nilai Jalur menentukan jalur lengkap ke file log. Untuk informasi selengkapnya, lihat posting blog Scripting Guy , Gunakan PowerShell untuk Mengurai Log Peristiwa Tersimpan untuk Kesalahan.

Menggunakan nilai enumerasi dalam tabel hash

Kata kunci adalah kunci berikutnya dalam tabel hash. Jenis data Kata Kunci adalah array dari [long] jenis nilai yang menyimpan angka besar. Gunakan perintah berikut untuk menemukan nilai [long]maksimum :

[long]::MaxValue
9223372036854775807

Untuk kunci Kata Kunci , PowerShell menggunakan angka, bukan string seperti Keamanan. Windows Pemantau Peristiwa menampilkan Kata Kunci sebagai string, tetapi nilainya dijumlahkan. Dalam tabel hash, jika Anda menggunakan kunci Kata Kunci dengan nilai string, pesan kesalahan akan ditampilkan.

Buka Pemantau Peristiwa Windows dan dari panel Tindakan, klik Filter log saat ini. Menu drop-down Kata Kunci menampilkan kata kunci yang tersedia, seperti yang ditunjukkan pada cuplikan layar berikut:

Gambar kata kunci Windows Pemantau Peristiwa

Gunakan perintah berikut untuk menampilkan StandardEventKeywords nama properti.

[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…

Nilai enumerasi didokumenkan dalam .NET Framework. Untuk informasi selengkapnya, lihat Enumerasi StandardEventKeywords.

Nama Kata Kunci dan nilai yang dijumlahkan adalah sebagai berikut:

Nama Nilai
AuditFailure 4503599627370496
AuditSuccess 9007199254740992
KorelasiHint2 18014398509481984
EventLogClassic 36028797018963968
M2 2251799813685248
WdiDiagnostic 1125899906842624
WdiContext 562949953421312
ResponseTime 281474976710656
Tidak 0

Perbarui tabel hash dan sertakan pasangan kunci-nilai dengan kunci, Kata Kunci, dan nilai enumerasi EventLogClassic , 36028797018963968.

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

Kata kunci nilai properti statis (opsional)

Kunci Kata Kunci dijumlahkan, tetapi Anda bisa menggunakan nama properti statis dalam kueri tabel hash. Daripada menggunakan string yang dikembalikan, nama properti harus dikonversi menjadi nilai dengan properti Value__ .

Misalnya, skrip berikut menggunakan properti Value__ .

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

Pemfilteran menurut Id Peristiwa

Untuk mendapatkan data yang lebih spesifik, hasil kueri difilter menurut Id Peristiwa. Id Peristiwa direferensikan dalam tabel hash sebagai ID kunci dan nilainya adalah Id Peristiwa tertentu.Windows Pemantau Peristiwa menampilkan Id Peristiwa. Contoh ini menggunakan Id Peristiwa 1023.

Perbarui tabel hash dan sertakan pasangan kunci-nilai dengan kunci, ID, dan nilai, 1023.

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

Pemfilteran menurut Tingkat

Untuk lebih menyempurnakan hasil dan hanya menyertakan peristiwa yang merupakan kesalahan, gunakan kunci Tingkat . Windows Pemantau Peristiwa menampilkan nilai Tingkat sebagai string, tetapi nilai tersebut dijumlahkan. Dalam tabel hash, jika Anda menggunakan kunci Tingkat dengan nilai string, pesan kesalahan akan ditampilkan.

Tingkat memiliki nilai seperti Kesalahan, Peringatan, atau Informasi. Gunakan perintah berikut untuk menampilkan StandardEventLevel nama properti.

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

Nilai enumerasi didokumenkan dalam .NET Framework. Untuk informasi selengkapnya, lihat StandardEventLevel Enumeration.

Nama kunci Tingkat dan nilai yang dijumlahkan adalah sebagai berikut:

Nama Nilai
Verbose 5
Informasi 4
Peringatan 3
Kesalahan 2
Kritis 1
LogAlways 0

Tabel hash untuk kueri yang telah selesai mencakup kunci, Tingkat, dan nilai, 2.

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

Properti statis tingkat dalam enumerasi (opsional)

Kunci Tingkat dijumlahkan, tetapi Anda dapat menggunakan nama properti statis dalam kueri tabel hash. Daripada menggunakan string yang dikembalikan, nama properti harus dikonversi menjadi nilai dengan properti Value__ .

Misalnya, skrip berikut menggunakan properti Value__ .

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