2011-07-04 3 views
0

Windows 7을 사용하고 있으며 이제 WMI를 사용하여 프로그램을 개발하고 싶습니다.WMI 네임 스페이스에 연결하는 중 오류 0x8004100e

MSDN을 읽고이 예제 코드를 발견했습니다.

#include "stdafx.h" 
#define _WIN32_DCOM 
#include <iostream> 
using namespace std; 
#include <comdef.h> 
#include <Wbemidl.h> 
#include <conio.h> 


# pragma comment(lib, "wbemuuid.lib") 

BOOL ManageWMI(); 
int main(int argc, char* argv[]) 
{ 
    if(ManageWMI()) printf("%WMI Error!"); 
_getch(); 
return 0; 
} 

BOOL ManageWMI() 
{ 
    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. 
    } 
    cout << "step 1" << endl; 
    // Step 2: -------------------------------------------------- 
    // Set general COM security levels -------------------------- 
    // Note: If you are using Windows 2000, you need to 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 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. 
    } 

    cout << "step 2 " << endl; 
    // 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. 
    } 
    cout << "step 3" << endl; 
    // Step 4: ----------------------------------------------------- 
    // Connect to WMI through the IWbemLocator::ConnectServer method 

    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"), // 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 (e.g. Kerberos) 
     0,      // Context object 
     &pSvc     // pointer to IWbemServices proxy 
     ); 

    if (FAILED(hres)) 
    { 
     cout << "Could not connect. Error code = 0x" 
      << hex << hres << endl; 
     pLoc->Release();  
     cout << "released!!" << endl; 
     CoUninitialize(); 
     cout << "counitialized !!" << endl; 
     return 1;    // Program has failed. 
    } 
    cout<< "step 4" << endl; 
    cout << "Connected to ROOT//CIMV2 WMI namespace" << endl; 


    // Step 5: -------------------------------------------------- 
    // Set security levels on 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 
    ); 
    cout << "step 5" << endl; 
    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 ---- 

    // For example, get the name of the operating system 
    IEnumWbemClassObject* pEnumerator = NULL; 
    hres = pSvc->ExecQuery(
     bstr_t("WQL"), 
     bstr_t("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = ''TRUE''"), 
     WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
     NULL, 
     &pEnumerator); 

    if (FAILED(hres)) 
    { 
     cout << "Query for Network Adapter Configuration failed." 
      << " Error code = 0x" 
      << hex << hres << endl; 
     pSvc->Release(); 
     pLoc->Release(); 
     CoUninitialize(); 
     return 1;    // Program has failed. 
    } 

    // Step 7: ------------------------------------------------- 
    // Get the data from the query in step 6 ------------------- 

    IWbemClassObject *pclsObj; 
    ULONG uReturn = 0; 

    while (pEnumerator) 
    { 
     HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, 
      &pclsObj, &uReturn); 

     if(0 == uReturn) 
     { 
      break; 
     } 

     VARIANT vtProp; 
    VariantInit(&vtProp); 


    //hr = pclsObj->Get(L"IPSubnet", 0, &vtProp, 0, 0); 
     // Get the value of the Enable property 
    hr = pclsObj->Get(L"IPEnabled", 0, &vtProp, 0, 0); 
     // Get the value of the MacAddress property 
    if(vtProp.boolVal) 
    { 
    hr = pclsObj->Get(L"MacAddress", 0, &vtProp, 0, 0); 
    wcout << " MacAddress : " << vtProp.bstrVal << endl; 
    } 

    hr = pclsObj->Get(L"IPEnabled", 0, &vtProp, 0, 0); 
    if(vtProp.boolVal) 
    { 
    LONG lstart, lend; 
    LONG idx = -1; 
    BSTR* pbstr; 
    SAFEARRAY *sa; 
    hr = pclsObj->Get(L"Description", 0, &vtProp, 0, 0); 
    if(!FAILED(hr)) 
    { 
    wcout << "Description: " << vtProp.bstrVal << endl; 
    } 
    hr = pclsObj->Get(L"DNSHostName", 0, &vtProp, 0, 0); 
    if(!FAILED(hr)) 
    { 
    cout << "DNS:" << vtProp.bstrVal << endl; 
    } 
    hr = pclsObj->Get(L"IPAddress", 0, &vtProp, 0, 0); 
    if(!FAILED(hr)) 
    { 
    SAFEARRAY *psa = vtProp.parray; 
    cout << "IP Address::" << psa << endl; 
    } 
    } 


     VariantClear(&vtProp); 
    } 

    // Cleanup 
    // ======== 

    pSvc->Release(); 
    pLoc->Release(); 
    pEnumerator->Release(); 
    pclsObj->Release(); 
    CoUninitialize(); 

    return 0; // Program successfully completed. 

} 

그러나이 코드는 내 컴퓨터에서 작동하지 않습니다.

"step4"에서 오류 코드 0x8004100e으로 실패했습니다. Google 검색 및 WMI 서비스를 다시 시작했지만 작동하지 않습니다.

누구나 동일한 경험을하고 그것을 해결 했습니까? 희망을 좀주세요. 덕분에 ... 당신은 ROOT//CIMV2 네임 스페이스에 대해 잘못된 구문을 사용하는

답변

1

Btw는 0x8004100E 값이 WBEM_E_INVALID_NAMESPACE 코드입니다 ROOT\\CIMV2

hres = pLoc->ConnectServer(
    _bstr_t(L"ROOT\\CIMV2"), // 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 (e.g. Kerberos) 
    0,      // Context object 
    &pSvc     // pointer to IWbemServices proxy 
    ); 

로 변경 시도 (찾을 수 없습니다 지정된 네임 스페이스.) 오류가 발생했습니다.

+0

작동합니다! 많이 ~~ – summer

관련 문제