การสร้างแบบสอบถาม Get-WinEvent ด้วย FilterHashtable
ตัวอย่างนี้ใช้กับแพลตฟอร์ม Windows เท่านั้น
หากต้องการอ่านโพสต์บล็อก Scripting Guy ต้นฉบับเมื่อวันที่ 3 มิถุนายน 2014 โปรดดูใช้ FilterHashTable เพื่อกรองบันทึกเหตุการณ์ด้วย PowerShell
บทความนี้ตัดตอนมาจากโพสต์บนบล็อกต้นฉบับ และอธิบายวิธีใช้พารามิเตอร์ FilterHashtable ของ Get-WinEvent cmdlet เพื่อกรองบันทึกเหตุการณ์ Get-WinEvent cmdlet ของ PowerShell เป็นวิธีที่มีประสิทธิภาพในการกรองเหตุการณ์ Windows และบันทึกการวินิจฉัย ประสิทธิภาพจะดีขึ้นเมื่อแบบสอบถาม Get-WinEvent ใช้พารามิเตอร์ FilterHashtable
เมื่อคุณทำงานกับบันทึกเหตุการณ์ขนาดใหญ่ การส่งออบเจ็กต์ไปตามไปป์ไลน์ไปยังคำสั่ง Where-Object จะไม่มีประสิทธิภาพ ก่อน PowerShell 6 นั้น Get-EventLog cmdlet เป็นอีกตัวเลือกหนึ่งในการรับข้อมูลบันทึก ตัวอย่างเช่น คำสั่งต่อไปนี้ไม่มีประสิทธิภาพในการกรองบันทึก Microsoft-Windows-Defrag:
Get-EventLog -LogName Application | Where-Object Source -Match defrag
Get-WinEvent -LogName Application | Where-Object { $_.ProviderName -Match 'defrag' }
คำสั่งต่อไปนี้ใช้ตารางแฮชที่ปรับปรุงประสิทธิภาพ:
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='*defrag'
}
โพสต์ในบล็อกเกี่ยวกับการแจงนับ
บทความนี้นำเสนอข้อมูลเกี่ยวกับวิธีการใช้ค่าที่ระบุในตารางแฮช สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการแจงนับ โปรดอ่านบล็อกโพสต์ของ Scripting Guy เหล่านี้ หากต้องการสร้างฟังก์ชันที่ส่งกลับค่าที่แจกแจง โปรดดูที่ การแจงนับและค่า สำหรับข้อมูลเพิ่มเติม โปรดดูบล็อกโพสต์ชุด Scripting Guy เกี่ยวกับการแจงนับ
คู่คีย์-ค่าของตารางแฮช
หากต้องการสร้างการสืบค้นที่มีประสิทธิภาพ ให้ใช้ Get-WinEvent cmdlet พร้อมด้วยพารามิเตอร์ FilterHashtable FilterHashtable ยอมรับตารางแฮชเป็นตัวกรองเพื่อรับข้อมูลเฉพาะจากบันทึกเหตุการณ์ของ Windows ตารางแฮชใช้คู่ คีย์-ค่า สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตารางแฮช โปรดดูที่ about_Hash_Tables
หากคู่ คีย์-ค่า อยู่ในบรรทัดเดียวกัน จะต้องคั่นด้วยเครื่องหมายอัฒภาค หากคู่ คีย์-ค่า แต่ละคู่อยู่ในบรรทัดแยกกัน ก็ไม่จำเป็นต้องใช้เครื่องหมายอัฒภาค ตัวอย่างเช่น บทความนี้จะวางคู่ คีย์-ค่า ไว้ในบรรทัดแยกกัน และไม่ใช้เครื่องหมายอัฒภาค
ตัวอย่างนี้ใช้คู่ คีย์-ค่า ของพารามิเตอร์ FilterHashtable หลายคู่ ข้อความค้นหาที่เสร็จสมบูรณ์ประกอบด้วย LogName, ProviderName, คำหลัก, ID และ ระดับ
คู่ คีย์-ค่า ที่ยอมรับจะแสดงอยู่ในตารางต่อไปนี้ และรวมอยู่ในเอกสารประกอบสำหรับพารามิเตอร์ Get-WinEvent FilterHashtable
ตารางต่อไปนี้จะแสดงชื่อคีย์ ชนิดข้อมูล และอนุญาตให้ใช้อักขระตัวแทนสำหรับค่าข้อมูลหรือไม่
| Key name | Value data type | Accepts wildcard characters? |
|---|---|---|
| LogName | <String[]> |
Yes |
| ProviderName | <String[]> |
Yes |
| Path | <String[]> |
No |
| Keywords | <Long[]> |
No |
| ID | <Int32[]> |
No |
| Level | <Int32[]> |
No |
| StartTime | <DateTime> |
No |
| EndTime | <DateTime> |
No |
| UserID | <SID> |
No |
| Data | <String[]> |
No |
<named-data> |
<String[]> |
No |
คีย์ <named-data> แสดงถึงฟิลด์ข้อมูลเหตุการณ์ที่มีชื่อ ตัวอย่างเช่น เหตุการณ์ Perflib 1008 สามารถมีข้อมูลเหตุการณ์ต่อไปนี้:
<EventData>
<Data Name="Service">BITS</Data>
<Data Name="Library">C:\Windows\System32\bitsperf.dll</Data>
<Data Name="Win32Error">2</Data>
</EventData>
คุณสามารถสอบถามเหตุการณ์เหล่านี้ได้โดยใช้คำสั่งต่อไปนี้:
Get-WinEvent -FilterHashtable @{LogName='Application'; 'Service'='Bits'}
บันทึก
เพิ่มความสามารถในการสืบค้น <named-data> ใน PowerShell 6
การสร้างแบบสอบถามด้วยตารางแฮช
ในการตรวจสอบผลลัพธ์และแก้ไขปัญหา จะช่วยสร้างตารางแฮชคู่ คีย์-ค่า ครั้งละหนึ่งคู่ ข้อความค้นหาได้รับข้อมูลจากบันทึก แอปพลิเคชัน ตารางแฮชเทียบเท่ากับ Get-WinEvent -LogName Application
ในการเริ่มต้น ให้สร้างแบบสอบถาม Get-WinEvent ใช้คู่ คีย์-ค่า ของพารามิเตอร์ FilterHashtable กับคีย์ LogName และค่า Application
Get-WinEvent -FilterHashtable @{
LogName='Application'
}
สร้างตารางแฮชต่อไปด้วยคีย์ ProviderName โดยปกติ ProviderName จะเป็นชื่อที่ปรากฏในฟิลด์ แหล่งที่มา ใน Windows Event Viewer ตัวอย่างเช่น .NET Runtime ในภาพหน้าจอต่อไปนี้:
รูปภาพของแหล่งที่มาของ Windows Event Viewer
อัปเดตตารางแฮชและรวมคู่ คีย์-ค่า กับคีย์ ชื่อผู้ให้บริการ และค่า .NET Runtime
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
}
บันทึก
สำหรับผู้ให้บริการกิจกรรมบางราย สามารถรับ ชื่อผู้ให้บริการ ที่ถูกต้องได้โดยดูที่แท็บ รายละเอียด ใน คุณสมบัติของกิจกรรม ตัวอย่างเช่น เหตุการณ์ที่ช่อง แหล่งที่มา แสดง Defrag ProviderName ที่ถูกต้องคือ Microsoft-Windows-Defrag
หากการค้นหาของคุณต้องการข้อมูลจากบันทึกเหตุการณ์ที่เก็บไว้ ให้ใช้คีย์ เส้นทาง ค่า เส้นทาง ระบุเส้นทางแบบเต็มไปยังไฟล์บันทึก สำหรับข้อมูลเพิ่มเติม โปรดดูบล็อกโพสต์ของ Scripting Guy ใช้ PowerShell เพื่อแยกวิเคราะห์บันทึกเหตุการณ์ที่บันทึกไว้เพื่อหาข้อผิดพลาด
การใช้ค่าที่แจงนับในตารางแฮช
คำหลัก คือคีย์ถัดไปในตารางแฮช ประเภทข้อมูล คำหลัก คืออาร์เรย์ของประเภทค่า [long] ที่เก็บตัวเลขจำนวนมาก ใช้คำสั่งต่อไปนี้เพื่อค้นหาค่าสูงสุดของ [long]:
[long]::MaxValue
9223372036854775807
สำหรับคีย์ คำหลัก PowerShell จะใช้ตัวเลข ไม่ใช่สตริง เช่น ความปลอดภัย Windows Event Viewer จะแสดง คำหลัก เป็นสตริง แต่เป็นค่าที่แจกแจง ในตารางแฮช หากคุณใช้คีย์ คำหลัก ที่มีค่าสตริง ข้อความแสดงข้อผิดพลาดจะปรากฏขึ้น
เปิด Windows Event Viewer และจากบานหน้าต่าง การดำเนินการ คลิก กรองบันทึกปัจจุบัน เมนูแบบเลื่อนลง คำหลัก จะแสดงคำหลักที่มีอยู่ ดังที่แสดงในภาพหน้าจอต่อไปนี้:
รูปภาพของคำสำคัญ Windows Event Viewer
ใช้คำสั่งต่อไปนี้เพื่อแสดงชื่อคุณสมบัติ 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…
ค่าที่แจกแจงได้รับการบันทึกไว้ใน .NET Framework สำหรับข้อมูลเพิ่มเติม โปรดดู การแจงนับ StandardEventKeywords
ชื่อ คำหลัก และค่าที่แจงนับมีดังนี้:
- AuditFailure
4503599627370496
- AuditSuccess
9007199254740992
- CorrelationHint2
18014398509481984
- EventLogClassic
36028797018963968
- Sqm
2251799813685248
- WdiDiagnostic
1125899906842624
- WdiContext
562949953421312
- ResponseTime
281474976710656
- None
0
อัปเดตตารางแฮชและรวมคู่ คีย์-ค่า กับคีย์ คีย์เวิร์ด และค่าการแจงนับ EventLogClassic 36028797018963968 แข็งแกร่ง>.
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
}
มูลค่าทรัพย์สินคงที่ของคำหลัก (ไม่บังคับ)
มีการแจกแจงคีย์ คำหลัก แต่คุณสามารถใช้ชื่อคุณสมบัติคงที่ในการสืบค้นตารางแฮชได้ แทนที่จะใช้สตริงที่ส่งคืน ชื่อคุณสมบัติจะต้องถูกแปลงเป็นค่าด้วยคุณสมบัติ Value__
ตัวอย่างเช่น สคริปต์ต่อไปนี้ใช้คุณสมบัติ Value__
$C = [System.Diagnostics.Eventing.Reader.StandardEventKeywords]::EventLogClassic
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=$C.Value__
}
การกรองตามรหัสเหตุการณ์
เพื่อให้ได้ข้อมูลที่เฉพาะเจาะจงมากขึ้น ผลลัพธ์ของข้อความค้นหาจะถูกกรองด้วย รหัสเหตุการณ์ รหัสเหตุการณ์ มีการอ้างอิงในตารางแฮชเป็นคีย์ ID และค่านี้เป็น รหัสเหตุการณ์ เฉพาะเจาะจง ตัวแสดงเหตุการณ์ของ Windows จะแสดง รหัสเหตุการณ์ ตัวอย่างนี้ใช้ Event Id 1023
อัปเดตตารางแฮชและรวมคู่ คีย์-ค่า พร้อมด้วยคีย์ ID และค่า 1023
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
ID=1023
}
การกรองตามระดับ
หากต้องการปรับแต่งผลลัพธ์เพิ่มเติมและรวมเฉพาะเหตุการณ์ที่เป็นข้อผิดพลาด ให้ใช้ปุ่ม ระดับ Windows Event Viewer จะแสดง ระดับ เป็นค่าสตริง แต่เป็นค่าที่แจกแจง ในตารางแฮช หากคุณใช้คีย์ ระดับ ที่มีค่าสตริง ข้อความแสดงข้อผิดพลาดจะปรากฏขึ้น
ระดับ มีค่าต่างๆ เช่น ข้อผิดพลาด, คำเตือน หรือ ข้อมูล ใช้คำสั่งต่อไปนี้เพื่อแสดงชื่อคุณสมบัติ 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;}
ค่าที่แจกแจงได้รับการบันทึกไว้ใน .NET Framework สำหรับข้อมูลเพิ่มเติม โปรดดูการแจงนับ StandardEventLevel
ชื่อของคีย์ ระดับ และค่าที่แจงนับมีดังนี้:
- Verbose
5
- Informational
4
- Warning
3
- Error
2
- Critical
1
- LogAlways
0
ตารางแฮชสำหรับการสืบค้นที่เสร็จสมบูรณ์ประกอบด้วยคีย์ ระดับ และค่า 2
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
ID=1023
Level=2
}
ระดับคุณสมบัติคงที่ในการแจงนับ (ไม่บังคับ)
มีการแจกแจงคีย์ ระดับ แต่คุณสามารถใช้ชื่อคุณสมบัติคงที่ในการสืบค้นตารางแฮชได้ แทนที่จะใช้สตริงที่ส่งคืน ชื่อคุณสมบัติจะต้องถูกแปลงเป็นค่าด้วยคุณสมบัติ Value__
ตัวอย่างเช่น สคริปต์ต่อไปนี้ใช้คุณสมบัติ Value__
$C = [System.Diagnostics.Eventing.Reader.StandardEventLevel]::Informational
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
ID=1023
Level=$C.Value__
}