博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++通过WMI和系统API函数获取获取系统硬件配置信息
阅读量:4471 次
发布时间:2019-06-08

本文共 12154 字,大约阅读时间需要 40 分钟。

转载:

转载:

转载:

头文件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 
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
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 
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

你可能感兴趣的文章
《C程序设计语言》笔记 (八) UNIX系统接口
查看>>
git常用命令
查看>>
Android必知必会-获取视频文件的截图、缩略图
查看>>
(转)理解Bitblt、StretchBlt与SetDIBitsToDevice、StretchDibits
查看>>
python之路-基础篇-第七周
查看>>
ViurtualBox配置虚拟机Linux的网络环境
查看>>
VLC 媒体播放器
查看>>
勿忘国耻2018/09/18
查看>>
Jenkins部署码云SpringBoot项目
查看>>
多标签分类(multi-label classification)综述
查看>>
史上最全面的Spring-Boot-Cache使用与整合
查看>>
图的遍历(深度优先与广度优先搜索两种方案)
查看>>
快速读入模板
查看>>
impdp报错: ORA-39064: 无法写入日志文件 ORA-29285: 文件写入错误
查看>>
\n ^ \t的使用
查看>>
css盒模型
查看>>
探索式测试:测试自动化
查看>>
用 UIWebView 代替 UITextView,解决行间距问题
查看>>
npm和Node.js简介
查看>>
Spring AOP无法拦截Controller的原因
查看>>