【问题标题】:C++/Windows: Get unique machine id: mac address, volume serial number,C++/Windows:获取唯一机器 ID:mac 地址、卷序列号、
【发布时间】:2015-01-21 21:53:37
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 我仍在寻找答案。但是,只是想指出“GetAdaptersAddresses”方法提供了 IP_ADAPTER_ADDRESSES 结构。这个结构有一个字段“FriendlyName”。该字段的值可用于评估它是否为“本地连接”。不确定,这种方法有多可靠。
  • 仍在寻找答案,但是,我发现“UuidCreateSequential”使用“Primary”NIC 来生成 UUID。主 NIC 不会根据我连接到 Internet 的方式而改变。完整示例位于以下位置。 codeguru.com/cpp/i-n/network/networkinformation/article.php/…
  • 只是想补充一点,如果/当计算机重新启动并且 CISCO VPN 等服务创建/删除虚拟网络适配器时,主 MAC 地址可能会发生变化。仍在努力寻找一种可靠的方法来生成唯一的机器 ID
  • 我现在认为MAC地址不是唯一识别机器的非常可靠的方法。 GetAdaptersInfoGetAdaptersAddressesUuidCreateSequential 可以提供 mac 地址,我尝试了所有三个,但在重新启动和连接配置文件更改后,它们都没有持久性。
  • 我现在正在使用 GetVolumeInformation 函数来获取唯一的机器标识符。它返回格式化磁盘时操作系统分配的卷号。为了保持持久性,我总是查询“C:\”驱动器。只要“C:\”驱动器没有改变并且磁盘没有重新格式化,这种方法应该有效;至少这是希望。

标签: ethernet


【解决方案1】:

嗯,

经过一段时间的试验(大约一个月),卷号似乎是生成唯一 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: 驱动器的卷号。

【讨论】:

    【解决方案2】:

    “卷号似乎是生成唯一 ID 的可靠指标,该 ID 在重新启动后保持不变,用户无法更改。”

    此声明的最后一部分(“用户无法更改。”)不正确。有几个实用程序可以更改或欺骗卷序列号。 参见例如 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 的东西都可以用于“软件保护”(即防止未经授权使用软件),因此人们极有可能试图找到规避方法它。

    【讨论】:

    • 我同意硬盘序列号可能比卷号更可靠。就欺骗而言,没有什么(据我所知)不受此影响。网络适​​配器不可靠且容易被欺骗。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2011-08-28
    • 2015-07-05
    相关资源
    最近更新 更多