查询操作系统的版本,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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值