2016-11-21 5 views
0

Я пытаюсь получить скорость и IP-адрес, связанные с каждым сетевым адаптером. Я использовал Win32_NetworkAdapter и Win32_NetworkAdapterConfiguration, но в соответствии с MDSN этот класс устарел и они внедрили msft_netadapter. Когда я пытаюсь использовать этот класс, я получаю 0 в следующем заявлении:Получите скорость и IP-адрес сетевого адаптера, используя msft_netadapter

HRESULT ч = pEnumerator-> Далее (WBEM_INFINITE, 1, & pclsObj, & uReturn);

Ниже приведен код для справки:

HRESULT hres; 

VARIANT activeAdapterGuid; 
activeAdapterGuid.bstrVal = _T(""); 
bool COMIsLoaded = false; 

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

HRESULT hr = CoInitialize(NULL); 
if (FAILED(hr)) 

{ 
    if (hr != RPC_E_CHANGED_MODE) 
    { 
     Utility::PrintFormatMessage(DebugMessageLevel::DBG_MSG_ERROR, GetLastError(), L"Failed to Initilize COM for getting the adapter information - WMI"); 
    } 
} 
else 
{ 
    COMIsLoaded = true; 
} 
if (!COMIsLoaded) 
{ 
    hres = CoInitializeEx(0, COINIT_MULTITHREADED); 
    if (FAILED(hres)) 
    { 
     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)) 
    { 
     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)) 
{ 
    CoUninitialize(); 
    return 1;     // Program has failed. 
} 

// 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 (for example, Kerberos) 
    0,      // Context object 
    &pSvc     // pointer to IWbemServices proxy 
); 

if (FAILED(hres)) 
{ 
    pLoc->Release(); 
    CoUninitialize(); 
    return 1;    // Program has failed. 
} 

// 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 
); 

if (FAILED(hres)) 
{ 
    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_NetworkAdapter"), 
    WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
    NULL, 
    &pEnumerator); 

if (FAILED(hres)) 
{ 
    pSvc->Release(); 
    pLoc->Release(); 
    CoUninitialize(); 
    return 1;    // Program has failed. 
} 

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

IWbemClassObject *pclsObj = NULL; 
ULONG uReturn = 0; 

while (pEnumerator) 
{ 

    NetworkAdapterDefinition networkAdapterDefinition; 

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

    if (0 == uReturn) 
    { 
     break; 
    } 

    VARIANT vtProp; 

    hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0); 
    if (vtProp.bstrVal != NULL) 
    { 
     networkAdapterDefinition.m_strName =vtProp.bstrVal; 
    } 
    else 
    { 
     continue; 
    } 

    VariantClear(&vtProp); 
    VariantChangeType(&vtProp, &vtProp, 0, VT_BSTR); 
    hr = pclsObj->Get(L"Speed", 0, &vtProp, 0, 0); 
    if (vtProp.bstrVal != NULL) 
    { 
     networkAdapterDefinition.m_speed = _wtoi(vtProp.bstrVal); 
    } 
    else 
    { 
     continue; 
    } 
    VariantClear(&vtProp); 
    VARIANT vtPropConnection; 
    VariantChangeType(&vtPropConnection, &vtPropConnection, 0, VT_UI2); 
    hr = pclsObj->Get(L"NetConnectionStatus", 0, &vtPropConnection, 0, 0); 
    if (vtPropConnection.uiVal != NULL) 
    { 
     VARIANT vtProp1; 
     hr = pclsObj->Get(L"GUID", 0, &vtProp1, 0, 0); 
     activeAdapterGuid.bstrVal = vtProp1.bstrVal; 
    } 
    else 
    { 
     continue; 
    } 

    IEnumWbemClassObject* pEnumerator = NULL; 
    hres = pSvc->ExecQuery(
     bstr_t("WQL"), 
     bstr_t("SELECT * FROM Win32_NetworkAdapterConfiguration"), 
     WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
     NULL, 
     &pEnumerator); 

    if (FAILED(hres)) 
    { 
     pSvc->Release(); 
     pLoc->Release(); 
     CoUninitialize(); 
     return 1;    // Program has failed. 
    } 

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

    IWbemClassObject *pclsObj = NULL; 
    ULONG uReturn = 0; 

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

     if (0 == uReturn) 
     { 
      break; 
     } 

     VariantClear(&vtProp); 
     VARIANT vtPropConfig; 

     hr = pclsObj->Get(L"SettingID", 0, &vtPropConfig, 0, 0); 
     if (vtPropConfig.bstrVal != NULL) 
     { 
      //wcout << " Guid of the Adapter: " << vtPropConfig.bstrVal << endl; 
      if (wcscmp(vtPropConfig.bstrVal, activeAdapterGuid.bstrVal) == 0) 
      { 
       BSTR *pbstr = NULL; 
       _variant_t ipAddress; 
       hres = pclsObj->Get(L"IPAddress", 0, &ipAddress, NULL, NULL); 
       if (ipAddress.parray == NULL) 
       { 
        continue; 
       } 
       LONG lstart, lend; 
       LONG idx = -1; 
       HRESULT hr; 
       SAFEARRAY *sa = V_ARRAY(&ipAddress); 

       // Get the lower and upper bound 
       hr = SafeArrayGetLBound(sa, 1, &lstart); 
       if (FAILED(hr)) return hr; 
       hr = SafeArrayGetUBound(sa, 1, &lend); 
       if (FAILED(hr)) return hr; 

       // loop 
       hr = SafeArrayAccessData(sa, (void HUGEP**)&pbstr); 
       if (SUCCEEDED(hr)) 
       { 
        for (idx = lstart; idx < lend; idx++) 
        { 
         BSTR bstrIpAddress; 
         bstrIpAddress = pbstr[idx]; 
         std::string ipAddress = _bstr_t(bstrIpAddress, false); 
         networkAdapterDefinition.m_ipAddressList.push_back(ipAddress); 
        } 
        std::string adapterGUID = _bstr_t(activeAdapterGuid.bstrVal, false); 
        m_AdapterDefinition[adapterGUID] = networkAdapterDefinition; 

        hr = SafeArrayUnaccessData(sa); 
        if (FAILED(hr)) return hr; 
       } 
      } 
     } 
    } 
} 


// Cleanup 
// ======== 
pSvc->Release(); 
pLoc->Release(); 
pEnumerator->Release(); 
CoUninitialize(); 
return S_OK; 
+0

Посмотрите здесь: HTTPS://stackoverflow.com/questions/21915461/using-wmi-in-c-to-obtain-the-interfaceindex-of-an-adapter – Isometriq

ответ