Need help with my subroutine in C++

Discussion in 'Mixed Languages' started by Jachra, Dec 12, 2018.

Tags:
  1. Jachra

    Jachra MDL Member

    Apr 5, 2010
    184
    55
    10
    Hello

    I tried to convert the following from VBS to C++. I keep getting error "Failed to Initialize COM. Error code = 0x80010106" on my CoInitializeEx(NULL, COINIT_MULTITHREADED) call. What do I do wrong?
    Thanks in advance for any help.

    Code:
    strComputer = "."
    
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from SoftwareLicensingProduct")
    
    For Each objItem in colItems
        If NOT objItem.ProductKeyID = "null" Then
            Wscript.Echo "Extend PID: " & objItem.ProductKeyID
            Wscript.Echo "Windows Family: " & objItem.LicenseFamily
            Wscript.Echo "Windows Type: " & objItem.ProductKeyChannel
            Wscript.Echo "Activation ID: " & objItem.ID
            Exit For
        End If
    Next
    My function in C++:

    Code:
    private: std::string GetActIDFromSystem()
        {
            HRESULT hres;
            hres = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    
            if (FAILED(hres))
            {
                //std::string format_error(unsigned __int32 hres);
                std::stringstream ss;
                ss << "Failed to Initialize COM. Error code = 0x" << std::hex << hres << std::endl;
                return ss.str();
            }
    
            hres = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
    
            if (FAILED(hres))
            {
                CoUninitialize();
                //std::string format_error(unsigned __int32 hres);
                std::stringstream ss;
                ss << "Failed to initialize security. Error code = 0x" << std::hex << hres << std::endl;
                return ss.str();
            }
    
            IWbemLocator *pLoc = NULL;
            hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc);
    
            if (FAILED(hres))
            {
                CoUninitialize();
                //std::string format_error(unsigned __int32 hres);
                std::stringstream ss;
                ss << "Failed to create IWbemLocator object. Error code = 0x" << std::hex << hres << std::endl;
                return ss.str();
            }
    
            IWbemServices *pSvc = NULL;
    
            // Connect to the root\cimv2 namespace with
            // the current user 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))
            {
                pLoc->Release();
                CoUninitialize();
                //std::string format_error(unsigned __int32 hres);
                std::stringstream ss;
                ss << "Could not connect. Error code = 0x" << std::hex << hres << std::endl;
                return ss.str();
            }
    
            //cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;
    
            hres = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
    
            if (FAILED(hres))
            {
                pSvc->Release();
                pLoc->Release();
                CoUninitialize();
                //std::string format_error(unsigned __int32 hres);
                std::stringstream ss;
                ss << "Could not set proxy blanket. Error code = 0x" << std::hex << hres << std::endl;
                return ss.str();
            }
    
            // For example, get the name of the operating system
            IEnumWbemClassObject* pEnumerator = NULL;
            hres = pSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM SoftwareLicensingProduct"),
                WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
    
            if (FAILED(hres))
            {
                pSvc->Release();
                pLoc->Release();
                CoUninitialize();
                //std::string format_error(unsigned __int32 hres);
                std::stringstream ss;
                ss << "Query for SoftwareLicensingProduct failed. Error code = 0x" << std::hex << hres << std::endl;
                return ss.str();
            }
    
            IWbemClassObject *pclsObj = NULL;
            ULONG uReturn = 0;
    
            while (pEnumerator)
            {
                HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
    
                if (0 == uReturn)
                {
                    break;
                }
    
                VARIANT vtProp;
    
                // Get the value of the Name property
                hr = pclsObj->Get(L"ProductKeyID", 0, &vtProp, 0, 0);
                std::stringstream ss;
                ss << vtProp.bstrVal;
                VariantClear(&vtProp);
    
                pclsObj->Release();
            }
    
            // Cleanup
            // ========
            pSvc->Release();
            pLoc->Release();
            pEnumerator->Release();
            CoUninitialize();
            return "0";
        }
     
  2. Michaela Joy

    Michaela Joy MDL Crazy Lady

    Jul 26, 2012
    4,071
    4,651
    150
    #2 Michaela Joy, Dec 12, 2018
    Last edited: Dec 12, 2018
    Stop hovering to collapse... Click to collapse... Hover to expand... Click to expand...
  3. Jachra

    Jachra MDL Member

    Apr 5, 2010
    184
    55
    10
    Thank you for your answer. I tried that, but did get an error on CoInitializeSecurity. I disabled that part of code and then it worked.
     
  4. Michaela Joy

    Michaela Joy MDL Crazy Lady

    Jul 26, 2012
    4,071
    4,651
    150
    @Jachra: I'm glad I was able to help. :)

    Please describe the error that you're getting, and We'll try to figure out what's needed to fix it.
     
    Stop hovering to collapse... Click to collapse... Hover to expand... Click to expand...
  5. Muerto

    Muerto MDL Debugger

    Mar 7, 2012
    1,855
    2,103
    60
    #5 Muerto, Dec 12, 2018
    Last edited: Jan 14, 2021
    ...