首页 > 代码库 > C/C++通过WMI和系统API函数获取获取系统硬件配置信息
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 CWmiInfo21 {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 fail35 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 fail48 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类型的变量转换为CString57 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=http://www.mamicode.com/W2T(pVar->bstrVal); 215 } 216 break; 217 case VT_BOOL: 218 { 219 if(VARIANT_TRUE==pVar->boolVal) 220 chRetValue=http://www.mamicode.com/"是"; 221 else 222 chRetValue=http://www.mamicode.com/"否"; 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=http://www.mamicode.com/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 }
C/C++通过WMI和系统API函数获取获取系统硬件配置信息
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。