VC里实现WMI编程:获取网络信息1(VC已调试过了)
2009年01月08日 星期四 18:51
//---------------------------------------------------------------------------
// 使用WMI获取硬件消息 #define _WIN32_DCOM //#include <objbase.h> #include <comdef.h> #include <Wbemidl.h> //#include <conio.h> # pragma comment(lib, "wbemuuid.lib") //--------------------------------------------------------------------------- static char *wc2mb( const wchar_t *pSrc ) { char *rval ; int iSize ; if ( NULL == pSrc ){ return NULL ; } // 计算,返回值的领域要多少 iSize = WideCharToMultiByte( CP_ACP, 0, pSrc, -1, // 自动计算源字符串的长短 NULL, // 现在估计出力领域的大小,所以指定 NULL 0, // 现在估计出力领域的大小,所以指定 0 NULL, NULL ); // 确保领域 rval = (char *)malloc( iSize ); if ( NULL != rval ){ // 执行字套种类变换 iSize = WideCharToMultiByte( CP_ACP, 0, pSrc, -1, // 自动计算源字符串的长短 rval, iSize, NULL, NULL ); } return rval ; } BOOL ManageWMI(char *str) { HRESULT hres; char szTmp[40960]; // Step 1: -------------------------------------------------- // Initialize COM. ------------------------------------------ hres = CoInitializeEx(NULL, COINIT_MULTITHREADED); if (FAILED(hres)) { sprintf(str,"Failed to initialize COM library. Error code = 0x%X/r/n",hres); return 1; // Program has failed. } // 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)) { sprintf(str,"Failed to initialize security. Error code = 0x%X/r/n",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)) { sprintf(str,"Failed to create IWbemLocator object. Err code = 0x%X/r/n",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 (e.g. Kerberos) 0, // Context object &pSvc // pointer to IWbemServices proxy ); if (FAILED(hres)) { sprintf(str,"Could not connect. Error code = 0x%X/r/n",hres); pLoc->Release(); CoUninitialize(); return 1; // Program has failed. } sprintf(str,"Connected to ROOT//CIMV2 WMI namespace"); // 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)) { sprintf(str,"Could not set proxy blanket. Error code = 0x%X/r/n",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; IWbemClassObject *pclsObj; ULONG uReturn = 0; /*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)) { sprintf(str,"Query for Network Adapter Configuration failed. Error code = 0x%X/r/n", hres); pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; // Program has failed. } // Step 7: ------------------------------------------------- // Get the data from the query in step 6 ------------------- 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); sprintf(szTmp," MacAddress : %s/r/n" ,wc2mb(vtProp.bstrVal)); strcat(str,szTmp); } 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)) { sprintf(szTmp,"Description: %s/r/n",wc2mb(vtProp.bstrVal)); strcat(str,szTmp); } hr = pclsObj->Get(L"DNSHostName", 0, &vtProp, 0, 0); if(!FAILED(hr)) { sprintf(szTmp,"DNS:%s/r/n",wc2mb(vtProp.bstrVal)); strcat(str,szTmp); } hr = pclsObj->Get(L"IPAddress", 0, &vtProp, 0, 0); if(!FAILED(hr)) { SAFEARRAY *psa = vtProp.parray; void **p = (void **)psa->pvData; wchar_t *wstr = (unsigned short *)*p; sprintf(szTmp,"IP Address::%s/r/n", wc2mb(wstr)); strcat(str,szTmp); } } VariantClear(&vtProp); }*/ // get baseboard's infomation hres = pSvc->ExecQuery( bstr_t("WQL"), bstr_t("SELECT * FROM Win32_BaseBoard"),// WHERE IPEnabled = 'TRUE'"), /*WBEM_FLAG_FORWARD_ONLY | */WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hres)) { sprintf(str,"Query for BaseBoard's infomation failed. Error code = 0x%X/r/n", hres); pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; // Program has failed. } 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"Caption", 0, &vtProp, 0, 0); sprintf(szTmp," Caption : %s/r/n" ,wc2mb(vtProp.bstrVal)); strcat(str,szTmp); } } // Cleanup // ======== pSvc->Release(); pLoc->Release(); pEnumerator->Release(); pclsObj->Release(); CoUninitialize(); return 0; // Program successfully completed. } WMI 可以访问的信息类型有: Win32_1394Controller Win32_BaseBoard Win32_Battery Win32_BIOS Win32_Bus Win32_CacheMemory Win32_CDROMDrive Win32_CurrentProbe Win32_DesktopMonitor Win32_DeviceMemoryAddress Win32_DiskDrive Win32_DisplayConfiguration Win32_DisplayControllerConfiguration Win32_DMAChannel Win32_Fan Win32_FloppyController Win32_FloppyDrive Win32_HeatPipe Win32_IDEController Win32_InfraredDevice Win32_IRQResource Win32_Keyboard Win32_MemoryArray Win32_MemoryDevice Win32_MotherboardDevice Win32_NetworkAdapter Win32_NetworkAdapterConfiguration Win32_OnBoardDevice Win32_ParallelPort Win32_PCMCIAController Win32_PhysicalMemory Win32_PhysicalMemoryArray Win32_PnPEntity Win32_PointingDevice Win32_PortableBattery Win32_PortConnector Win32_PortResource Win32_POTSModem Win32_PowerManagementEvent Win32_Printer Win32_PrinterConfiguration Win32_PrintJob Win32_Processor Win32_Refrigeration Win32_SerialPort Win32_SerialPortConfiguration Win32_SMBIOSMemory Win32_SoundDevice Win32_SystemEnclosure Win32_SystemMemoryResource Win32_SystemSlot Win32_TapeDrive Win32_TemperatureProbe Win32_UninterruptiblePowerSupply Win32_USBController Win32_VideoConfiguration Win32_VideoController Win32_VoltageProbe |