2012-05-16 40 views
2

我正在写一些代码来执行远程计算机上的wmi查询和方法执行。我的登录凭据是域管理员。当我在应用程序模式下运行时,每个工作正常。当我作为服务运行时,由于默认帐户服务使用isLocal System,因此它不会工作。当我将服务设置为我的凭证运行时,远程wmi也正常工作。作为服务运行时连接到远程机器的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

我在微软论坛上打开了另一篇文章:[MS Forum](http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/4161d6a1-1b52-4aa9-98b9-eacad5ba2a90/)在这个问题上它更深入。但它仍然没有解决。 – windfly2006

+0

您是否使用IWbemLocator.ConnectServer从远程服务器连接到第三个主机? – Lizz

回答

1

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

+0

您确定他们需要提供代表团priv而不仅仅是模仿吗?不是100%肯定的,但是这就是我所遇到的。 –

+0

我通常会同意你,凯文,但他引用的代码使用模拟。如果用户没有完全或正确地实现它,那么使用模拟更新他的代码将是一个好主意。 :) – Lizz

+0

在这里投票给你的帮助。然而在这一点上,我没有一个env来证实这一点。基本上我们没有去远程wmi路线。 – windfly2006