zoukankan      html  css  js  c++  java
  • 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 rootcimv2 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地址、当前状态,这些信息的获取。

  • 相关阅读:
    Eventbus的功能
    Linux下xz与tar的区别
    IntelliJ IDEA出现:This file is indented with tabs instead of 4 spaces的问题解决
    IntelliJ IDEA设置properties文件显示中文
    oh-my-zsh官方教程
    Vim出现:_arguments:450: _vim_files: function definition file not found的问题解决
    Ubuntu 16.04下安装zsh和oh-my-zsh
    zsh与oh-my-zsh是什么
    Mac安装IntelliJ IDEA时快捷键冲突设置
    IntelliJ IDEA删除项目
  • 原文地址:https://www.cnblogs.com/hjbf/p/10775112.html
Copyright © 2011-2022 走看看