WMI ManagementScope远程连接报RPC_C_AUTHN_LEVEL_PKT_INTEGRITY错误排查
问题原因
你在远程主机事件查看器中看到的DCOM报错已经明确给出了拦截原因:
服务器端身份验证级别策略不允许来自地址XX.X.XX.XXX的用户Machinename\user(SID:X-X-X-XX-XXXXXX-XXXXX-XXXXXX-XXXX)激活DCOM服务器,请在客户端应用程序中将激活身份验证级别至少提升至RPC_C_AUTHN_LEVEL_PKT_INTEGRITY。
2021年起微软推送的DCOM安全加固更新,默认强制所有入站DCOM/WMI连接的认证级别不得低于RPC_C_AUTHN_LEVEL_PKT_INTEGRITY(数据包完整性)。你贴出的代码没有显式指定WMI连接的认证级别,使用的默认认证级别低于服务端策略阈值,因此直接抛出“拒绝访问”异常。
同代码在另一台机器正常运行的原因是那台机器要么未安装对应DCOM安全更新,要么系统全局默认DCOM认证级别刚好满足要求,属于环境特例,不代表代码写法符合当前Windows的默认安全规则。
修复方法
在ConnectionOptions初始化时显式指定符合要求的认证级别即可,修正后的可运行代码如下:
using System.Management; var connection = new ConnectionOptions(); connection.Username = "MyUsername"; connection.Password = "MyPassword"; // 显式设置认证级别为数据包完整性,匹配服务端DCOM策略要求 connection.Authentication = AuthenticationLevel.PacketIntegrity; // 跨工作组/跨域场景建议补充设置模拟级别,避免权限上下文异常 connection.Impersonation = ImpersonationLevel.Impersonate; var scope = new ManagementScope($@"\\{Address}\root\cimv2", connection); scope.Connect();
补充排查项
如果修改代码后依然连接失败,按以下顺序排查客户端配置:
- 运行
dcomcnfg打开组件服务,依次展开「组件服务 > 计算机 > 我的电脑」,右键打开属性页,在「默认属性」 tab 中确认「默认身份验证级别」没有被手动设置为低于「数据包完整性」的选项,无特殊需求直接设置为「连接」即可,代码中显式指定的参数会覆盖该全局默认值 - 运行
gpedit.msc打开本地组策略编辑器,依次定位到「计算机配置 > 管理模板 > 系统 > 远程过程调用」,检查「用于未激活的RPC客户端的RPC认证级别」策略,若被手动修改为低于数据包完整性的级别,改回「未配置」即可 - 确认你使用的连接账号在远程主机上拥有WMI命名空间的远程访问、激活权限,不要使用Guest账号或空密码账号发起远程WMI连接
- 确认客户端和远程主机之间的防火墙放行了WMI通信流量(默认使用DCOM动态端口范围+135端口)
内容的提问来源于stack exchange,提问作者0xBADF00
相关产品推荐
相关产品推荐

