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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:55:25