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

คู่มือฉบับสมบูรณ์เกี่ยวกับการใช้ Get-WinEvent PowerShell Cmdlet


Windows มีบันทึกเหตุการณ์ต่างๆ มากมาย แต่คุณจะเรียกคืนข้อมูลเหล่านี้ได้อย่างรวดเร็วได้อย่างไร Get-WinEvent cmdlet สามารถดึงบันทึกเหตุการณ์ Windows แบบคลาสสิก เช่น บันทึกของระบบและแอปพลิเคชัน บันทึกที่สร้างโดยเทคโนโลยี Windows Event Log และแม้แต่บันทึกการติดตามเหตุการณ์สำหรับ Windows (ETW)!

ในบทความนี้ เรียนรู้วิธีใช้ประโยชน์จาก Get-WinEvent เพื่อดึงข้อมูลและกรองเหตุการณ์จากบันทึกเหตุการณ์!

ข้อกำหนดเบื้องต้น

หากต้องการดำเนินการต่อ คุณจะต้องมี Windows 10 และ PowerShell 5.1 เวอร์ชันปัจจุบันและสูงกว่าเท่านั้น บทความนี้ใช้ Windows 10 และ PowerShell 7.1

แสดงรายการบันทึกที่มีอยู่ด้วย Get-WinEvent

เป็นการยากที่จะทราบว่าคุณอาจต้องการรายการบันทึกใดโดยไม่ทราบบันทึกที่มีอยู่ทั้งหมด ด้วย Get-WinEvent คุณสามารถแสดงรายการบันทึกที่มีอยู่ทั้งหมดได้อย่างรวดเร็วโดยใช้พารามิเตอร์ -ListLog ค่าพารามิเตอร์ * บอกให้ Get-WinEvent แสดงรายการบันทึกทั้งหมดโดยไม่มีการกรอง ดังที่แสดงด้านล่าง บันทึกทั้งหมดจะถูกดึงออกมา แต่จะแสดงเพียงชุดคุณสมบัติที่จำกัดเท่านั้นโดยใช้ Select-Object cmdlet

Get-WinEvent -ListLog * | Select-Object LogName, RecordCount, IsClassicLog, IsEnabled, LogMode, LogType | Format-Table -AutoSize

บันทึกบางรายการไม่ได้เปิดใช้งานตามค่าเริ่มต้น คุณอาจต้องเปิด Event Viewer ค้นหาบันทึก และคลิกขวาเพื่อเปิดใช้งานบันทึกก่อนที่เหตุการณ์จะแสดง

บันทึกทั้งหมดหลัง Windows Vista จะบันทึกเป็นไฟล์ *.evtx แทนที่จะเป็นรูปแบบ *.evt ที่เก่ากว่า คุณสมบัติ IsClassicLog ระบุว่าเหตุการณ์บันทึกถูกกำหนดไว้ในไฟล์ข้อความ *.mc รูปแบบหรือในรายการ *.xml รูปแบบ

คุณสมบัติที่น่าสนใจคือ LogMode ซึ่งคุณอาจสังเกตเห็นว่ามักจะตั้งค่าเป็น Circular

  • Circular - เขียนทับรายการบันทึกที่เก่าที่สุดเมื่อเต็มแล้ว
  • Retain - เก็บกิจกรรมทั้งหมดไว้จนกว่าบันทึกจะเต็มและหยุดการบันทึกจนกว่าจะเป็นอิสระ
  • การสำรองข้อมูลอัตโนมัติ - สำรองข้อมูลและเก็บถาวรบันทึกเหตุการณ์โดยอัตโนมัติเมื่อเต็ม

