事件 ID 1650 出现在 Windows 事件查看器的“系统”或“应用程序”日志中,来源通常为 Group Policy 或 Microsoft-Windows-GroupPolicy。它的典型描述是:组策略中的某条 Windows 防火墙规则处理失败,规则已被跳过。这意味着组策略客户端扩展在把域控制器下发的防火墙策略合并到本地 Windows Defender 防火墙时遇到了错误。该错误通常不会让整个防火墙服务停止,也不会回滚所有规则,而可能只影响一条或几条规则。正因如此,如果管理员只看到“处理失败”几个字而不查看事件详细信息,很容易忽略已经失效的入站放行或出站限制。

一、事件 ID 1650 的底层原因与常见错误码
Windows 防火墙组策略扩展的 CSE 在处理策略时,会先读取 GPO 中的防火墙规则集合,然后通过 WMI 接口查询本地防火墙存储,最后将合并后的规则写回本地策略。这个过程中任何一环失败,都会生成事件 1650。常见错误码包括 0x80041001、0x80070005、0x80070002、0x80070057。0x80041001 通常表示 WMI 查询失败,常见于 C:\Windows\System32\wbem\Repository 存储损坏或 WMI 服务异常。0x80070005 表示访问被拒绝,常见于注册表策略键 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\WindowsFirewall 的 ACL 被修改,SYSTEM 或 Administrators 失去了写权限。0x80070002 表示找不到指定的文件,可能原因是规则中引用的程序路径不存在。0x80070057 表示参数错误,常见于端口范围或地址格式不合法。
管理员可以在事件查看器中右键该事件,选择查看 XML,以获取 ErrorCode 和 RuleName 等关键字段。下面是一段简化后的事件数据示例,展示失败规则和错误码的对应关系。
<EventData> <Data Name="ErrorCode">0x80041001</Data> <Data Name="RuleName">Allow-RDP-from-Corp</Data> <Data Name="Policy">Default Domain Policy</Data> </EventData>
在大型域环境中,如果多个客户端同时出现相同错误码,优先怀疑 GPO 中某条规则本身有问题,而不是每台机器的本地状态。此时应先在域控制器上打开组策略管理控制台,检查该规则定义是否引用了不存在的程序路径、无效的组名或错误的端口语法。
二、利用 gpresult 与 PowerShell 定位失败规则
要确认事件 1650 影响的是哪条规则,先运行 gpresult /h C:\Report\gpresult.html 生成策略结果集报告。注意输出路径的文件夹必须已经存在,否则会报错。打开报告后,展开“计算机配置”下的“策略”,再找到“Windows 设置”中的“安全设置”,查看“高级安全 Windows Defender 防火墙”部分。这里会显示哪些规则通过组策略下发,哪些被跳过或冲突。如果规则没有出现在报告中,说明客户端策略处理尚未完成;如果规则存在但显示为“未定义”或“已禁用”,则可能与本地策略合并失败有关。
PowerShell 可以批量提取事件中的 ErrorCode 和 RuleName,并且适合在多个终端上执行。下面命令读取最近 50 条事件 1650,并输出关键字段。管理员可以根据 RuleName 回到 GPO 管理控制台检查对应规则的配置。
$events = Get-WinEvent -FilterHashtable @{LogName='System'; Id=1650} -MaxEvents 50
foreach ($e in $events) {
[xml]$xml = $e.ToXml()
$errorCode = $xml.Event.EventData.Data | Where-Object { $_.Name -eq 'ErrorCode' } | Select-Object -ExpandProperty '#text'
$ruleName = $xml.Event.EventData.Data | Where-Object { $_.Name -eq 'RuleName' } | Select-Object -ExpandProperty '#text'
[PSCustomObject]@{
Time = $e.TimeCreated
ErrorCode = $errorCode
RuleName = $ruleName
}
}
运行后如果某个 RuleName 重复出现,且 ErrorCode 固定为 0x80070002,基本可以确定是该规则引用的程序路径不存在。比如规则里配置了 C:\Program Files\App\app.exe,但对应客户端没有安装该软件。修改 GPO 时,建议使用环境变量或通配符,或者把规则拆分为多个适用范围,避免无效路径触发处理失败。
三、检查 WMI 存储与注册表权限
事件 1650 伴随 0x80041001 时,重点检查 WMI 存储。先以管理员身份运行 winmgmt /verifyrepository,该命令会验证 C:\Windows\System32\wbem\Repository 目录中的 WMI 存储一致性。如果返回 INCONSISTENT,可以继续执行 winmgmt /salvagerepository 尝试修复;如果返回 WMI repository verification failed,说明存储可能已经严重损坏。此时需要先停止 WMI 服务,备份并重建存储。
winmgmt /verifyrepository winmgmt /salvagerepository
重建 WMI 存储属于最后手段,执行前务必确认没有其他依赖 WMI 的关键任务。管理员可以运行以下命令,将现有存储重命名为 Repository.old,再启动服务让系统重新生成。重新生成后,需要重新应用组策略才能恢复防火墙规则。注意如果某些第三方软件注册了自定义 WMI 类,需要重新安装或注册。
net stop winmgmt /y ren C:\Windows\System32\wbem\Repository Repository.old net start winmgmt
注册表权限方面,可以用 PowerShell 查看防火墙策略键的访问控制列表。下面命令分别显示 WindowsFirewall 主键及其 FirewallRules 子键的 ACL,便于判断 SYSTEM 和 Administrators 是否仍然拥有完全控制权。
Get-Acl -Path "HKLM:\SOFTWARE\Policies\Microsoft\WindowsFirewall" | Format-List Get-Acl -Path "HKLM:\SOFTWARE\Policies\Microsoft\WindowsFirewall\FirewallRules" | Format-List
如果输出中 Owner 不是 SYSTEM 或 Administrators,或者 Access 列表中缺少 NT AUTHORITY\SYSTEM 的 Allow FullControl,就说明权限被改动。标准的组策略刷新过程需要 SYSTEM 账户写入这些键。修复时可以在注册表编辑器中定位到 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\WindowsFirewall,右键选择“权限”,确认 SYSTEM 和 Administrators 拥有完全控制。对于批量化修复,建议从一台正常客户端导出 ACL 并应用到异常机器,不要手动添加过宽的权限,避免引入安全风险。
四、清理冲突规则并强制刷新组策略
有时多条防火墙规则名称相同,或者本地管理员曾经创建过与组策略规则同名的本地规则,也可能导致合并失败。可以使用 Get-NetFirewallRule 查看 ActiveStore 中所有规则,并按显示名称过滤。对于重复项,先确认规则来源是 GPO 还是本地策略。组策略规则的 PolicyStoreSourceType 通常显示为 GroupPolicy,本地规则为 Local。不要直接删除组策略规则,因为下次刷新还会重新创建,而应在 GPO 中修改规则定义。对于已经废弃的本地规则,可以使用 Remove-NetFirewallRule 删除。
Get-NetFirewallRule -PolicyStore ActiveStore |
Where-Object { $_.DisplayName -like '*RDP*' -or $_.DisplayName -like '*GPO*' } |
Format-Table DisplayName, Enabled, Direction, Action, PolicyStoreSourceType, RuleGroup
清理完成后,不要只执行 gpupdate,建议使用 gpupdate /force 强制重新应用所有策略。对于域内多台计算机,可以在 PowerShell 中调用 Invoke-GPUpdate 并指定目标计算机,例如 Invoke-GPUpdate -Computer SERVER01 -Force。刷新后再次查看事件查看器,确认没有新增 1650 事件。如果仍有,记录新的 ErrorCode 继续缩小范围。
五、预防与自动化巡检
要避免事件 1650 在业务环境中反复出现,建议把组策略防火墙规则变更纳入变更管理。每次修改 GPO 前,先在测试 OU 中验证规则的程序路径、端口范围和用户组引用都有效。使用组策略建模向导可以预览策略结果,帮助发现规则冲突。对于经常出现 0x80041001 的终端,应定期执行 winmgmt /verifyrepository,并将 WMI 存储健康检查加入日常巡检脚本。
下面脚本可放在计划任务中每天运行,检查最近 24 小时是否有事件 1650,并输出 CSV 报告。若检测到事件,可通过邮件或监控系统通知管理员。脚本路径使用 C:\Windows\Temp,确保普通用户也有写权限。
$start = (Get-Date).AddDays(-1)
$events = Get-WinEvent -FilterHashtable @{LogName='System'; Id=1650; StartTime=$start} -ErrorAction SilentlyContinue
if ($events) {
$output = "C:\Windows\Temp\Event1650_$(Get-Date -Format yyyyMMdd).csv"
$events | Select-Object TimeCreated, Id, LevelDisplayName, Message | Export-Csv -Path $output -NoTypeInformation
Write-Output "检测到 $($events.Count) 条事件 ID 1650,报告路径:$output"
} else {
Write-Output "最近24小时无事件 ID 1650"
}
事件 ID 1650 的处理关键是不要只看事件摘要,而要提取 ErrorCode 和 RuleName。大多数情况下,不是防火墙服务损坏,而是组策略规则引用无效、WMI 存储不一致或注册表权限不足。按本文顺序排查,能较快恢复策略应用,并减少服务器端口暴露风险。
事件 ID 1650组策略Windows 防火墙修改时间:2026-10-04 19:30:45