使用WMI编程获取主机硬件信息(续)
在之前的随笔http://www.cnblogs.com/annie-fun/p/6393149.html中,存在一些问题。本篇随笔是为了纠正之前随笔中的问题而写的。
代码改进之处有两点:
第一、某一次WMI查询失败后,继续执行查询下一个字段,而不是直接返回;
第二、采用GetAdaptersInfo()函数查询有线物理网卡的mac地址。
话不多说,直接看代码~.~
头文件UserInfo.h:
1 #pragma once 2 #include "stdafx.h" 3 #define _WIN32_DCOM 4 #include <comdef.h> 5 #include <Wbemidl.h> 6 # pragma comment(lib, "wbemuuid.lib") 7 #include <iphlpapi.h> 8 #pragma comment(lib, "IPHLPAPI.lib") 9 #include <stdio.h> 10 #include <windows.h> 11 using namespace std; 12 13 typedef struct UserInfo_t 14 { 15 char CpuID[20]; //CPU序列号 16 char BaseBoardID[256]; //主板ID 17 char SystemDiskID[256]; //系统所在硬盘的序列号 18 char BIOSID[20]; //BIOS序列号 19 char MacAddress[20]; //MAC地址 20 }UserInfo; 21 22 int GetUserInfo(UserInfo &info);
View Code
源代码GetUerInfo.cpp:
1 #include "UserInfo.h" 2 3 void Trims(char* data) //去掉字符串中的空格 4 { 5 int i=-1,j=0; 6 int ch = ' '; 7 8 while(data[++i] != '\0') 9 { 10 if(data[i] != ch) 11 { 12 data[j++] = data[i]; 13 } 14 } 15 data[j] = '\0'; 16 } 17 18 int GetUserInfo(UserInfo &info) 19 { 20 HRESULT hres; 21 memset(&info,0x00,sizeof(UserInfo)); 22 23 CoUninitialize(); 24 hres = CoInitializeEx(0, COINIT_MULTITHREADED); //第二个参数设置当前线程的并发模式为多线程 25 //hres = CoInitializeEx(0,COINIT_APARTMENTTHREADED); //并发模式为单线程(即只能在单线程函数中调用GetUserInfo()) 26 if (FAILED(hres)) 27 { 28 return -1; 29 } 30 hres = CoInitializeSecurity( 31 NULL, 32 -1, 33 NULL, 34 NULL, 35 RPC_C_AUTHN_LEVEL_DEFAULT, 36 RPC_C_IMP_LEVEL_IMPERSONATE, 37 NULL, 38 EOAC_NONE, 39 NULL 40 ); 41 if (FAILED(hres)) 42 { 43 CoUninitialize(); 44 return -2; 45 } 46 IWbemLocator *pLoc = NULL; 47 hres = CoCreateInstance( 48 CLSID_WbemLocator, 49 0, 50 CLSCTX_INPROC_SERVER, 51 IID_IWbemLocator, (LPVOID *) &pLoc); 52 if (FAILED(hres)) 53 { 54 CoUninitialize(); 55 return -3; 56 } 57 IWbemServices *pSvc = NULL; 58 hres = pLoc->ConnectServer( 59 _bstr_t(L"ROOT\\CIMV2"), 60 NULL, 61 NULL, 62 0, 63 NULL, 64 0, 65 0, 66 &pSvc 67 ); 68 if (FAILED(hres)) 69 { 70 pLoc->Release(); 71 CoUninitialize(); 72 return -4; 73 } 74 hres = CoSetProxyBlanket( 75 pSvc, 76 RPC_C_AUTHN_WINNT, 77 RPC_C_AUTHZ_NONE, 78 NULL, 79 RPC_C_AUTHN_LEVEL_CALL, 80 RPC_C_IMP_LEVEL_IMPERSONATE, 81 NULL, 82 EOAC_NONE 83 ); 84 if (FAILED(hres)) 85 { 86 pSvc->Release(); 87 pLoc->Release(); 88 CoUninitialize(); 89 return -5; 90 } 91 92 IEnumWbemClassObject* pEnumerator = NULL; 93 IWbemClassObject *pclsObj; 94 ULONG uReturn = 0; 95 //获取CPUID 96 hres = pSvc->ExecQuery( 97 bstr_t("WQL"), 98 bstr_t("SELECT * FROM win32_Processor"), 99 WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 100 NULL, 101 &pEnumerator); 102 if ( !FAILED(hres)) 103 { 104 while (pEnumerator) 105 { 106 HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); 107 if(0 == uReturn) 108 { 109 break; 110 } 111 VARIANT vtProp; 112 hr = pclsObj->Get(L"ProcessorId", 0, &vtProp, 0, 0); 113 wcstombs(info.CpuID,vtProp.bstrVal,20); 114 VariantClear(&vtProp); 115 pclsObj->Release(); 116 } 117 } 118 119 //获取主板序列号---在某些电脑上获取不到,则UserInfo结构体中该字段为空 120 pEnumerator->Release(); 121 pEnumerator=NULL; 122 hres = pSvc->ExecQuery( 123 bstr_t("WQL"), 124 bstr_t("SELECT * FROM Win32_BaseBoard"), 125 WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 126 NULL, 127 &pEnumerator); 128 if (!FAILED(hres)) 129 { 130 while (pEnumerator) 131 { 132 HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); 133 if(0 == uReturn) 134 { 135 break; 136 } 137 VARIANT vtProp; 138 hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0); 139 wcstombs(info.BaseBoardID,vtProp.bstrVal,256); 140 VariantClear(&vtProp); 141 pclsObj->Release(); 142 } 143 } 144 145 //获取系统所在硬盘的索引号 146 int diskIndex = 0; 147 pEnumerator->Release(); 148 pEnumerator=NULL; 149 hres = pSvc->ExecQuery( 150 bstr_t("WQL"), 151 bstr_t("SELECT * FROM Win32_DiskPartition WHERE Bootable = TRUE"), //查找启动盘 152 WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 153 NULL, 154 &pEnumerator); 155 if (!FAILED(hres)) 156 { 157 while (pEnumerator) 158 { 159 HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); 160 if(0 == uReturn) 161 { 162 break; 163 } 164 VARIANT vtProp; 165 hr = pclsObj->Get(L"DiskIndex", 0, &vtProp, 0, 0); 166 diskIndex = vtProp.intVal; 167 VariantClear(&vtProp); 168 pclsObj->Release(); 169 } 170 171 //根据系统所在硬盘的索引号查询硬盘序列号 172 char index[10]; 173 string strQuery = "SELECT * FROM Win32_DiskDrive WHERE Index = "; 174 itoa(diskIndex,index,10); 175 string indexStr(index); 176 strQuery += indexStr; 177 pEnumerator->Release(); 178 pEnumerator=NULL; 179 hres = pSvc->ExecQuery( 180 bstr_t("WQL"), 181 bstr_t(strQuery.c_str()), 182 WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 183 NULL, 184 &pEnumerator); 185 if (!FAILED(hres)) 186 { 187 while (pEnumerator) 188 { 189 HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); 190 if(0 == uReturn) 191 { 192 break; 193 } 194 VARIANT vtProp; 195 hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0); 196 wcstombs(info.SystemDiskID,vtProp.bstrVal,256); 197 Trims(info.SystemDiskID); 198 VariantClear(&vtProp); 199 pclsObj->Release(); 200 } 201 } 202 } 203 204 //获取BIOS序列号 205 pEnumerator->Release(); 206 pEnumerator=NULL; 207 hres = pSvc->ExecQuery( 208 bstr_t("WQL"), 209 bstr_t("SELECT * FROM Win32_BIOS"), 210 WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 211 NULL, 212 &pEnumerator); 213 if (!FAILED(hres)) 214 { 215 while (pEnumerator) 216 { 217 HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); 218 if(0 == uReturn) 219 { 220 break; 221 } 222 VARIANT vtProp; 223 hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0); 224 wcstombs(info.BIOSID,vtProp.bstrVal,20); 225 VariantClear(&vtProp); 226 pclsObj->Release(); 227 } 228 } 229 230 //使用GetAdaptersInfo()函数获得网卡信息,从而获取本地连接的MAC地址 231 ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO); 232 PIP_ADAPTER_INFO pAdapterInfo = (IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO)); 233 if(pAdapterInfo == NULL) 234 return -1; 235 if(GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) 236 { 237 free(pAdapterInfo); 238 pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen); 239 if (pAdapterInfo == NULL) 240 return -2; 241 } 242 if(GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == NO_ERROR) 243 { 244 for(PIP_ADAPTER_INFO pAdapter = pAdapterInfo; pAdapter != NULL; pAdapter = pAdapter->Next) 245 { 246 // 如果不是有线物理网卡,直接跳过 247 if(pAdapter->Type != MIB_IF_TYPE_ETHERNET || pAdapter->Type == 71 ||strstr(pAdapter->Description,"Bluetooth") >0 ) 248 continue; 249 if(pAdapter->AddressLength != 6) 250 continue; 251 sprintf_s(info.MacAddress, 18, "%02X:%02X:%02X:%02X:%02X:%02X", 252 int (pAdapter->Address[0]), 253 int (pAdapter->Address[1]), 254 int (pAdapter->Address[2]), 255 int (pAdapter->Address[3]), 256 int (pAdapter->Address[4]), 257 int (pAdapter->Address[5])); 258 break; 259 } 260 } 261 free(pAdapterInfo); 262 263 pSvc->Release(); 264 pLoc->Release(); 265 pEnumerator->Release(); 266 CoUninitialize(); 267 268 return 0; 269 }
View Code
改进后的代码仍存在不能获取到主板序列号的可能性问题,目前没找到较好的解决办法。
转载于:https://www.cnblogs.com/annie-fun/p/6409542.html
使用WMI编程获取主机硬件信息(续)相关推荐
- 使用WMI编程获取主机硬件信息(CPU_ID,硬盘、主板、BIOS序列号,Mac地址)
最近在公司实习,有个应用需要获取windows主机的一些硬件信息,在网上查阅了一些资料,大部分都是使用WMI编程来实现的. 因此小菜鸟自己也用WMI实现了一下,封装为函数GetUserInfo(),具 ...
- python获取电脑硬件信息_Python实现的读取电脑硬件信息功能示例
本文实例讲述了Python实现的读取电脑硬件信息功能.分享给大家供大家参考,具体如下: 上学那会,老师让我用java获取电脑硬件信息,CPU, 硬盘,MAC等,那个时候感觉搞了好久...... 今天, ...
- Python获取电脑硬件信息及状态的实现方法
From: http://www.jb51.net/article/54470.htm 这篇文章主要介绍了Python获取电脑硬件信息及状态的实现方法,是一个很实用的技巧,需要的朋友可以参考下 本文以 ...
- linux查主机物理地址查询,在操作系统中查询物理主机硬件信息-ipmitool、dmidecode...
在操作系统中查询物理主机硬件信息(ILO地址.序列号.厂家和型号等)--ipmitool.dmidecode 日常运维中经常遇到操作系统里的地址和物理主机的远程管理地址(ILO地址.BMC地池.Ima ...
- C#获取电脑硬件信息(CPU ID、主板ID、硬盘ID、BIOS编号
C#获取电脑硬件信息(CPU ID.主板ID.硬盘ID.BIOS编号 http://www.cnblogs.com/liufei88866/archive/2010/05/11/1732671.htm ...
- python获取系统硬件信息
python获取系统硬件信息 github项目 https://github.com/giampaolo/psutil cpu,内存,etc.
- c# 获取电脑硬件信息通用查询类[测试通过]
C#获取电脑硬件信息通用类[Computer]代码展示和分析,简介如下: 1.项目中添加System.Management引用. 2.添加类Computer,把下面代码全选,复制,粘贴. 3.使用方法 ...
- lshw linux_Linux lshw命令–获取Linux硬件信息
lshw linux Linux lshw command lists all the hardware configuration of the system. Linux lshw命令列出了系统的 ...
- js怎么获取电脑硬件信息
转载自品略图书馆 http://www.pinlue.com/article/2020/07/1708/2211037430301.html 想知道怎么获取电脑的硬件信息吗,下面是小编带来js怎么获取 ...
- Android -- 获取设备硬件信息
Android – 获取设备硬件信息 通过 Build 获取指定字段信息: 信息 方法 例子 主板 Build.BOARD PAR 系统定制商 Build.BRAND HUAWEI 硬件名称 Buil ...
最新文章
- 深度解析容器化技术在广发证券交易系统的应用
- Python爬虫自学之第(④)篇——强大的正则表达式,re模块
- 品高云入围央采软件协议供货名单
- 极域电子教室软件卸载密码怎么查看
- DLAN(UPNP)主流开源库的官网及SDK下载地址
- 微信小程序—轮播图+背景变化
- HTML课题背景怎么写,课题研究的背景和意义怎么写
- linux调用一个函数失败 打印错误,write函数出现错误invalid argument
- 计算机无法识别出cd驱动器,迅捷(FAST)免驱无线网卡插到电脑上无法识别CD驱动器怎么解决?【图解】...
- GSYVideoPlayer实现视频播放
- 联发科、联芯TD合作后期走势分析
- 指数的计算方法介绍!
- 联想ideapad110-151kb
- CMMI的五个等级是什么?
- vue通过xlsx-style导出数据
- 【校园卡】最后一周!校园卡最近消息:2020校园卡10月底停售!
- excel人事必学合同到期提醒
- 深度解读:中国5G商用,为何渐入歧途?
- C以及Objective-C测试题(上)
- C++游戏-------------------狼人杀