สุดท้ายนี้ เมื่อดูคุณสมบัติ LogType แล้ว มีบันทึกหลายประเภท คุณสมบัตินี้ทำหน้าที่เป็นคุณสมบัติการจัดหมวดหมู่มากกว่า แต่โดยทั่วไปแล้วจะแจ้งวิธีใช้บันทึกและประเภทของเหตุการณ์ที่แสดง

  • ผู้ดูแลระบบ - มีไว้สำหรับผู้ใช้ปลายทางและผู้ใช้ที่เป็นผู้ดูแลระบบเป็นหลัก
  • เชิงวิเคราะห์ - โดยทั่วไปแล้ว บันทึกปริมาณมาก มีวัตถุประสงค์เพื่ออธิบายการทำงานของโปรแกรม
  • แก้ไขจุดบกพร่อง - มีไว้สำหรับนักพัฒนาที่ต้องการเจาะลึกเกี่ยวกับระบบภายในของโปรแกรม
  • การปฏิบัติงาน - เหตุการณ์ที่เกิดขึ้นระหว่างการดำเนินการและมีประโยชน์ในการวินิจฉัยเหตุการณ์ที่เกิดขึ้นและทริกเกอร์กระบวนการ

รายชื่อผู้ให้บริการบันทึกเหตุการณ์

ตอนนี้เมื่อคุณมีความเข้าใจที่ชัดเจนเกี่ยวกับบันทึกต่างๆ และคุณสมบัติของบันทึกต่างๆ แล้ว จะช่วยให้เข้าใจว่าผู้ให้บริการบันทึกเหตุการณ์คืออะไร ในคำศัพท์เฉพาะของบันทึกเหตุการณ์ ผู้ให้บริการคือแหล่งที่มาของเหตุการณ์

ผู้ให้บริการบันทึกเหตุการณ์จะไม่ซ้ำกันและเชื่อมโยงกับแต่ละบันทึก เช่น บันทึกแอปพลิเคชันหรือระบบ และจะทำหน้าที่เป็นแหล่งที่มาที่มีชื่อซึ่งเป็นแหล่งกำเนิดของเหตุการณ์

บางทีคุณอาจต้องการค้นหาปัญหาเมื่อกรองบันทึก และคุณอาจสนใจเฉพาะปัญหาของผู้ให้บริการรายใดรายหนึ่งเท่านั้น หากต้องการแสดงรายการผู้ให้บริการที่พร้อมใช้งาน ให้ใช้พารามิเตอร์ -ListProvider ดังที่แสดงด้านล่าง * แสดงรายการผู้ให้บริการทั้งหมดที่พร้อมใช้งานและบันทึกที่ผู้ให้บริการเชื่อมโยงกับ เช่น Windows PowerShell หรือระบบ

Get-WinEvent -ListProvider * | Format-Table -Autosize

บางทีคุณอาจต้องการเพียงแสดงรายชื่อผู้ให้บริการที่พร้อมใช้งานสำหรับบันทึกเฉพาะ เช่น ระบบ ในการดำเนินการดังกล่าว คุณสามารถกรองเหตุการณ์ได้โดยใช้คำสั่ง Where-Object โดยใช้ค่าของคุณสมบัติ LogLinks คุณสมบัติ LogLinks แสดงบันทึกเหตุการณ์ที่เชื่อมโยงเป็นรายการ

หากต้องการกรองบันทึกที่ร้องขอด้วย Where-Object ให้ใช้ตัวดำเนินการเปรียบเทียบ -In เพื่อกรองเฉพาะเหตุการณ์เหล่านั้นด้วย System ใน LogLinks ค่าคุณสมบัติ สุดท้ายนี้ การใช้ Format-Table -AutoSize จะทำให้การอ่านผลลัพธ์ง่ายขึ้น ดังที่แสดงด้านล่าง

Get-WinEvent -ListProvider * | Where-Object { 'System' -In ($_ | Select-Object -ExpandProperty Loglinks | Select-Object -ExpandProperty Logname) } | Format-Table -AutoSize

การดึงบันทึกเหตุการณ์แบบคลาสสิกด้วย Get-WinEvent

ขั้นตอนแรกในการแก้ไขปัญหา Windows คือการดึงข้อมูลบันทึกของแอปพลิเคชันหรือระบบ ซึ่งเป็นบันทึกเหตุการณ์แบบคลาสสิก ในตัวอย่างที่แสดงด้านล่าง คุณจะดึงข้อมูลเหตุการณ์ 100 แรกโดยใช้พารามิเตอร์ -MaxEvents ของบันทึกเหตุการณ์ของแอปพลิเคชัน

