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

时间:2014-03-29 14:54:14

标签: ethernet

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

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

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

我可以通过检查其类型来获取以太网适配器列表(它应该是MIB_IF_TYPE_ETHERNET)。

但是,我的机器上有多个以太网适配器:实际的LAN适配器,思科创建的软件适配器,蓝牙以太网适配器等。

根据我连接到互联网的方式,此列表不断变化。

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

2 个答案:

答案 0 :(得分:2)

那么,

在试验了一段时间(大约一个月)后,卷号似乎是一个可靠的度量标准,用于生成唯一ID,该ID在重新启动后是持久的,并且用户无法更改。除非重新格式化磁盘,否则此ID不会更改。

以下代码提取卷号。

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:驱动器的卷号。

答案 1 :(得分:0)

&#34;卷编号似乎是一个可靠的度量标准,用于生成唯一ID,该ID在重新启动后保持不变,并且无法由用户更改。&#34;

本声明的最后一部分(&#34;用户无法更改。&#34;)不正确。有几个实用程序可以更改或欺骗卷序列号。 请参阅示例https://www.raymond.cc/blog/changing-or-spoofing-hard-disk-hardware-serial-number-and-volume-id/。 根据您的使用情况,您可能稍微使用硬盘序列号,这是由HD制造商提供的,用户无法更改(但 CAN 被欺骗)。可以使用Win32_PhysicalMedia类(https://msdn.microsoft.com/en-us/library/windows/desktop/aa394346%28v=vs.85%29.aspx)检索它。

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

通常,任何可以用作PC的唯一ID的东西都可以用于&#34;软件保护&#34; (即防止未经授权使用软件),因此很可能人们试图找到绕过它的方法。