查询操作系统的版本,CPU序列号以及操作系统所在的SN
Posted 水澹澹兮生烟.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查询操作系统的版本,CPU序列号以及操作系统所在的SN相关的知识,希望对你有一定的参考价值。
再某些项目中,获取操作系统版本,CPU序列号以及操作系统所在的硬盘序列号。
#pragma once
#define WIN32_DCOM
#include<iostream>
#include<comdef.h>
#include<wbemidl.h>
#include<windows.h>
#include<string>
#pragma comment(lib,"wbemuuid.lib")
#pragma warning(disable : 4996)
#define MAX_BUM 128
using namespace std;
typedef struct _meth_mess
char CPU_id[MAX_BUM];
char SYS_diskid[MAX_BUM];
meth_mess;
BOOL str_exchange(wchar_t* str_a,char* str_b,int size)
int len = WideCharToMultiByte(CP_ACP, 0, str_a, -1, NULL, 0, NULL, NULL);
if (len > 0 && len < size)
len = WideCharToMultiByte(CP_ACP, 0, str_a, -1, str_b, len, NULL, NULL);
if (len <= 0)
return false;
return true;
return false;
void dele_n(char* data)
int i = -1, j = 0;
int ch = ' ';//ch赋值位空
while (data[++i] != '\\0')
if (data[i] != ch)
data[j++] = data[i];
data[j] = '\\0';
int _getdata(meth_mess &mess)
HRESULT hres;//HRESULT类型: 常被用作COM调用的返回值
memset(&mess, 0, sizeof(meth_mess));
CoUninitialize();//CoUninitialize关闭当前线程的COM库
hres = CoInitializeEx(0, COINIT_MULTITHREADED);//第二个参数设置当前线程的并发模式为多线程
if (FAILED(hres)) //判断hres是否小于0
return 0;
IWbemLocator* loc = NULL;
hres = CoCreateInstance(//创建一个COM对象
CLSID_WbemLocator,//此参数用来创建指定对象
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID *)&loc);
if (FAILED(hres))
CoUninitialize();
return 0;
IWbemServices *pSvc = NULL;
hres = loc->ConnectServer(//命名空间的连接
_bstr_t(L"ROOT\\\\CIMV2"),//命名空间
NULL,
NULL,
0,
NULL,
0,
0,
&pSvc
);
if (FAILED(hres))
loc->Release();
CoUninitialize();
return 0;
hres = CoSetProxyBlanket(//在指定代理上生成调用使用设置身份验证信息
pSvc,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE
);
if (FAILED(hres))
pSvc->Release();
loc->Release();
CoUninitialize();
return 0;
//获取CPU序列号
IEnumWbemClassObject* pEnumerator = NULL;// 接口用于枚举公共信息模型(CIM)对象,类似于标准的COM枚举器
hres = pSvc->ExecQuery(//执行查询检索对象
bstr_t("WQL"),//理支持的有效查询语言的字符串,必须是WQL
bstr_t("SELECT * FROM win32_Processor"), //查询的文本
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);//如果未发生错误,则接收允许调用方检索查询结果集中的实例的枚举器
if (FAILED(hres))
pSvc->Release();
loc->Release();
IWbemClassObject *pclsObj;//IWbemClassObject接口包含并操作类定义和类对象实例。
ULONG uReturn = 0;
while (pEnumerator)
//当返回的对象数与uCount中请求对象数匹配,返回WBEM_S_NO_ERROR
HRESULT hr = pEnumerator->Next(// next法获取一个或多个从枚举中的当前位置开始的对象
WBEM_INFINITE,//time指定在返回之前阻止的最长时间
1,//请求的对象数
&pclsObj,//指向足够存储的指针,保存uCount指定的IWbemClassObject接口指针数。当不再需要每个已接收的接口指针时,调用方必须在它们上调用Release。
&uReturn);//指向接收返回的对象数的ULONG的指针。
if (FAILED(hr)) break;
if (0 == uReturn)
break;
VARIANT vtProp;//VARIANT变体类型,除了定长String数据及用户定义类型外,可以包含任何种类的数据。
vtProp.bstrVal = NULL;
hr = pclsObj->Get(//检索指定的属性值
L"ProcessorId",//所需属性的名称
0,
&vtProp,//成功后为限定符分配正确的类型和值
0,
0);
if (NULL == vtProp.bstrVal || FAILED(hr))
break;
int ast = str_exchange(vtProp.bstrVal, mess.CPU_id , MAX_BUM);// bstrVal:COM自动化和互操作函数使用的字符串数据类型
if (!ast) break;
VariantClear(&vtProp);
pclsObj->Release();
//获取系统所在硬盘的ID
int diskIndex = 0;
pEnumerator->Release();
pEnumerator = NULL;
hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("SELECT * FROM Win32_DiskPartition WHERE Bootable = TRUE"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
pSvc->Release();
loc->Release();
CoUninitialize();
while (pEnumerator)
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);//找到系统所在硬盘的ID
if (0 == uReturn)
break;
VARIANT vtProp;
vtProp.intVal = 0;
hr = pclsObj->Get(L"DiskIndex", 0, &vtProp, 0, 0);
diskIndex = vtProp.intVal;//返回一个int类型
cout << "disk_ID:" << diskIndex << endl;
VariantClear(&vtProp);
pclsObj->Release();
//根据系统所在硬盘的ID查询序列号
char index[10];
string strQuery = "SELECT * FROM Win32_DiskDrive WHERE Index = ";
itoa(diskIndex, index, 10);
string indexStr(index);
strQuery += indexStr;
pEnumerator->Release();
pEnumerator = NULL;
hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t(strQuery.c_str()),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
pSvc->Release();
loc->Release();
CoUninitialize();
while (pEnumerator)
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if (0 == uReturn)
break;
VARIANT vtProp;
vtProp.bstrVal = NULL;
hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0);
int ast = str_exchange(vtProp.bstrVal, mess.SYS_diskid , MAX_BUM);
if (!ast) break;
dele_n(mess.SYS_diskid);
VariantClear(&vtProp);
pclsObj->Release();
return 1;
以上是关于查询操作系统的版本,CPU序列号以及操作系统所在的SN的主要内容,如果未能解决你的问题,请参考以下文章