我正在编写一些代码来在远程机器上执行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
答案 0 :(得分:1)
WMI剥夺了一些安全权利;您需要将您的帐户设置为“信任委派”,非常功能强大且不推荐,或签署您的代码。或者,您可以将明确的权限传递给流程。