เพื่อให้การอ่านผลลัพธ์ง่ายขึ้น ให้เลือกเฉพาะคุณสมบัติที่จำเป็นในการอ่านรายการได้ง่ายขึ้น มิฉะนั้น รายการจะถูกจัดกลุ่มตามชื่อผู้ให้บริการ ซึ่งทำให้การแยกวิเคราะห์รายการผลลัพธ์ทำได้ยาก

Get-WinEvent -LogName 'Application' -MaxEvents 100 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize

ค้นหาเหตุการณ์ Windows สมัยใหม่ด้วย Get-WinEvent

เมื่อคุณดึงข้อมูลเหตุการณ์จากบันทึกแอปพลิเคชันแบบคลาสสิกแล้ว ผลลัพธ์จากบันทึกเหตุการณ์ Windows รุ่นใหม่ เช่น Microsoft-Windows-WindowsUpdateClient/Operational เป็นอย่างไร

ต่างจากบันทึกเหตุการณ์แบบคลาสสิก เช่น System Microsoft-Windows-WindowsUpdateClient/Operational เป็นบันทึกสมัยใหม่ โดยมี Get-WinEvent ทำงาน เช่นเดียวกับด้านล่าง

Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize

แล้วการรับเฉพาะกิจกรรมที่เก่าแก่ที่สุดล่ะ? แม้ว่าคุณจะสามารถกลับลำดับผลลัพธ์ด้วย Sort-Object ได้ ให้ใช้พารามิเตอร์ -Oldest เพื่อดึงข้อมูลเหตุการณ์ 10 แรก ดังที่แสดงด้านล่าง

คำสั่ง Get-WinEvent ทำการกรองให้คุณ แทนที่จะส่งคืนผลลัพธ์และการเรียงลำดับทั้งหมด ซึ่งโดยทั่วไปจะช้ากว่า

Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' -Oldest -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize

การดึงไฟล์การติดตามเหตุการณ์สำหรับ Windows (ETW) ด้วย Get-WinEvent

บางทีคุณอาจมีไฟล์ *.evtx ที่ส่งออกจากคอมพิวเตอร์เครื่องอื่นหรือสำรองบันทึกที่มีอยู่ คุณสามารถอ่านบันทึกเหล่านั้นได้ด้วย Get-WinEvent cmdlet หากคุณต้องการเก็บบันทึกเพื่อวัตถุประสงค์ในการตรวจสอบ Get-WinEvent เป็นวิธีที่ยอดเยี่ยมในการสืบค้นบันทึกเหล่านั้นด้วย cmdlets มาตรฐานภายในสคริปต์อย่างรวดเร็ว

หากต้องการสาธิตการดึงรายการบันทึกจากไฟล์ *.evtx คุณต้องมีไฟล์บันทึกที่ส่งออก

1. เปิด Event Viewer และไปที่บันทึก ในตัวอย่างนี้ บันทึก บันทึกแอปพลิเคชันและบริการ → Windows PowerShell

2. จากนั้น คลิกรายการเมนู บันทึกกิจกรรมทั้งหมดเป็น... ในบานหน้าต่าง การทำงาน

3. บันทึกไฟล์ลงในตำแหน่งดิสก์ที่จะดึงข้อมูลโดยคำสั่ง Get-WinEvent

ตอนนี้คุณได้ส่งออกไฟล์บันทึกแล้ว ให้ส่งตำแหน่งไฟล์บันทึกผ่านพารามิเตอร์ -Path เพื่ออ่านเหตุการณ์ ในตัวอย่างที่แสดงด้านล่าง บันทึก Windows PowerShell จะถูกส่งออกเพื่อใช้ในภายหลัง

Get-WinEvent -Path 'C:\Articles\WindowsPowerShell.evtx' -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize

