zoukankan      html  css  js  c++  java
  • C/C++通过WMI和系统API函数获取获取系统硬件配置信息

    转载:http://www.cnblogs.com/renyuan/archive/2012/12/29/2838716.html

    转载:http://blog.csdn.net/jhqin/article/details/5548656

    转载:http://blog.csdn.net/dongdan_002/article/details/42460343

    头文件WMIInfo.h

     1 /*************************************************************************************************
     2 *
     3 * File Name    : WMIInof.h
     4 *
     5 * Created      : 2016/10/10
     6 *
     7 * Author       : weidongdong
     8 *
     9 * Model        : 
    10 *
    11 * Description  : [[CN]] 获取系统硬件配置信息 [[CN]]                                                  
    12 *
    13 **************************************************************************************************/
    14 #ifndef _WMIINFO_H_
    15 #define _WMIINFO_H_
    16  
    17 #include <WbemIdl.h>  
    18 #pragma comment(lib,"WbemUuid.lib")
    19 
    20 class CWmiInfo
    21 {
    22 public:
    23     CWmiInfo();
    24     ~CWmiInfo();
    25 
    26 public:  
    27     HRESULT InitWmi();    //初始化WMI  
    28     HRESULT ReleaseWmi(); //释放 
    29 
    30     /*获取一个类成员
    31     *@param [in ] ClassName   Example: "Win32_Processor"
    32     *@param [in ] ClassMember Example: "SerialNumber"
    33     *@param [out] chRetValue 
    34     *@param return TRUE success; false fail
    35 
    36     Example:
    37     CString strRetValue; 
    38     GetSingleItemInfo(_T("Win32_Processor"),_T("Caption"),strRetValue); 
    39     */
    40      BOOL GetSingleItemInfo(CString ClassName,CString ClassMember,CString &chRetValue);
    41 
    42      /*获取一个类的多个成员
    43     *@param [in ] ClassName   Example: "Win32_Processor"
    44     *@param [in ] ClassMember Example: "SerialNumber"
    45     *@param [in ] n   成员个数
    46     *@param [out] chRetValue 
    47     *@param return TRUE success; false fail
    48 
    49     Example:
    50     CString strRetValue;CString [] strClassMem = {_T("Caption"),_T("CurrentClockSpeed"),_T("DeviceID"),_T("Manufacturer"),_T("Manufacturer")};
    51     GetGroupItemInfo(_T("Win32_Processor"),strClassMem,5,strRetValue);
    52     */
    53      BOOL GetGroupItemInfo(CString ClassName,CString ClassMember[],int n,CString &chRetValue);
    54 
    55 private:  
    56     void VariantToString(const LPVARIANT,CString &) const;//将Variant类型的变量转换为CString
    57 
    58 private:  
    59     IEnumWbemClassObject* m_pEnumClsObj;  
    60     IWbemClassObject* m_pWbemClsObj;  
    61     IWbemServices* m_pWbemSvc;  
    62     IWbemLocator* m_pWbemLoc;  
    63 };
    64 #endif

    实现文件WMIInfo.cpp

      1 #include "stdafx.h"
      2 #include "WmiInfo.h"  
      3 
      4 CWmiInfo::CWmiInfo(void)  
      5 {  
      6     m_pWbemSvc=NULL;  
      7     m_pWbemLoc=NULL;  
      8     m_pEnumClsObj = NULL;  
      9 }  
     10 
     11 CWmiInfo::~CWmiInfo(void)  
     12 {  
     13     m_pWbemSvc=NULL;  
     14     m_pWbemLoc=NULL;  
     15     m_pEnumClsObj = NULL;  
     16 }  
     17 
     18 HRESULT CWmiInfo::InitWmi()  
     19 {  
     20     HRESULT hr;  
     21 
     22     //一、初始化COM组件  
     23     //初始化COM  
     24     hr=::CoInitializeEx(0,COINIT_MULTITHREADED);  
     25     if (SUCCEEDED(hr) || RPC_E_CHANGED_MODE == hr)  
     26     {  
     27         //设置进程的安全级别,(调用COM组件时在初始化COM之后要调用CoInitializeSecurity设置进程安全级别,否则会被系统识别为病毒)  
     28         hr=CoInitializeSecurity(NULL,  
     29             -1,  
     30             NULL,                     
     31             NULL,  
     32             RPC_C_AUTHN_LEVEL_PKT,  
     33             RPC_C_IMP_LEVEL_IMPERSONATE,  
     34             NULL,  
     35             EOAC_NONE,  
     36             NULL);  
     37         //VERIFY(SUCCEEDED(hr));  
     38 
     39         //二、创建一个WMI命名空间连接  
     40         //创建一个CLSID_WbemLocator对象  
     41         hr=CoCreateInstance(CLSID_WbemLocator,  
     42             0,  
     43             CLSCTX_INPROC_SERVER,  
     44             IID_IWbemLocator,  
     45             (LPVOID*)&m_pWbemLoc);  
     46 //        VERIFY(SUCCEEDED(hr));  
     47 
     48         //使用m_pWbemLoc连接到"rootcimv2"并设置m_pWbemSvc的指针  
     49         hr=m_pWbemLoc->ConnectServer(CComBSTR(L"ROOT\CIMV2"),  
     50             NULL,  
     51             NULL,  
     52             0,  
     53             NULL,  
     54             0,  
     55             0,  
     56             &m_pWbemSvc);  
     57 //        VERIFY(SUCCEEDED(hr));  
     58 
     59         //三、设置WMI连接的安全性  
     60         hr=CoSetProxyBlanket(m_pWbemSvc,  
     61             RPC_C_AUTHN_WINNT,  
     62             RPC_C_AUTHZ_NONE,  
     63             NULL,  
     64             RPC_C_AUTHN_LEVEL_CALL,  
     65             RPC_C_IMP_LEVEL_IMPERSONATE,  
     66             NULL,  
     67             EOAC_NONE);  
     68 //        VERIFY(SUCCEEDED(hr));  
     69 
     70     }  
     71     return(hr);  
     72 }  
     73 
     74 HRESULT CWmiInfo::ReleaseWmi()  
     75 {  
     76     HRESULT hr;  
     77 
     78     if (NULL != m_pWbemSvc)  
     79     {  
     80         hr=m_pWbemSvc->Release();  
     81     }  
     82     if (NULL != m_pWbemLoc)  
     83     {  
     84         hr=m_pWbemLoc->Release();  
     85     }  
     86     if (NULL != m_pEnumClsObj)  
     87     {  
     88         hr=m_pEnumClsObj->Release();  
     89     }  
     90 
     91     ::CoUninitialize();  
     92 
     93     return(hr);  
     94 }  
     95 
     96 BOOL CWmiInfo::GetSingleItemInfo(CString ClassName,CString ClassMember,CString &chRetValue)  
     97 {  
     98     USES_CONVERSION;  
     99 
    100     CComBSTR query("SELECT * FROM ");  
    101     VARIANT vtProp;  
    102     ULONG uReturn;  
    103     HRESULT hr;  
    104     BOOL bRet = FALSE;  
    105 
    106     if (NULL != m_pWbemSvc)  
    107     {  
    108         //查询类ClassName中的所有字段,保存到m_pEnumClsObj中  
    109         query+=CComBSTR(ClassName);  
    110         hr=m_pWbemSvc->ExecQuery(CComBSTR("WQL"),query,WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,  
    111             0,&m_pEnumClsObj);  
    112         if (SUCCEEDED(hr))  
    113         {  
    114             //初始化vtProp值  
    115             VariantInit(&vtProp);  
    116             uReturn=0;  
    117 
    118             //返回从当前位置起的第一个对象到m_pWbemClsObj中  
    119             hr=m_pEnumClsObj->Next(WBEM_INFINITE,1,&m_pWbemClsObj,&uReturn);  
    120             if(SUCCEEDED(hr)&&uReturn>0)   
    121             {  
    122                 //从m_pWbemClsObj中找出ClassMember标识的成员属性值,并保存到vtProp变量中  
    123                 hr=m_pWbemClsObj->Get(CComBSTR(ClassMember),0,&vtProp,0,0);  
    124                 if (SUCCEEDED(hr))  
    125                 {  
    126                     VariantToString(&vtProp,chRetValue);  
    127                     VariantClear(&vtProp);//清空vtProp  
    128                     bRet = TRUE;  
    129                 }  
    130             }  
    131         }  
    132     }  
    133     if(NULL != m_pEnumClsObj)   
    134     {  
    135         hr=m_pEnumClsObj->Release();  
    136         m_pEnumClsObj = NULL;  
    137     }  
    138     if(NULL != m_pWbemClsObj)   
    139     {  
    140         hr=m_pWbemClsObj->Release();  
    141         m_pWbemClsObj = NULL;  
    142     }  
    143     return bRet;  
    144 }  
    145 
    146 BOOL CWmiInfo::GetGroupItemInfo(CString ClassName,CString ClassMember[],int n,CString &chRetValue)  
    147 {  
    148     USES_CONVERSION;  
    149 
    150     CComBSTR query("SELECT * FROM ");  
    151     CString result,info;  
    152     VARIANT vtProp;  
    153     ULONG uReturn;  
    154     HRESULT hr;  
    155     int i;  
    156     BOOL bRet = FALSE;  
    157     if (NULL  != m_pWbemSvc)  
    158     {  
    159         query+=CComBSTR(ClassName);  
    160         hr=m_pWbemSvc->ExecQuery(CComBSTR("WQL"),query,WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY,0,&m_pEnumClsObj);  
    161         if (SUCCEEDED(hr))  
    162         {  
    163             VariantInit(&vtProp); //初始化vtProp变量  
    164             if(m_pEnumClsObj)    
    165             {  
    166                 Sleep(10);  
    167                 uReturn=0;  
    168                 hr=m_pEnumClsObj->Next(WBEM_INFINITE,1,&m_pWbemClsObj,&uReturn);  
    169                 if (SUCCEEDED(hr) &&uReturn>0)  
    170                 {  
    171                     for(i=0;i<n;++i)  
    172                     {  
    173                         hr=m_pWbemClsObj->Get(CComBSTR(ClassMember[i]),0,&vtProp,0,0);  
    174                         if (SUCCEEDED(hr))  
    175                         {  
    176                             VariantToString(&vtProp,info);  
    177                             chRetValue+=info+_T("	");  
    178                             VariantClear(&vtProp);  
    179                             bRet = TRUE;  
    180                         }  
    181                     }  
    182                     chRetValue+=_T("
    ");  
    183                 }  
    184             }  
    185         }  
    186     }  
    187 
    188     if(NULL != m_pEnumClsObj)  
    189     {  
    190         hr=m_pEnumClsObj->Release();  
    191         m_pEnumClsObj=NULL;  
    192     }  
    193     if(NULL != m_pWbemClsObj)  
    194     {  
    195         hr=m_pWbemClsObj->Release();  
    196         m_pWbemClsObj=NULL;  
    197     }  
    198     return bRet;  
    199 }  
    200 
    201 void CWmiInfo::VariantToString(const LPVARIANT pVar,CString &chRetValue) const  
    202 {  
    203     USES_CONVERSION;  
    204 
    205     CComBSTR HUGEP* pBstr;  
    206     BYTE HUGEP* pBuf;  
    207     LONG low,high,i;  
    208     HRESULT hr;  
    209 
    210     switch(pVar->vt)  
    211     {  
    212     case VT_BSTR:  
    213         {  
    214             chRetValue=W2T(pVar->bstrVal);  
    215         }  
    216         break;  
    217     case VT_BOOL:  
    218         {  
    219             if(VARIANT_TRUE==pVar->boolVal)   
    220                 chRetValue="";  
    221             else  
    222                 chRetValue="";  
    223         }  
    224         break;  
    225     case VT_I4:  
    226         {  
    227             chRetValue.Format(_T("%d"),pVar->lVal);  
    228         }  
    229         break;  
    230     case VT_UI1:  
    231         {  
    232             chRetValue.Format(_T("%d"),pVar->bVal);  
    233         }  
    234         break;  
    235     case VT_UI4:  
    236         {  
    237             chRetValue.Format(_T("%d"),pVar->ulVal);  
    238         }  
    239         break;  
    240 
    241     case VT_BSTR|VT_ARRAY:  
    242         {  
    243             hr=SafeArrayAccessData(pVar->parray,(void HUGEP**)&pBstr);  
    244             hr=SafeArrayUnaccessData(pVar->parray);  
    245             chRetValue=W2T(pBstr->m_str);  
    246         }  
    247         break;  
    248 
    249     case VT_I4|VT_ARRAY:  
    250         {  
    251             SafeArrayGetLBound(pVar->parray,1,&low);   
    252             SafeArrayGetUBound(pVar->parray,1,&high);  
    253 
    254             hr=SafeArrayAccessData(pVar->parray,(void HUGEP**)&pBuf);  
    255             hr=SafeArrayUnaccessData(pVar->parray);  
    256             CString strTmp;  
    257             high=min(high,MAX_PATH*2-1);  
    258             for(i=low;i<=high;++i)  
    259             {  
    260                 strTmp.Format(_T("%02X"),pBuf[i]);  
    261                 chRetValue+=strTmp;  
    262             }  
    263         }  
    264         break;  
    265     default:  
    266         break;  
    267     }  
    268 }

    调用

     1 #include "stdafx.h"
     2 #include <iostream>
     3 #include "WMIInfo.h"
     4 
     5 int main()
     6 {
     7     CWmiInfo WMI;
     8     WMI.InitWmi();
     9 
    10     // 网卡原生MAC地址
    11     CString strNetwork;
    12     WMI.GetSingleItemInfo(L"Win32_NetworkAdapter WHERE (MACAddress IS NOT NULL) AND (NOT (PNPDeviceID LIKE 'ROOT%'))",L"PNPDeviceID",strNetwork);
    13     if (!strNetwork.IsEmpty())
    14     {
    15         wcout << "网卡原生MAC地址: "<< strNetwork.GetBuffer() << endl;
    16     }
    17     
    18     // 硬盘序列号
    19     CString strDiskDrive;
    20     WMI.GetSingleItemInfo(L"Win32_DiskDrive WHERE (SerialNumber IS NOT NULL) AND (MediaType LIKE 'Fixed hard disk%')",L"SerialNumber",strDiskDrive);
    21 
    22     if (!strDiskDrive.IsEmpty())
    23     {
    24     wcout << "硬盘序列号 : " << strDiskDrive.GetBuffer() << endl;
    25     }
    26 
    27     // 主板序列号 
    28     CString strBaseBoard;
    29     WMI.GetSingleItemInfo(L"Win32_BaseBoard WHERE (SerialNumber IS NOT NULL)",L"SerialNumber",strBaseBoard);
    30 
    31     if (!strBaseBoard.IsEmpty())
    32     {
    33         wcout << "主板序列号 : " << strBaseBoard.GetBuffer() << endl;
    34     }
    35 
    36     // 处理器ID  
    37     CString strProcessorID;
    38     WMI.GetSingleItemInfo(L"Win32_Processor WHERE (ProcessorId IS NOT NULL)",L"ProcessorId",strProcessorID);
    39 
    40     if (!strProcessorID.IsEmpty())
    41     {
    42         wcout << "处理器ID : " << strProcessorID.GetBuffer() << endl;
    43     }
    44 
    45     // BIOS序列号
    46     CString strBIOS;
    47     WMI.GetSingleItemInfo(L"Win32_BIOS WHERE (SerialNumber IS NOT NULL)",L"SerialNumber",strBIOS);
    48 
    49     if (!strBIOS.IsEmpty())
    50     {
    51         wcout << "BIOS序列号 : " << strBIOS.GetBuffer() << endl;
    52     }
    53 
    54     // 主板型号
    55     CString strBaseBoardType;
    56     WMI.GetSingleItemInfo(L"Win32_BaseBoard WHERE (Product IS NOT NULL)",L"Product",strBaseBoardType);
    57 
    58     if (!strBaseBoardType.IsEmpty())
    59     {
    60         wcout << "主板型号 : " << strBaseBoardType.GetBuffer() << endl;
    61     }
    62 
    63     // 网卡当前MAC地址
    64     CString strCurrentNetwork;
    65     WMI.GetSingleItemInfo(L"Win32_NetworkAdapter WHERE (MACAddress IS NOT NULL) AND (NOT (PNPDeviceID LIKE 'ROOT%'))",L"MACAddress",strCurrentNetwork);
    66 
    67     if (!strCurrentNetwork.IsEmpty())
    68     {
    69         wcout << "网卡当前MAC地址: " << strCurrentNetwork.GetBuffer() << endl;
    70     }
    71     WMI.ReleaseWmi();
    72 
    73     getchar();
    74     return 0;
    75 }
  • 相关阅读:
    OCP-1Z0-053-V12.02-622题
    OCP-1Z0-053-V12.02-501题
    Flex实现查询和重置
    闪回事务处理回退
    闪回数据归档测试
    闪回数据归档
    OCP-1Z0-053-V12.02-166题
    VC-摄像头控制SDK源码
    MFC 的 Picture Control 加载 BMP/PNG 图片的方法
    OCP-1Z0-051-V9.02-25题
  • 原文地址:https://www.cnblogs.com/chechen/p/5946752.html
Copyright © 2011-2022 走看看