none
using Msvm_VirtualSystemManagementService in C++ RRS feed

  • Question


  • HI,
     I'm pretty new to WMI. I'm trying to use the functions of Msvm_VirtualSystemManagementService class in C++ program. I used it as a typical WMI provider class.
    But it is giving some error. Here is the code I used. I'm getting an error in the last line of the copied code..
       
        HRESULT hres;

        // Step 1: --------------------------------------------------
        // Initialize COM. ------------------------------------------

        hres =  CoInitializeEx(0, COINIT_MULTITHREADED);
        if (FAILED(hres))
        {
            cout << "Failed to initialize COM library. Error code = 0x"
                 << hex << hres << endl;
            return 1;                  // Program has failed.
        }

        // Step 2: --------------------------------------------------
        // Set general COM security levels --------------------------
        // Note: If you are using Windows 2000, you must specify -
        // the default authentication credentials for a user by using
        // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
        // parameter of CoInitializeSecurity ------------------------

        hres =  CoInitializeSecurity(
            NULL,
            -1,                          // COM negotiates service
            NULL,                        // Authentication services
            NULL,                        // Reserved
            RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication
            RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation 
            NULL,                        // Authentication info
            EOAC_NONE,                   // Additional capabilities
            NULL                         // Reserved
            );

                         
        if (FAILED(hres))
        {
            cout << "Failed to initialize security. Error code = 0x"
                 << hex << hres << endl;
            CoUninitialize();
            return 1;                      // Program has failed.
        }
       
        // Step 3: ---------------------------------------------------
        // Obtain the initial locator to WMI -------------------------

        IWbemLocator *pLoc = NULL;

        hres = CoCreateInstance(
            CLSID_WbemLocator,            
            0,
            CLSCTX_INPROC_SERVER,
            IID_IWbemLocator, (LPVOID *) &pLoc);
     
        if (FAILED(hres))
        {
            cout << "Failed to create IWbemLocator object. "
                 << "Err code = 0x"
                 << hex << hres << endl;
            CoUninitialize();
            return 1;                 // Program has failed.
        }

        // Step 4: ---------------------------------------------------
        // Connect to WMI through the IWbemLocator::ConnectServer method

        IWbemServices *pSvc = NULL;
       
        // Connect to the local root\cimv2 namespace
        // and obtain pointer pSvc to make IWbemServices calls.
        hres = pLoc->ConnectServer(
            _bstr_t(L"ROOT\\CIMV2"),
            NULL,
            NULL,
            0,
            NULL,
            0,
            0,
            &pSvc
        );
           
        if (FAILED(hres))
        {
            cout << "Could not connect. Error code = 0x"
                 << hex << hres << endl;
            pLoc->Release();    
            CoUninitialize();
            return 1;                // Program has failed.
        }

        cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;


        // Step 5: --------------------------------------------------
        // Set security levels for the proxy ------------------------

        hres = CoSetProxyBlanket(
            pSvc,                        // Indicates the proxy to set
            RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
            RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
            NULL,                        // Server principal name
            RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx
            RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
            NULL,                        // client identity
            EOAC_NONE                    // proxy capabilities
        );

        if (FAILED(hres))
        {
            cout << "Could not set proxy blanket. Error code = 0x"
                 << hex << hres << endl;
            pSvc->Release();
            pLoc->Release();    
            CoUninitialize();
            return 1;              
        }

        // Step 6: --------------------------------------------------
        // Use the IWbemServices pointer to make requests of WMI ----

        // set up to call the Win32_Process::Create method
        BSTR MethodName = SysAllocString(L"ImportVirtualSystem");
        BSTR ClassName = SysAllocString(L"Msvm_VirtualSystemManagementService");

        IWbemClassObject* pClass = NULL;
        hres = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL);
    // It failed here
       
        ......


    I am getting error in the call to getObject function in the last line. It returns 0x80041002 which is "
    WBEM_E_NOT_FOUND" meaning WMI could not find the class Msvm_VirtualSystemManagementService.
    Is this the right way of using Msvm_VirtualSystemManagementService class or there is any other way? Any help is appreciated.

    thanks,
    Madhu
    Tuesday, April 1, 2008 11:14 AM

Answers

