You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何转换事件查看器数据为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"}

执行后出现两个问题:

  1. 无法过滤掉FilterOrigin为"Stealth"的事件
  2. 抛出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:15:38