C++ WMI获取系统硬件信息(CPU/DISK/NetWork etc)

官网找到一个例子,根据例子修改下可以获取很多信息

 

#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类:

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程序

MSDN官网关于WMI定义的所有类信息

 

PS:过两天我会把我修改的程序传上来,实现了 CPU编号、序列号、型号; 硬盘序列号;网卡MAC地址、IP地址、当前状态,这些信息的获取。

posted @ 2019-04-26 16:39  乘于时  阅读(3145)  评论(0编辑  收藏  举报