การกรองบันทึกเหตุการณ์ Windows โดยใช้ Get-WinEvent

แม้ว่าคุณจะสามารถกรองบันทึกด้วย Where-Object cmdlet มาตรฐานได้ แต่ Get-WinEvent มีตัวกรองในตัว ด้วยการส่งคืนผลลัพธ์ทั้งหมดแล้วกรอง จะทำให้งานเสร็จเกินความจำเป็น คุณควรพยายามกรองแหล่งที่มาให้มากที่สุดแทน

Get-WinEvent cmdlet มีพารามิเตอร์สามตัวเพื่อช่วยคุณกรองเหตุการณ์นับพันที่เรียกว่า -FilterHashTable, -FilterXPath และ -FilterXML . โดยทั่วไปแต่ละพารามิเตอร์จะทำงานเดียวกันในลักษณะที่แตกต่างกัน

การกรองบันทึกเหตุการณ์ด้วย FilterHashTable

พารามิเตอร์ -FilterHashTable จะกรองเนื้อหาตามคุณสมบัติที่ตรงกัน เช่น LogName แทนที่จะใช้พารามิเตอร์ -LogName เพื่อกรองตามบันทึกเฉพาะ คุณสามารถใช้ตารางแฮชแทน เช่น @{'LogName'='Application'} ซึ่ง จะสอดคล้องกับคุณสมบัติเหตุการณ์ LogName

ตัวอย่างที่แสดงด้านล่างแสดงตารางแฮชให้กับพารามิเตอร์ -FilterHashTable ที่จะค้นหาเฉพาะบันทึกของแอปพลิเคชันและมีเวลาเริ่มต้นที่เป็นเหตุการณ์ทั้งหมดหลังเที่ยงคืนของวันปัจจุบัน Get-WinEvent ส่งคืนผลลัพธ์อย่างรวดเร็ว

Get-WinEvent -FilterHashTable @{'LogName' = 'Application'; 'StartTime' = (Get-Date -Hour 0 -Minute 0 -Second 0)} | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize

เปรียบเทียบความเร็วในการกรองของคำสั่งเดียวกันด้านบนกับความเร็วที่กรองจากผ่าน Where-Object แทนผ่านพารามิเตอร์ -FilterHashTable บนไปป์ไลน์ อย่างที่คุณเห็น คำสั่งที่ใช้ Where-Object จะช้ากว่าคำสั่งที่ใช้พารามิเตอร์ -FilterHashTable มาก

การกรองบันทึกเหตุการณ์โดยใช้พารามิเตอร์ FilterXPath

รายการบันทึกเหตุการณ์จะถูกจัดเก็บเป็นไฟล์ XML ดังนั้นคุณสามารถใช้ภาษา XPath ซึ่งเป็นภาษาการสืบค้น XML เพื่อกรองรายการบันทึก การดำเนินการคำสั่งเดียวกันกับที่ใช้ด้านบนและแปลเป็น XPath คุณจะได้ผลลัพธ์เดียวกัน

หากต้องการสร้างแบบสอบถาม XPath ให้ใช้ความสามารถในการกรองใน Windows Event Viewer ดังที่แสดงด้านล่าง

1. เปิด Event Viewer และไปที่บันทึก เช่น บันทึก Windows Logs → Application

2. ถัดไป คลิกลิงก์กรองบันทึกปัจจุบันในบานหน้าต่างด้านขวา

3. ป้อนพารามิเตอร์ที่คุณต้องการใช้เพื่อกรองบันทึก

4. คลิกแท็บ XML และคัดลอกส่วนที่อยู่ภายในแท็ก Select

5. ตอนนี้ คัดลอกและวางเนื้อหาที่คัดลอกด้วยพารามิเตอร์ -FilterXPath ขณะนี้ คุณสามารถดูด้านล่างได้ว่าการใช้ไวยากรณ์ XPath ที่พบจากโปรแกรมดูบันทึกเหตุการณ์ คุณสามารถสร้างแบบสอบถามเพื่อกรองเฉพาะข้อมูลที่จำเป็นได้

