VC使用WMI獲取活動的網絡卡列表
阿新 • • 發佈:2019-02-09
#include <comutil.h> #include <Wbemidl.h> #include <algorithm> #include <atlconv.h> #include <ntddndis.h> #pragma comment (lib, "comsuppw.lib") #pragma comment (lib, "wbemuuid.lib") int main(void) //主函式,程式的入口 { USES_CONVERSION; HRESULT hres; INT iTotal = 0; // 初始化COM hres = CoInitializeEx( NULL, COINIT_MULTITHREADED ); if( FAILED(hres) ) { return -2; } // 設定COM的安全認證級別 hres = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL ); if( FAILED(hres) ) { CoUninitialize(); return -2; } // 獲得WMI連線COM介面 IWbemLocator *pLoc = NULL; hres = CoCreateInstance( CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<LPVOID*>(&pLoc) ); if( FAILED(hres) ) { CoUninitialize(); return -2; } // 通過連線介面連線WMI的核心物件名"ROOT//CIMV2" IWbemServices *pSvc = NULL; hres = pLoc->ConnectServer( _bstr_t( L"ROOT\\CIMV2" ), NULL, NULL, NULL, 0, NULL, NULL, &pSvc ); if( FAILED(hres) ) { pLoc->Release(); CoUninitialize(); return -2; } // 設定請求代理的安全級別 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(); return -2; } // 通過請求代理來向WMI傳送請求 IEnumWbemClassObject *pEnumerator = NULL; hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t( "SELECT * FROM Win32_NetworkAdapter where NetConnectionStatus =2" ), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator ); if( FAILED(hres) ) { pSvc->Release(); pLoc->Release(); CoUninitialize(); return -3; } // 迴圈列舉所有的結果物件 while( pEnumerator ) { IWbemClassObject *pclsObj = NULL; ULONG uReturn = 0; pEnumerator->Next( WBEM_INFINITE, 1, &pclsObj, &uReturn ); if( uReturn == 0 ) { break; } // 獲取屬性值 VARIANT vtProperty; VariantInit( &vtProperty ); pclsObj->Get( bstr_t("Name"), 0, &vtProperty, NULL, NULL ); printf("%s\n", W2A(vtProperty.bstrVal)); VariantClear( &vtProperty ); pclsObj->Release(); } // End While // 釋放資源 pEnumerator->Release(); pSvc->Release(); pLoc->Release(); CoUninitialize(); return 0; }