Windows11中ManagementObjectSearcher等调用触发RPC_E_CALL_CANCELED错误求助
问题分析与解决方案
问题描述
基于.NET 5.0的WPF应用在Windows 11环境下执行WMI查询时,抛出错误:Call was canceled by the message filter. (0x80010002 (RPC_E_CALL_CANCELED)),Windows 10下运行完全正常。触发错误的场景有两个:
- 场景一:查询
root\SecurityCenter2命名空间下的AntivirusProduct时,ManagementObjectSearcher.Get()方法抛出异常ManagementObjectSearcher searcher = new ManagementObjectSearcher(@"\\" + Environment.MachineName + @"\root\SecurityCenter2", "SELECT * FROM AntivirusProduct"); ManagementObjectCollection instances = searcher.Get(); - 场景二:启动
Win32_VolumeChangeEvent事件监视器时,ManagementEventWatcher.Start()方法抛出异常var watcher = new ManagementEventWatcher(); watcher.Query = new EventQuery("SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2 OR EventType = 3"); watcher.Start();
此外,多次重启电脑后应用可临时恢复正常,问题触发原因暂不明确。
可行解决方案
1. 把WMI操作移到后台线程执行
Win11的RPC消息过滤机制对UI线程的阻塞更敏感,直接在UI线程执行WMI调用容易被判定为超时取消。将WMI操作放到后台线程:
// 场景一异步执行示例 var antivirusInstances = await Task.Run(() => { var searcher = new ManagementObjectSearcher(@"\\" + Environment.MachineName + @"\root\SecurityCenter2", "SELECT * FROM AntivirusProduct"); return searcher.Get(); }); // 场景二后台启动监视器示例 await Task.Run(() => { var watcher = new ManagementEventWatcher(); watcher.Query = new EventQuery("SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2 OR EventType = 3"); // 事件处理需切回UI线程更新界面 watcher.EventArrived += (sender, e) => { Application.Current.Dispatcher.Invoke(() => { // 编写你的事件处理逻辑 }); }; watcher.Start(); });
2. 调整WMI消息过滤器超时时间
通过修改注册表延长RPC调用的超时阈值,避免因系统响应慢被取消:
- 打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WMI\AutoRecovery - 创建或修改
DWORD类型值Timeout,设置为30000(单位毫秒,可按需调整) - 重启WMI服务:打开命令提示符执行
net stop winmgmt && net start winmgmt
3. 重置或重启WMI服务
Win11的WMI服务可能因系统更新或异常缓存导致临时故障:
- 打开服务管理器,找到
Windows Management Instrumentation服务,确认状态为正在运行、启动类型为自动 - 若服务异常,先重启服务;仍未解决则执行
winmgmt /resetrepository重置WMI存储库(注意:此操作会重置WMI配置,需谨慎执行)
4. 提升应用运行权限
Win11的权限管控更严格,部分WMI查询需要管理员权限:
- 在应用清单文件中添加管理员权限声明:
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo> - 或右键应用程序,选择
以管理员身份运行测试是否解决问题
5. 替换SecurityCenter2的WMI查询
Win11对root\SecurityCenter2命名空间的访问限制大幅收紧,可改用Windows Defender原生API获取杀毒软件状态:
using Microsoft.Win32; var defenderKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows Defender\Real-Time Protection"); if (defenderKey != null) { bool isRealTimeEnabled = (int)defenderKey.GetValue("DisableRealtimeMonitoring") == 0; // 编写后续状态处理逻辑 }
内容的提问来源于stack exchange,提问作者Konrad Karkos
相关产品推荐
相关产品推荐

