【问题标题】:Connect to WMI of remote machine when running as a service作为服务运行时连接到远程计算机的 WMI
【发布时间】:2012-10-28 13:04:43
【问题描述】:

我正在编写一些代码来在远程机器上进行 wmi 查询和方法执行。我的登录凭据是域管理员。当我在应用程序模式下运行时,一切正常。当我作为服务运行时,它将无法正常工作,因为默认帐户服务使用 isLocal System。当我将服务设置为作为我的凭据运行时,远程 wmi 也可以正常工作。

但是这是不可取的,所以我试图通过在 IWbemLocator.ConnectServer 提供用户名和密码来连接到远程 wmi 服务。我能够成功取回 IWbemServices 对象。但是,当我尝试从 IWbemServices 对象中获取类对象时,出现错误:

//IWbemServices *pSvc
const bstr_t objectPath("stdRegProv");
const bstr_t methodName("GetStringValue");
IWbemClassObject *pClass = NULL;
HRESULT hr = pSvc->GetObject(objectPath, 0, NULL, &pClass, NULL);

返回的 hr 是 0x80041003,即来自此链接的“访问被拒绝”:http://msdn.microsoft.com/en-us/library/windows/desktop/aa394559%28v=vs.85%29.aspx

通常,如果我提供了错误的用户名和密码,我会在 IWbemLocator.ConnectServer 上拒绝访问。所以我在这里有点困惑为什么连接很好但是我无法获得 IWbemClassObject 对象。由于如果我使用我的域凭据作为服务帐户它可以工作,因此必须存在一些安全差异。我的 WMI 连接代码基于 MSDN 上的此示例代码:http://msdn.microsoft.com/en-us/library/windows/desktop/aa390418%28v=vs.85%29.aspx

【问题讨论】:

  • 我在 Microsoft 论坛上打开了另一个帖子:MS Forum,它在此问题上更深入。但是仍然没有解决。
  • 您是否使用 IWbemLocator.ConnectServer 从远程服务器连接到第三台主机?

标签: c++ wmi


【解决方案1】:

WMI 类型剥夺了一些安全权利;您需要将您的帐户设置为“受信任的委派”,这是非常强大且不推荐的,或者签署您的代码。或者,您可以将显式权限传递给进程。

【讨论】:

  • 您确定他们需要提供授权 priv 而不仅仅是模拟吗?不是 100% 确定这一点,但我就是这么想的。
  • 我通常会同意你的观点,Kevin,但他引用的代码使用了模拟。如果用户没有完全或正确地实现它,那么使用模拟更新他的代码将是一个好主意。 :)
  • 在此处为您的帮助投票。但是在这一点上,我没有 env 来确认这一点了。基本上我们没有走远程 wmi 路由。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 2020-05-14
  • 1970-01-01
相关资源
最近更新 更多