All replies

  •  

    You need to look at root\\virtualizaton - not root\\cimv2

     

    Cheers,

    Ben

    Friday, April 4, 2008 6:46 PM
  • thanks Ben.

    I'm able to enumerate VMs in C++.
    However another program to import a virtual machine fails. It gives the error code 0x8004102f which is WBEM_E_INVALID_METHOD_PARAMETERS when I make a call to ExecMethod. I'm clueless why it is returning the error. Here is the code.



    HRESULT hres;

        // Step 1: --------------------------------------------------
        // Initialize COM. ------------------------------------------

        hres =  CoInitializeEx(0, COINIT_MULTITHREADED);
        if (FAILED(hres))
        {
            cout << "Failed to initialize COM library. Error code = 0x"
                 << hex << hres << endl;
            return 1;                  // Program has failed.
        }

        // Step 2: --------------------------------------------------
        // Set general COM security levels --------------------------
        // Note: If you are using Windows 2000, you must specify -
        // the default authentication credentials for a user by using
        // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
        // parameter of CoInitializeSecurity ------------------------

        hres =  CoInitializeSecurity(
            NULL,
            -1,                          // COM negotiates service
            NULL,                        // Authentication services
            NULL,                        // Reserved
            RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication
            RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation 
            NULL,                        // Authentication info
            EOAC_NONE,                   // Additional capabilities
            NULL                         // Reserved
            );

                         
        if (FAILED(hres))
        {
            cout << "Failed to initialize security. Error code = 0x"
                 << hex << hres << endl;
            CoUninitialize();
            return 1;                      // Program has failed.
        }
       
        // Step 3: ---------------------------------------------------
        // Obtain the initial locator to WMI -------------------------

        IWbemLocator *pLoc = NULL;

        hres = CoCreateInstance(
            CLSID_WbemLocator,            
            0,
            CLSCTX_INPROC_SERVER,
            IID_IWbemLocator, (LPVOID *) &pLoc);
     
        if (FAILED(hres))
        {
            cout << "Failed to create IWbemLocator object. "
                 << "Err code = 0x"
                 << hex << hres << endl;
            CoUninitialize();
            return 1;                 // Program has failed.
        }

        // Step 4: ---------------------------------------------------
        // Connect to WMI through the IWbemLocator::ConnectServer method

        IWbemServices *pSvc = NULL;
       
        // Connect to the local root\cimv2 namespace
        // and obtain pointer pSvc to make IWbemServices calls.
        hres = pLoc->ConnectServer(
            _bstr_t(L"root\\virtualization"),
            NULL,
            NULL,
            0,
            NULL,
            0,
            0,
            &pSvc
        );
           
        if (FAILED(hres))
        {
            cout << "Could not connect. Error code = 0x"
                 << hex << hres << endl;
            pLoc->Release();    
            CoUninitialize();
            return 1;                // Program has failed.
        }

        cout << "Connected to root\\virtualization WMI namespace" << endl;


        // Step 5: --------------------------------------------------
        // Set security levels for the proxy ------------------------

        hres = CoSetProxyBlanket(
            pSvc,                        // Indicates the proxy to set
            RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
            RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
            NULL,                        // Server principal name
            RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx
            RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
            NULL,                        // client identity
            EOAC_NONE                    // proxy capabilities
        );

        if (FAILED(hres))
        {
            cout << "Could not set proxy blanket. Error code = 0x"
                 << hex << hres << endl;
            pSvc->Release();
            pLoc->Release();    
            CoUninitialize();
            return 1;               // Program has failed.
        }

        // Step 6: --------------------------------------------------
        // Use the IWbemServices pointer to make requests of WMI ----

        // set up to call the Win32_Process::Create method
        BSTR MethodName = SysAllocString(L"ImportVirtualSystem");
        BSTR ClassName = SysAllocString(L"Msvm_VirtualSystemManagementService");

        IWbemClassObject* pClass = NULL;
        hres = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL);

        IWbemClassObject* pInParamsDefinition = NULL;
        hres = pClass->GetMethod(MethodName, 0,
            &pInParamsDefinition, NULL);

        IWbemClassObject* pClassInstance = NULL;
        hres = pInParamsDefinition->SpawnInstance(0, &pClassInstance);

        // Create the values for the in parameters
        //VARIANT varCommand;
        //varCommand.vt = VT_BSTR;
        //varCommand.bstrVal = L"C:\\Exported_VMs";

        //// Store the value for the in parameters
        //hres = pClassInstance->Put(L"CommandLine", 0,
        //    &varCommand, 0);
        //wprintf(L"The command is: %s\n", V_BSTR(&varCommand));
       
        VARIANT expDir;
        expDir.vt = VT_BSTR;
        expDir.bstrVal = SysAllocString(L"C:\\Exported_VMs\\win2k3_previous");
        hres = pClassInstance->Put(L"ImportDirectory", 0, &expDir, 0);
        VariantClear(&expDir);


        /*VARIANT compSysVar;
        compSysVar.vt = VT_BSTR;
        compSysVar.bstrVal = SysAllocString(L"win2k3");
        hres = pClassInstance->Put(L"ComputerSystem", 0, &compSysVar, 0);
        VariantClear(&compSysVar);*/

       


        // Execute Method
        IWbemClassObject* pOutParams = NULL;

        // It gives the error here

        hres = pSvc->ExecMethod(ClassName, MethodName, 0,
        NULL, pClassInstance, &pOutParams, NULL);


        if (FAILED(hres))
        {
            cout << "Could not execute method. Error code = 0x"
                 << hex << hres << endl;
            //VariantClear(&compSysVar);
            VariantClear(&expDir);
            SysFreeString(ClassName);
            SysFreeString(MethodName);
            pClass->Release();
            pInParamsDefinition->Release();
            //pOutParams->Release();
            pSvc->Release();
            pLoc->Release();    
            CoUninitialize();
            return 1;               // Program has failed.
        }

        // To see what the method returned,
        // use the following code.  The return value will
        // be in &varReturnValue
        VARIANT varReturnValue;
        hres = pOutParams->Get(_bstr_t(L"ReturnValue"), 0,
            &varReturnValue, NULL, 0);


        // Clean up
        //--------------------------
        //VariantClear(&compSysVar);
        VariantClear(&expDir);
        VariantClear(&varReturnValue);
        SysFreeString(ClassName);
        SysFreeString(MethodName);
        pClass->Release();
        pInParamsDefinition->Release();
        pOutParams->Release();
        pLoc->Release();
        pSvc->Release();
        CoUninitialize();
        return 0;
    }

    ne help is appreciated.

    thanks,
    Madhu

    Wednesday, April 23, 2008 10:06 AM
  • I figured out.
    I was trying to access to the method in a static way; but in this case it should be accessed in non-static way. I was mislead by the error 'Invalid Parameters' and thought that the parameters I passed were wrong.
    Tuesday, May 20, 2008 1:01 PM
  •  

    I have problems with the same code.

     

    ...

    IWbemClassObjectPtr output;

    CComBSTR methodName(L"GetSummaryInformation");

    CComBSTR objectPath(L"CreationClassName='Msvm_VirtualSystemManagementService'");

    hr = Wmi->ExecMethod(objectPath,  methodName,  0, NULL,  methodPtr,  &output,  &resPtr);

    ...

     

    And method always returns 0x80041024, "WBEM_E_PROVIDER_NOT_CAPABLE"

     

    I don't what to do farther.

     

    PS: The save code from VBS works fine.

    Wednesday, June 18, 2008 6:25 PM
  • If this problem still persist then below is the one of resolution to this problem.

    This can be resolved by providing a __PATH property value of "Msvm_VirtualSystemManagementService" in ClassName Argument of ExecMethod.

     

    hres = pSvc->ExecMethod(ClassName, MethodName, 0,
        NULL, pClassInstance, &pOutParams, NULL);

    Hope this resolve the issue.
    Tuesday, August 19, 2008 10:45 AM
  • There's pretty much nobody minding this particular MSDN forum..  all the virtualization support is over in the technet form

     

    http://forums.technet.microsoft.com/en-US/winserverhyperv/threads/

     

    (note the pinned message at the top of the forum that they are de-commissioning these on the 22nd  )

     

    Further discussion of this issue should be moved to the technet virtulization forum.

     

    Thursday, August 21, 2008 11:22 PM
  •  

    I have the same problem with parameters. Could you give more details on your solution please?
    Thursday, September 18, 2008 3:48 PM
  • As of 8/22/2008 this forum is de-comissioned, and there's pretty much nobody minding this particular MSDN forum..  all the virtualization support is over in the technet form

     

    http://forums.technet.microsoft.com/en-US/winserverhyperv/threads/

     

    (note the pinned message at the top of the forum that they are de-commissioning these on the 22nd  )

     

    Further discussion of this issue should be moved to the technet virtulization forum.

     

    Thursday, September 18, 2008 3:59 PM