【问题标题】:How to use the "__ProviderArchitecture" flag of IWbemContext in c?如何在c中使用IWbemContext的“__ProviderArchitecture”标志?
【发布时间】:2012-05-28 22:58:37
【问题描述】:

我一直在尝试按照以下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-&gt;SetValue(L"__ProviderArchitecture", 0, &amp;value_arch); 行,一切正常,但当然,我最终会查询 32 位注册表提供程序。

我也尝试在ConnectServer 通话期间不设置任何上下文,但仅在ExecMethod 通话期间(如 MSDN 文章中所述),但虽然我没有收到任何错误,但我仍然查询 32 位提供程序,但没有看到我的 64 位注册表项。

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

【问题讨论】:

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


    【解决方案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:错误处理需要改进!

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-21
        相关资源
        最近更新 更多