none
error 0x80070005 RRS feed

  • Pregunta

  • Tengo el siguien codigo de WMI en C++, lo que intento es conectarme a un ordenador remoto y obtener el nombre de la instancia del sistema operativo. El programa se conecta correctamente al espacio de nombres del sistema remoto pero al hacer la consulta me da el error 0x8007005. El equipo local es un XP y el remoto un Server 2003, ninguno de los dos esta en un dominio. Si alguien me puede ayudar se lo agradeceria.


    #define _WIN32_DCOM
    #define UNICODE
    #include <iostream>
    using namespace std;
    #include <comdef.h>
    #include <Wbemidl.h>
    # pragma comment(lib, "wbemuuid.lib")
    # pragma comment(lib, "credui.lib")
    # pragma comment(lib, "comsuppw.lib")
    #include <wincred.h>
    #include <strsafe.h>

    int __cdecl main(int argc, char **argv)
    {
        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 --------------------------

        hres =  CoInitializeSecurity(
            NULL,
            -1,                          // COM authentication
            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 remote root\cimv2 namespace
        // and obtain pointer pSvc to make IWbemServices calls.
        //---------------------------------------------------------
        // change the computerName and domain
        // strings below to the full computer name and domain
        // of the remote computer
      
        hres = pLoc->ConnectServer(
            _bstr_t(L"\\\\192.168.1.16\\root\\cimv2"),
            _bstr_t(L"usuario"),                 // User name
            _bstr_t(L"contraseña"),                  // User password
            NULL,                             // Locale            
            NULL,                             // Security flags
            NULL,                             // Authority       
            0,                                // Context object
            &pSvc                             // IWbemServices proxy
            );
        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 6: --------------------------------------------------
        // Set security levels on a WMI connection ------------------

        hres = CoSetProxyBlanket(
           pSvc,                           
           RPC_C_AUTHN_GSS_KERBEROS,
           RPC_C_AUTHN_LEVEL_NONE,
           NULL,
           RPC_C_AUTHN_LEVEL_PKT,  
           RPC_C_IMP_LEVEL_ANONYMOUS,
           0,         
           EOAC_NONE                      
        );

        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 7: --------------------------------------------------
        // Use the IWbemServices pointer to make requests of WMI ----

        // For example, get the name of the operating system
        IEnumWbemClassObject* pEnumerator = NULL;
        hres = pSvc->ExecQuery(
            bstr_t("WQL"),
            bstr_t("SELECT * FROM Win32_OperatingSystem"),
            WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, 
            NULL,
            &pEnumerator);
       
        if (FAILED(hres))
        {
            cout << "Query for operating system name failed."
                << " Error code = 0x"
                << hex << hres << endl;
            pSvc->Release();
            pLoc->Release();
            CoUninitialize();
            return 1;               // Program has failed.
        }

         
        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"Name", 0, &vtProp, 0, 0);
            wcout << " OS Name : " << vtProp.bstrVal << endl;

            VariantClear(&vtProp);

            pclsObj->Release();
            pclsObj = NULL;
        }

        // Cleanup
        // ========
       
        pSvc->Release();
        pLoc->Release();
        pEnumerator->Release();
        pclsObj->Release();
        
        CoUninitialize();

        return 0;   // Program successfully completed.
     
    }

    lunes, 16 de noviembre de 2009 20:51