คู่มือฉบับสมบูรณ์เกี่ยวกับการใช้ 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 เป็นส่วนเสริมที่สำคัญสำหรับชุดเครื่องมือของผู้ดูแลระบบ!





















