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       : 
 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连接到"root\cimv2"并设置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("\t");  
178                             VariantClear(&vtProp);  
179                             bRet = TRUE;  
180                         }  
181                     }  
182                     chRetValue+=_T("\r\n");  
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 }

原文链接: https://www.cnblogs.com/chechen/p/5946752.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/241838

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午9:56
下一篇 2023年2月13日 下午9:56

相关推荐