C++中两种获取UUID的方法(编程)
第一种,依托WMI
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h> # pragma comment(lib, "wbemuuid.lib") int main(int argc, char **argv)
{
HRESULT hres;
// Step 1: --------------------------------------------------
// Initialize COM. ------------------------------------------
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres))
{
cout << "Failed to initialize COM library. Error code = 0x"
<< hex << hres << endl;
return 1; // Program has failed.
} // Step 2: --------------------------------------------------
// Set general COM security levels --------------------------
// Note: If you are using Windows 2000, you need to specify -
// the default authentication credentials for a user by using
// a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
// parameter of CoInitializeSecurity ------------------------
hres = CoInitializeSecurity(
NULL,
-1, // COM authentication
NULL, // Authentication services
NULL, // Reserved
RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication
RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation
NULL, // Authentication info
EOAC_NONE, // Additional capabilities
NULL // Reserved
); if (FAILED(hres))
{
cout << "Failed to initialize security. Error code = 0x"
<< hex << hres << endl;
CoUninitialize();
return 1; // Program has failed.
}
// Step 3: ---------------------------------------------------
// Obtain the initial locator to WMI ------------------------- IWbemLocator *pLoc = NULL; hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *)&pLoc); if (FAILED(hres))
{
cout << "Failed to create IWbemLocator object."
<< " Err code = 0x"
<< hex << hres << endl;
CoUninitialize();
return 1; // Program has failed.
} // Step 4: ----------------------------------------------------- // Connect to WMI through the IWbemLocator::ConnectServer method
IWbemServices *pSvc = NULL;
// Connect to the root\cimv2 namespace with
// the current user and obtain pointer pSvc
// to make IWbemServices calls. hres = pLoc->ConnectServer(
_bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
NULL, // User name. NULL = current user
NULL, // User password. NULL = current
0, // Locale. NULL indicates current
NULL, // Security flags.
0, // Authority (e.g. Kerberos)
0, // Context object
&pSvc // pointer to IWbemServices proxy
); if (FAILED(hres))
{
cout << "Could not connect. Error code = 0x"
<< hex << hres << endl;
pLoc->Release();
CoUninitialize();
return 1; // Program has failed.
}
cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;
// Step 5: --------------------------------------------------
// Set security levels on the proxy -------------------------
hres = CoSetProxyBlanket(
pSvc, // Indicates the proxy to se
RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx
NULL, // Server principal name
RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx
RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
NULL, // client identity
EOAC_NONE // proxy capabilities
);
if (FAILED(hres))
{
cout << "Could not set proxy blanket. Error code = 0x"
<< hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1; // Program has failed.
}
// Step 6: --------------------------------------------------
// Use the IWbemServices pointer to make requests of WMI ----
// For example, get the name of the operating system
IEnumWbemClassObject* pEnumerator = NULL;
hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("SELECT * FROM Win32_ComputerSystemProduct"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
{
cout << "Query for operating system name failed."
<< " Error code = 0x"
<< hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 1; // Program has failed.
} IWbemClassObject *pclsObj; ULONG uReturn = 0;
string test;
while (pEnumerator)
{
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
&pclsObj, &uReturn);
if (0 == uReturn)
{
break;
}
VARIANT vtProp;
// Get the value of the Name property
hr = pclsObj->Get(L"UUID", 0, &vtProp, 0, 0);
wcout << " OS Name : " << vtProp.bstrVal << endl;
VariantClear(&vtProp);
//pclsObj->Release();
}
//pSvc->Release();
//pLoc->Release();
//pEnumerator->Release();
//pclsObj->Release();
//CoUninitialize();
system("PAUSE");
return 0; // Program successfully completed.
}
第二种,依托GetSystemFirmwareTable
#include <Windows.h>
#include <string>
#include <tchar.h> typedef struct _dmi_header
{
BYTE type;
BYTE length;
WORD handle;
}dmi_header; typedef struct _RawSMBIOSData
{
BYTE Used20CallingMethod;
BYTE SMBIOSMajorVersion;
BYTE SMBIOSMinorVersion;
BYTE DmiRevision;
DWORD Length;
BYTE SMBIOSTableData[];
}RawSMBIOSData; static void dmi_system_uuid(const BYTE *p, short ver)
{
int only0xFF = 1, only0x00 = 1;
int i; for (i = 0; i < 16 && (only0x00 || only0xFF); i++)
{
if (p[i] != 0x00) only0x00 = 0;
if (p[i] != 0xFF) only0xFF = 0;
} if (only0xFF)
{
printf("Not Present");
return;
} if (only0x00)
{
printf("Not Settable");
return;
} if (ver >= 0x0206)
printf("%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X\n",
p[3], p[2], p[1], p[0], p[5], p[4], p[7], p[6],
p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
else
printf("-%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X\n",
p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
} const char *dmi_string(const dmi_header *dm, BYTE s)
{
char *bp = (char *)dm;
size_t i, len; if (s == 0)
return "Not Specified"; bp += dm->length; while (s > 1 && *bp)
{
bp += strlen(bp);
bp++;
s--;
}
if (!*bp)
return "BAD_INDEX"; /* ASCII filtering */
len = strlen(bp);
for (i = 0; i < len; i++)
if (bp[i] < 32 || bp[i] == 127)
bp[i] = '.';
return bp;
} int _tmain(int argc, _TCHAR* argv[])
{
DWORD bufsize = 0;
BYTE buf[65536] = { 0 };
int ret = 0;
RawSMBIOSData *Smbios;
dmi_header *h = NULL;
int flag = 1; ret = GetSystemFirmwareTable('RSMB', 0, 0, 0);
if (!ret)
{
printf("Function failed!\n");
return 1;
} printf("get buffer size is %d\n", ret);
bufsize = ret; ret = GetSystemFirmwareTable('RSMB', 0, buf, bufsize); if (!ret)
{
printf("Function failed!\n");
return 1;
} Smbios = (RawSMBIOSData *)buf;
BYTE *p = Smbios->SMBIOSTableData; if (Smbios->Length != bufsize - 8)
{
printf("Smbios length error\n");
return 1;
} for (int i = 0; i < Smbios->Length; i++) {
h = (dmi_header *)p; if (h->type == 0 && flag) {
printf("\nType %02d - [BIOS]\n", h->type);
printf("\tBIOS Vendor : %s\n", dmi_string(h, p[0x4]));
printf("\tBIOS Version: %s\n", dmi_string(h, p[0x5]));
printf("\tRelease Date: %s\n", dmi_string(h, p[0x8])); if (p[0x16] != 0xff && p[0x17] != 0xff)
printf("\tEC version: %d.%d\n", p[0x16], p[0x17]);
flag = 0;
} else if (h->type == 1) {
printf("\nType %02d - [System Information]\n", h->type);
printf("\tManufacturer: %s\n", dmi_string(h, p[0x4]));
printf("\tProduct Name: %s\n", dmi_string(h, p[0x5]));
printf("\tVersion: %s\n", dmi_string(h, p[0x6]));
printf("\tSerial Number: %s\n", dmi_string(h, p[0x7]));
printf("\tUUID: "); dmi_system_uuid(p + 0x8, Smbios->SMBIOSMajorVersion * 0x100 + Smbios->SMBIOSMinorVersion);
printf("\tSKU Number: %s\n", dmi_string(h, p[0x19]));
printf("\tFamily: %s\n", dmi_string(h, p[0x1a]));
}
p += h->length;
while ((*(WORD *)p) != 0) p++;
p += 2;
} getchar();
return 0; }
相关链接:http://forum.eepw.com.cn/thread/291638/1
C++中两种获取UUID的方法(编程)的更多相关文章
- AppCan中两种获取信息的方法
<div id="newsInfo">正在加载...</div> 1.JSON格式: [{'R': '1','NOTI_ID': '9','NOTI_TIT ...
- Hibernate中两种获取Session的方式
转自:https://www.jb51.net/article/130309.htm Session:是应用程序与数据库之间的一个会话,是hibernate运作的中心,持久层操作的基础.对象的生命周期 ...
- ajax请求中 两种csrftoken的发送方法
通过ajax的方式发送两个数据进行加法运算 html页面 <body> <h3>index页面 </h3> <input type="text&qu ...
- objective-C 中两种实现动画的方法
第一种方法: [UIView beginAnimations:@"Curl"context:nil];//动画开始 [UIView setAnimationDuration:1.2 ...
- objective-C 中两种实现动画的方法(转)
转发自:http://wayne173.iteye.com/blog/1250232 第一种方法: [UIView beginAnimations:@"Curl"context: ...
- [TestNG] Eclipse/STS中两种安装TestNG的方法
Two Ways To Install TestNG in Eclipse/STS Today I install the newest Sprint Tool Suite and want to i ...
- Python 两种获取文件大小的方法
import os r=os.path.getsize("/root/catbird1.stl") f=open("/root/catbird1.stl",&q ...
- php 两种获取分类树的方法
php 两种获取分类树的方法 1. /** * 获取分类树 * @param array $array 数据源 * @param int $pid 父级ID * @param int $level 分 ...
- JAVA 中两种判断输入的是否是数字的方法__正则化_
JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengz ...
- Cesium 中两种添加 model 方法的区别
概述 Cesium 中包含两种添加 model 的方法,分别为: 通过 viewer.entities.add() 函数添加 通过 viewer.scene.primitives.add() 函数添加 ...
随机推荐
- [转帖]linux设置page cache大小,Linux Page Cache调优在Kafka中的应用
本文首发于 vivo互联网技术 微信公众号 链接: 作者:Yang Yijun 本文主要描述Linux Page Cache优化的背景.Page Cache的基本概念.列举之前针对Kafka的 IO ...
- 鲲鹏920上面 Docker 部署 clickhouse 的方式方法
鲲鹏920上面 Docker 部署 clickhouse 的方式方法 背景 最近有一套鲲鹏920的测试环境, 研发同事想纯Dcoker部署一套环境. 其中就包括了 Clickhouse 之前发现Cli ...
- [转帖]存储器分级:L1 Cache 比内存和 SSD 快多少倍?
目录 1.为什么会有存储器分级策略? 2.存储器分级策略 2.1 存储器的级别 2.2.1 L1-Cache 2.2.2 L2-Cache 2.2.3 L3-Cache 3.内存 4.SSD 和硬盘 ...
- [转帖]学习如何编写 Shell 脚本(基础篇)
https://juejin.cn/post/6930013333454061575 前言 如果仅仅会 Linux 一些命令,其实已经可以让你在平时的工作中游刃有余了.但如果你还会编写 Shell 脚 ...
- [转帖]Jmeter中线程组和setUP线程组、tearDown线程组的区别
JMETER: setUP线程组:在测试任务ThreadGroup 运行前先被运行.通常用在运行测试任务前,做初始化工作.例如建立数据库连接初始分化工作.用户登录 tearDown线程组:在测试任务线 ...
- 关于信创CPU测试的一些想法和思路
关于信创CPU测试的一些想法和思路 背景 最近荷兰政府颁布了关于半导体设备出口管制的最新条例. 好像45nm以下的工艺的设备都可能收到限制. 对中国的相关厂商比如长鑫还有华虹的影响应该都比较大. 认为 ...
- justify-content: space-between能够对齐的解决办法
解决办法一 .main{ display: flex; justify-content: space-around; flex-wrap: wrap; } .son{ width:100px } // ...
- echarts饼状图不要中间的文字提示
饼状图不要中间的文字提示信息 emphasis: { label: { show: false, //将这个设置为false }, }, 为什么饼状图不要中间的问题提示信息 因为有些时候,在文字很多的 ...
- Ant Design Vue 中Drawer自定头部的样式、内容部分的样式、弹出层的样式
<a-drawer :title="myTitle" placement="right" :visible="visible" @cl ...
- Python 潮流周刊第 37 期(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...