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

บันทึกเหตุการณ์ที่ดีขึ้นด้วย PowerShell


เนื่องจากฉันไม่ได้ทำงานในสภาพแวดล้อมขององค์กร ฉันจึงไม่เห็นโอกาสที่ PowerShell จะทำให้ชีวิตของคุณดีขึ้นเสมอไปในฐานะผู้เชี่ยวชาญด้านไอที ฉันมีเพื่อน เรียกเธอว่า Gladys Kravitz ดีกว่า เกลดีส์กับฉันกำลังคุยกัน และเธอบอกว่าการดึงข้อมูลออกจากบันทึกเหตุการณ์ของ Windows นั้นยุ่งยากเพียงใด ถ้าฉันจำได้ เธอดูเหตุการณ์ 4,625 เหตุการณ์ในบันทึกความปลอดภัยซึ่งแสดงถึงการพยายามเข้าสู่ระบบที่ล้มเหลว นี่คือตัวอย่าง:

การอ่านข้อความเป็นที่ชัดเจนว่าผู้ใช้ Aprils ในโดเมนบริษัทพยายามเข้าสู่ระบบ Win10 แต่คุณจะได้รับข้อมูลนั้นจากบันทึกเหตุการณ์บนเครื่อง 100 เครื่องได้อย่างไร คุณสามารถใช้วูดูนิพจน์ทั่วไปเพื่อดึงข้อมูลได้ ค่านี้เป็นส่วนหนึ่งของบันทึกบันทึกเหตุการณ์จริงๆ คุณอาจเห็น ReplacementStrings เมื่อใช้ Get-Eventlog เมื่อใช้ Get-WinEvent ค่าเหล่านี้จะถูกจัดเก็บเป็นคุณสมบัติ

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

XML เพื่อช่วยเหลือ

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

 $r = get-winevent -FilterHashtable @{Logname="Security";ID=4625} -MaxEvents 1 -ComputerName Win10 [xml]$evt = $r.ToXml() 

เอกสารนี้มีคุณสมบัติที่เปิดเผยข้อมูลที่ใช้ในการสร้างบันทึกบันทึกเหตุการณ์

โหนดข้อมูลดูมีแนวโน้มดี

นั่นเกือบจะดูเหมือนวัตถุ! ฉันจะทำอันหนึ่ง

$evt.Event.EventData.Data | foreach-object -Begin {$h = @{}} -Process {
 $h.add($_.name,$_.'#text')
} -end { $obj = New-Object -TypeName PSObject -Property $h }

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

แปลง-EventLogRecord

ฉันเขียนฟังก์ชันชื่อ Convert-EventLogRecord ซึ่งเป็นส่วนหนึ่งของโมดูล PSScriptTools รุ่นล่าสุดของฉัน ฟังก์ชันนี้ออกแบบมาเพื่อแปลงรายการบันทึกเหตุการณ์ให้เป็นออบเจ็กต์ที่กำหนดเอง ฟังก์ชันนี้สร้างออบเจ็กต์แบบกำหนดเองด้วยคุณสมบัติข้อมูลที่ฉันแสดง แต่ยังมีข้อมูลอื่นๆ เช่น รหัสเหตุการณ์ ชื่อบันทึก และชื่อคอมพิวเตอร์

ตอนนี้ Gladys มีเครื่องมือ PowerShell เพื่อรับข้อมูลที่เธอต้องการในรูปแบบที่เธอต้องการ

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

แต่เมื่อฉันรู้ว่าฉันสามารถเขียนสคริปต์ควบคุมหรือเครื่องมืออื่นๆ ได้

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

Get-WinEvent -FilterHashtable @{Logname ='system';ID =7040} -MaxEvent 50 |
Convert-EventlogRecord | 
Sort-Object -Property Param4,TimeCreated -Descending |
Format-Table -GroupBy @{Name="Service";Expression={$_.param4}} -Property TimeCreated,
@{Name="OriginalState";Expression = {$_.param2}},
@{Name="NewState";Expression={$_.param3}},Computername

ผลลัพธ์จะแสดงให้คุณทราบเมื่อบริการเปลี่ยนสถานะ

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

ฉันให้รหัสกับ Gladys เพื่อทดลองใช้ แต่ตอนนี้คุณสามารถรับมันได้เช่นกันในโมดูล PSScriptTools โดยเริ่มตั้งแต่เวอร์ชัน 2.13 ฉันหวังว่าคุณจะลองดูและแจ้งให้เราทราบว่าคุณคิดอย่างไร

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