C# - Windows Service - Remote WMI query throws error: RPC not found
C# - Windows Service - Remote WMI query throws error: RPC not found
我正在开发 WMI 查询 windows 服务来查询网络服务器。
如果我 运行 控制台中的应用程序,它会按预期工作,但服务无法完成 WMI 查询。有什么方法可以设置服务,使 RPC 不会因权限不足而失败?我在 WMI 查询中使用凭据连接到远程 PC,所以这应该不是问题。
谢谢
可能的原因:
防火墙配置(RPC连接阻塞)
您没有足够的权限进行 运行 WMI 查询。
如果您尝试 运行 在远程计算机上查询,则第二点有效。您可以使用wbemtest
来验证。
Windows+R(运行命令)
键入 wbemtest
您必须连接 ManagementScope
并检查其有效性 scope.IsConnected
。这只是一小段代码,您可能需要为其提供结构。
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>
}
我正在开发 WMI 查询 windows 服务来查询网络服务器。 如果我 运行 控制台中的应用程序,它会按预期工作,但服务无法完成 WMI 查询。有什么方法可以设置服务,使 RPC 不会因权限不足而失败?我在 WMI 查询中使用凭据连接到远程 PC,所以这应该不是问题。
谢谢
可能的原因:
防火墙配置(RPC连接阻塞)
您没有足够的权限进行 运行 WMI 查询。
如果您尝试 运行 在远程计算机上查询,则第二点有效。您可以使用wbemtest
来验证。
Windows+R(运行命令)
键入 wbemtest
您必须连接 ManagementScope
并检查其有效性 scope.IsConnected
。这只是一小段代码,您可能需要为其提供结构。
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>
}