查询操作系统的版本,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的主要内容,如果未能解决你的问题,请参考以下文章

查询操作系统的版本,CPU序列号以及操作系统所在的SN

linux 基础信息查询

linux系统下查看服务器的型号等信息

slatstack静态数据系统grains

linux查看硬件系统信息

Linux命令详解系统管理