ค้นหาเว็บไซต์

การสร้างแบบสอบถาม 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__
}

บทความที่เกี่ยวข้อง