官網找到一個例子,根據例子修改下能夠獲取不少信息ios
#define _WIN32_DCOM #include <iostream> using namespace std; #include <comdef.h> #include <Wbemidl.h> #pragma comment(lib, "wbemuuid.lib") int 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 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)) { 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 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)) { 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_OperatingSystem"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 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. } // 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; } 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(); } // Cleanup // ======== pSvc->Release(); pLoc->Release(); pEnumerator->Release(); CoUninitialize(); return 0; // Program successfully completed. }
下面列出了經常使用信息的WMI類:windows
Win32_Processor //CPU 處理器 Win32_PhysicalMemory // 物理內存 Win32_Keyboard // 鍵盤 Win32_PointingDevice // 點輸入設備,如鼠標 Win32_DiskDrive // 硬盤驅動器 Win32_CDROMDrive // 光盤驅動器 Win32_BaseBoard // 主板 Win32_BIOS //BIOS 芯片 Win32_ParallelPort // 並口 Win32_SerialPort // 串口 Win32_SoundDevice // 多媒體設置 Win32_USBController //USB 控制器 Win32_NetworkAdapter // 網絡適配器 Win32_NetworkAdapterConfiguration // 網絡適配器設置 Win32_Printer // 打印機 Win32_PrinterConfiguration // 打印機設置 Win32_PrintJob // 打印機任務 Win32_TCPIPPrinterPort // 打印機端口 Win32_POTSModem //MODEM Win32_POTSModemToSerialPort //MODEM 端口 Win32_DesktopMonitor // 顯示器 Win32_VideoController // 顯卡細節。 Win32_VideoSettings // 顯卡支持的顯示模式。 Win32_TimeZone // 時區 Win32_SystemDriver // 驅動程序 Win32_DiskPartition // 磁盤分區 Win32_LogicalDisk // 邏輯磁盤 Win32_LogicalMemoryConfiguration // 邏輯內存配置 Win32_PageFile // 系統頁文件信息 Win32_PageFileSetting // 頁文件設置 Win32_BootConfiguration // 系統啓動配置 Win32_OperatingSystem // 操做系統信息 Win32_StartupCommand // 系統自動啓動程序 Win32_Service // 系統安裝的服務 Win32_Group // 系統管理組 Win32_GroupUser // 系統組賬號 Win32_UserAccount // 用戶賬號 Win32_Process // 系統進程 Win32_Thread // 系統線程 Win32_Share // 共享 Win32_NetworkClient // 已安裝的網絡客戶端 Win32_NetworkProtocol // 已安裝的網絡協議
MSDN官網關於WMI的demo程序網絡
PS:過兩天我會把我修改的程序傳上來,實現了 CPU編號、序列號、型號; 硬盤序列號;網卡MAC地址、IP地址、當前狀態,這些信息的獲取。ui