Bagikan melalui


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

Postingan 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 dan nilai dalam 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 wildcard diterima nilai data.

Nama kunci Jenis nilai data Menerima karakter pengganti?
LogName <String[]> Ya
ProviderName <String[]> Ya
Jalur <String[]> Tidak.
Kata kunci <Long[]> Tidak.
Identifikasi <Int32[]> Tidak.
Tingkat <Int32[]> Tidak.
Waktu Mulai <DateTime> Tidak.
Waktu Selesai <DateTime> Tidak.
UserID <SID> Tidak.
Data Informasi <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'}

Nota

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 Penampil Peristiwa Windows. Misalnya, .NET Runtime dalam cuplikan layar berikut:

Gambar sumber Windows Event Viewer

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

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

Nota

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. Penampil Peristiwa Windows 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 Penampil 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 Event Viewer

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
Kegagalan Audit 4503599627370496
Keberhasilan Audit 9007199254740992
PetunjukKorelasi2 18014398509481984
EventLogClassic 36028797018963968
Sqm 2251799813685248
WdiDiagnostic 1125899906842624
WdiContext 562949953421312
ResponseTime 281474976710656
Tidak ada 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 ke 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. Penampil Peristiwa Windows 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 . Penampil Peristiwa Windows 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 nama properti StandardEventLevel.

[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
Verbositas 5
Bersifat Informatif 4
Peringatan 3
Kesalahan 2
Penting 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 statik "Level" 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 ke 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__
}