如何在c中使用IWbemContext的“__ProviderArchitecture”标志?

时间:2012-05-28 22:58:37

标签: c++ windows visual-c++ wmi

我一直在尝试按照以下MSDN tutorial从32位应用程序查询64位注册表提供程序。

可悲的是,这些例子都是用VB编写的,而且我还是坚持不懈。

对于C ++开发人员,文章提到了......

  

C ++应用程序可以使用IWbemContext接口与IWbemServices :: ExecMethod将非默认提供程序的使用传达给WMI。

...虽然,当您查看示例VB代码时,上下文对象也在ConnectServer方法中使用:

Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
objCtx.Add "__ProviderArchitecture", 32
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx)
Set objStdRegProv = objServices.Get("StdRegProv") 

我已尝试在VC ++中复制它:

HRESULT res;
CComPtr<IWbemContext> ctx;
if (!create_registry_redirection_context_(hive, ctx)) {
    return false;
}

res = locator_->ConnectServer(CComBSTR(namespace_.c_str()),     // Namespace to use
                              0,                                // Current security context (username)
                              0,                                // Current security context (password)
                              0,                                // Use current locale
                              WBEM_FLAG_CONNECT_USE_MAX_WAIT,   // Return if connexion is unsuccessful after 2 minutes
                              0,                                // Name of the domain  of the user to authenticate
                              ctx,                              // Optional context
                              &service_);                       // Fill this pointer

create_registry_redirection_context_方法使用CoCreateInstance来实例化我的上下文,并使用以下行来设置架构:

CComVariant value_arch(64, VT_I4);
ctx->SetValue(L"__ProviderArchitecture", 0, &value_arch);

现在的问题是,ConnectServer方法返回错误(0x80041008 - WMI无效参数)。如果我注释掉ctx->SetValue(L"__ProviderArchitecture", 0, &value_arch);行,一切正常,但当然,我最终会查询32位注册管理机构提供商。

我也尝试过在ConnectServer调用期间没有设置任何上下文,但只在ExecMethod调用期间(如MSDN文章中所指定),但是虽然我没有收到任何错误,我仍然在查询32位提供程序,而没有看到我的64位注册表项。

我做错了什么? 提前感谢您的时间。

2 个答案:

答案 0 :(得分:1)

我知道,这有点晚了,但是对于存档(因为MS无法提供这样的样本):

  HRESULT hres;
  IWbemLocator *pLoc = NULL;
  hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc); 
  if (FAILED(hres))
  {
    m_nExitCode = TCP1;
    return FALSE;
  }

  IWbemContext *pContext = NULL;
  hres = CoCreateInstance(CLSID_WbemContext, 0, CLSCTX_INPROC_SERVER, IID_IWbemContext, (LPVOID *) &pContext); 
  if (FAILED(hres))
  {
    m_nExitCode = TCP1_2;
    return FALSE;
  }

  VARIANT vArchitecture;
  VariantInit(&vArchitecture);
  V_VT(&vArchitecture) = VT_I4;
  V_INT(&vArchitecture) = 64;
  hres = pContext->SetValue(_bstr_t(L"__ProviderArchitecture"), 0, &vArchitecture);
  VariantClear(&vArchitecture);

  //VARIANT vRequiredArchicture;
  //VariantInit(&vRequiredArchicture);
  //V_VT(&vRequiredArchicture) = VT_BOOL;
  //V_BOOL(&vRequiredArchicture) = VARIANT_TRUE;
  //hres = pContext->SetValue(_bstr_t(L"__RequiredArchitecture"), 0, &vRequiredArchicture);
  //VariantClear(&vRequiredArchicture);

  IWbemServices *pSvc = NULL;

  hres = pLoc->ConnectServer(
     _bstr_t(L"root\\Microsoft\\SqlServer\\ComputerManagement10"), // Object path of WMI namespace
     NULL,                    // User name. NULL = current user
     NULL,                    // User password. NULL = current
     0,                       // Locale. NULL indicates current
     NULL,                    // Security flags.
     0,                       // Authority (for example, Kerberos)
     pContext,               // Context object 
     &pSvc                    // pointer to IWbemServices proxy
     );

具有RequiredArchitecture的块未经测试,似乎没有必要。 PS:错误处理需要改进!

答案 1 :(得分:0)

你看过了吗? http://msdn.microsoft.com/en-us/library/windows/desktop/aa393067(v=vs.85).aspx 并尝试设置“__RequiredArchitecture”= TRUE?

还必须尝试以相同代码显示(即64位到32位)的方式使其工作吗?