首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++/Windows:获取唯一的机器id: mac地址,卷序列号,

C++/Windows:获取唯一的机器id: mac地址,卷序列号,
EN

Stack Overflow用户
提问于 2014-03-29 14:54:14
回答 2查看 2.3K关注 0票数 0

我的平台是Windows 7(或更高版本),我使用的是Visual 2010。

为了获得唯一的机器标识符,我试图检索mac地址,但遇到了以下问题。

我很难从GetAdapatersInfo方法返回的适配器列表中识别哪个是主以太网适配器。

通过检查以太网适配器的类型(应该是MIB_IF_TYPE_ETHERNET),我可以获得它们的列表。

然而,在我的机器上有多个以太网适配器:实际局域网适配器、Cisco创建的软件适配器、蓝牙以太网适配器等。

根据我与互联网的连接方式,这个列表一直在变化。

那么,我如何知道哪一个是实际的以太网适配器(将使用局域网电缆连接的适配器)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-25 19:02:17

井,

经过一段时间的试验(大约一个月),卷号似乎是生成唯一id的可靠指标,该id在重新引导过程中是持久的,用户不能更改。除非重新格式化磁盘,否则此id不会更改。

下面的代码获取卷号。

代码语言:javascript
复制
int getVolumeNumber(char *volumeNumber, int capacity) {
for(int i=0; i<capacity; i++) {
    volumeNumber[i] = '\0';
}
TCHAR volumeName[MAX_PATH + 1] = { 0 };
TCHAR fileSystemName[MAX_PATH + 1] = { 0 };
DWORD serialNumber = 0;
DWORD maxComponentLen = 0;
DWORD fileSystemFlags = 0;
if(GetVolumeInformation(_T("C:\\"), volumeName, ARRAYSIZE(volumeName), &serialNumber, &maxComponentLen, &fileSystemFlags, fileSystemName, ARRAYSIZE(fileSystemName)) != 0) {
    sprintf(volumeNumber,"%lu",serialNumber);
    return 0;
} else {
    return 1;
}

}

在上面的代码中,我获取C:驱动器的卷号。

票数 3
EN

Stack Overflow用户

发布于 2015-01-21 13:53:37

“卷号似乎是生成唯一id的可靠度量,该id在重新引导过程中是持久的,用户不能更改。”

此语句的最后一部分(“用户不能更改”)。不是真的。有几个实用程序可以更改或欺骗卷序列号。例如,参见https://www.raymond.cc/blog/changing-or-spoofing-hard-disk-hardware-serial-number-and-volume-id/。根据您的用例,使用硬盘序列号可能会稍微好一些,硬盘序列号由HD制造商提供,用户不能更改(但可以被欺骗)。可以使用Win32_PhysicalMedia类(https://msdn.microsoft.com/en-us/library/windows/desktop/aa394346%28v=vs.85%29.aspx)检索它。

另一种选择可能是枚举所有以太网适配器,对它们进行排序并比较结果--但是您似乎已经研究过这条路。

一般说来,任何可用作个人电脑独特ID的东西都可用于“软件保护”(即防止未经授权使用软件),因此,人们极有可能设法绕过软件保护。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22732604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档