C# - Windows 服务 - 远程 WMI 查询抛出错误:找不到 RPC

Posted

技术标签:

【中文标题】C# - Windows 服务 - 远程 WMI 查询抛出错误:找不到 RPC【英文标题】:C# - Windows Service - Remote WMI query throws error: RPC not found 【发布时间】:2016-05-09 09:00:07 【问题描述】:

我正在开发 WMI 查询窗口服务来查询网络服务器。 如果我在控制台中运行应用程序,它会按预期工作,但服务无法完成 WMI 查询。有什么方法可以设置服务,使 RPC 不会因权限不足而失败?我在 WMI 查询中使用凭据连接到远程 PC,所以这应该不是问题。

谢谢

【问题讨论】:

服务以什么账户运行? "The RPC server is unavailable" using WMI query的可能重复 【参考方案1】:

可能的原因:

防火墙配置(RPC 连接阻塞)

您没有足够的权限来运行 WMI 查询。

如果您尝试在远程计算机上运行查询,则第二点有效。您可以使用wbemtest 进行验证。

    Windows+R(运行命令)

    键入 wbemtest

您必须连接ManagementScope 并检查它的有效性scope.IsConnected。它只是一段 sn-p 代码,您可能需要为其提供一个结构。

ConnectionOptions cOption = new ConnectionOptions();
    ManagementScope scope = new ManagementScope("\\\\" + machine + "\\" + nameSpaceRoot + "\\" + managementScope, cOption);
           scope.Options.Username = UserName;
            scope.Options.Password = passWord;
            scope.Options.EnablePrivileges = true;
            scope.Options.Authentication = AuthenticationLevel.PacketPrivacy;
            //scope.Options.Timeout = TimeSpan.FromSeconds(180);
            //cOption.Timeout = TimeSpan.FromSeconds(180);
            scope.Options.Impersonation = ImpersonationLevel.Impersonate;
            scope.Connect();
            return scope;



    if (scope.IsConnected && scope != null)
    
    query = new ObjectQuery(@"Select * from Win32_SCSIController");
                            searcher = new ManagementObjectSearcher(scope, query); searcher.Options.Timeout = new TimeSpan(0, 0, wbemConnectFlagUseMaxWait);
                            ManagementObjectCollection qWin32_SCSIController = searcher.Get();
    foreach (ManagementObject item in qWin32_SCSIController)
        
    <Some code here>
    

【讨论】:

以上是关于C# - Windows 服务 - 远程 WMI 查询抛出错误:找不到 RPC的主要内容,如果未能解决你的问题,请参考以下文章

作为 Windows 服务托管时,远程 WMI 不起作用

无法使用 WMI 和 C# 远程终止进程

授予远程用户(非管理员)使用 WMI 和 C# 在命名空间 cimv2 中枚举 Win32_Service 服务的能力

什么是WMI 有什么用?

如何使用 C# 在远程 Windows 机器上创建共享文件夹?

C# WMI、性能计数器和 SNMP 哦,天哪!