Get-WinEvent -LogName 'Application' -FilterXPath "*[System[(Level=1  or Level=3)]]" | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize

การเจาะลึกถึงวิธีการสร้างแบบสอบถาม XPath นั้นอยู่นอกขอบเขตสำหรับบทความนี้ แต่รูปแบบพื้นฐานแสดงอยู่ด้านล่าง เมื่อพารามิเตอร์ FilterXPath กรองวันที่ คุณจะเห็นข้อแตกต่างที่สำคัญอย่างหนึ่ง นั่นคือ คุณต้องใช้รูปแบบวันที่ที่เฉพาะเจาะจงมากขึ้น yyyy-MM-ddTHH:mm:ss.fffZ ว่าจะต้องส่งคืนวันที่ใน UTC ซึ่งสังเกตได้จากสวิตช์ -AsUTC

Get-WinEvent -LogName 'Application' -FilterXPath "*[System[TimeCreated[@SystemTime >= '$(Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0 -Format "yyyy-MM-ddTHH:mm:ss.fffZ" -AsUTC)']]]" | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize

การกรองผลลัพธ์บันทึกเหตุการณ์ด้วย FilterXML

สุดท้าย พารามิเตอร์การกรองสุดท้ายที่ใช้ได้คือพารามิเตอร์ -FilterXML ไม่เหมือนกับพารามิเตอร์ -FilterXPath และ -FilterHashTable พารามิเตอร์นี้รับ XML ที่ใช้ในการกรองเหตุการณ์ พารามิเตอร์ -FilterXML อนุญาตให้ใช้กฎที่ซับซ้อนมากขึ้น และดังที่แสดงด้านล่าง สามารถจำลองตัวอย่างการกรองก่อนหน้านี้ได้

ดังที่แสดงในตัวอย่างก่อนหน้านี้ คุณอาจดึงข้อมูลแบบสอบถามที่จัดรูปแบบไว้ล่วงหน้าได้จากความสามารถ Event Viewer → Filter Current Log แทนที่จะเลือกเฉพาะเนื้อหาในโหนด Select คุณจะใช้แบบสอบถามทั้งหมด ไม่มีการเลือกตัวกรองจริง ตามที่ระบุโดย * ในโหนด Select นี่จะเป็นการระบุมาร์กอัปทั่วไปสำหรับตัวอย่างถัดไป

แทนที่จะสร้างคำสั่งบรรทัดเดียว ขั้นแรก ให้แยกแบบสอบถาม XML และกำหนดมาร์กอัปให้กับตัวแปร $Query ในตัวอย่างด้านล่าง การกำหนดแบบสอบถามให้กับตัวแปรทำให้ใช้งานและอ่านได้ง่ายขึ้น จากนั้น ส่งตัวแปร $Query ไปยังพารามิเตอร์ -FilterXML ของ Get-WinEvent

ดังที่แสดงด้านล่าง คุณจะเห็นผลลัพธ์ของการสืบค้นที่ซับซ้อนมากขึ้นซึ่งส่งคืนเหตุการณ์ทั้งหมดจากวันนั้นและจัดเก็บไว้ในบันทึก Application

$Query = "<QueryList>
  <Query Id='0' Path='Application'>
    <Select Path='Application'>*[System[TimeCreated[@SystemTime >= '$(Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0 -Format "yyyy-MM-ddTHH:mm:ss.fffZ" -AsUTC)']]]</Select>
  </Query>
</QueryList>"

Get-WinEvent -FilterXML $Query | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize

บทสรุป

Get-WinEvent cmdlet ช่วยให้การสืบค้นแหล่งที่มาของบันทึกเหตุการณ์หลายแหล่งทำงานได้อย่างรวดเร็วด้วยความสามารถในการกรองอันทรงพลัง ตั้งแต่การตรวจสอบไปจนถึงการแก้ปัญหา Get-WinEvent cmdlet เป็นส่วนเสริมที่สำคัญสำหรับชุดเครื่องมือของผู้ดูแลระบบ!

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