如何修正PowerShell中Get-WinEvent的FilterXml过滤条件报错问题
修正Get-WinEvent FilterXml参数的XML格式错误
错误提示的核心原因是你编写的FilterXml不符合XML语法规范——XML元素或属性名称不能以=开头,大概率是你错误地将事件过滤条件直接嵌入了元素名称中(比如错误写法<EventID=5810>)。
正确的FilterXml编写方式
以下是针对近半小时内Netlogon 5810事件的合法FilterXml配置,同时解决UTC时间格式和XML特殊字符转义问题:
# 计算半小时前的UTC时间(符合事件日志的时间格式要求) $timeThreshold = (Get-Date).AddMinutes(-30).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ") # 合法的FilterXml内容,使用XPath表达式指定过滤条件 $filter = @" <QueryList> <Query Id="0" Path="System"> <Select Path="System"> *[System[Provider[@Name='Netlogon'] and EventID=5810 and TimeCreated[@SystemTime>='$timeThreshold']]] </Select> </Query> </QueryList> "@
关键修正点说明
- XML语法合规:放弃错误的元素名嵌入写法,改用XPath表达式在
<Select>节点内定义过滤逻辑 - 时间格式处理:事件日志的
TimeCreated存储的是UTC时间,需将本地时间转换为UTC格式后再传入 - 特殊字符转义:XML中大于号
>必须转义为>,否则会被解析为XML标签的结束符,导致格式错误
完整远程执行脚本
将上述FilterXml整合到远程执行逻辑中,完整脚本如下:
$targetServer = "你的目标服务器名称" $timeThreshold = (Get-Date).AddMinutes(-30).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ") $filter = @" <QueryList> <Query Id="0" Path="System"> <Select Path="System"> *[System[Provider[@Name='Netlogon'] and EventID=5810 and TimeCreated[@SystemTime>='$timeThreshold']]] </Select> </Query> </QueryList> "@ # 远程调用统计事件数量 $eventCount = Invoke-Command -ComputerName $targetServer -ScriptBlock { param($filterXml) # 静默处理无匹配事件的情况,返回0而非报错 (Get-WinEvent -FilterXml $filterXml -ErrorAction SilentlyContinue).Count } -ArgumentList $filter Write-Host "目标服务器近半小时内Netlogon 5810事件数量:$eventCount"
注意事项
- 确保执行脚本的账号拥有目标服务器的事件日志读取权限
- 提前确认目标服务器的WinRM服务已正常启用并配置允许远程连接
-ErrorAction SilentlyContinue用于在无匹配事件时返回0,避免脚本中断
内容的提问来源于stack exchange,提问作者Miogi
相关产品推荐
相关产品推荐

