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

如何修正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&gt;='$timeThreshold']]]
    </Select>
  </Query>
</QueryList>
"@

关键修正点说明

  1. XML语法合规:放弃错误的元素名嵌入写法,改用XPath表达式在<Select>节点内定义过滤逻辑
  2. 时间格式处理:事件日志的TimeCreated存储的是UTC时间,需将本地时间转换为UTC格式后再传入
  3. 特殊字符转义:XML中大于号>必须转义为&gt;,否则会被解析为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&gt;='$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:00:05