如何转换事件查看器数据为XML并解决节点错误与过滤问题
问题:PowerShell处理安全日志5152事件时的XML转换错误与过滤失效
背景与初始代码
此前参考Stack Overflow的方法处理Windows安全日志,初始代码仅获取单条日志并解析XML:
$a = Get-WinEvent @{ LogName='Security' } -maxevents 1 $xml = [xml]$a.toxml() $xml.event.eventdata.data
需求与首次修改后的错误
需要获取所有ID为5152的安全日志,并过滤掉FilterOrigin值为"Stealth"的事件,于是修改代码如下:
$a = Get-WinEvent @{ LogName='Security'; Id=5152; } $xml = [xml]$a.toxml() $xml.event.eventdata.data | Where-Object {$_.FilterOrigin -ne "Stealth"}
执行后出现两个问题:
- 无法过滤掉
FilterOrigin为"Stealth"的事件 - 抛出XML转换错误:
InvalidArgument: untitled:Untitled-3:3:1 Line | 3 | $xml = [xml]$a.toxml() | ~~~~~~~~~~~~~~~~~~~~~~ | Cannot convert value "System.Object[]" to type "System.Xml.XmlDocument". Error: "This document already has a 'DocumentElement' node."
原代码移除-maxevents 1参数后也会触发相同错误,但业务需求需要处理所有符合条件的事件,而非仅单条。
二次修改后的过滤失效问题
根据建议改用循环逐个处理事件,修改代码如下:
foreach ($event in (Get-WinEvent -FilterHashtable @{LogName='Security';ID=5152})) { $xml = [xml]$event.toxml(); $xml.event.eventdata.data | Where-Object {$_.FilterOrigin -ne "Stealth" -or $_.FilterOrigin -ne "Unknown" } | ft -wrap }
然而依然无法过滤掉FilterOrigin为"Stealth"和"Unknown"的事件,请问问题出在哪里?
内容的提问来源于stack exchange,提问作者user20682592
相关产品推荐
相关产品推荐

