gpt4 book ai didi

c++ - 获取主板序列号

转载 作者:可可西里 更新时间:2023-11-01 11:24:32 32 4
gpt4 key购买 nike

我想将程序绑定(bind)到特定计算机,为此我想使用主板的序列号作为唯一标识符。

虽然我可以找到一些 C# 和 Java 的示例,但我找不到任何可靠的 C++ 示例(我读到 WMI 可能会失败,具体取决于硬件),但肯定有一种方法可以在 C++ 中执行此操作吗?

编辑 :换句话说,我想要的是一个简单而基本的许可系统。为了更清楚,这是它的样子:

#define USER_SERIAL 123456789

double GetMotherBoardSerialNumber();
// ...

double currentSerial = GetMotherBoardSerialNumber();

if(currentSerial != USER_SERIAL) {
exit 1;
}

这显然不完美,但我没有任何服务器 atm 来设置帐户系统,所以这可能是一个临时解决方案。

最佳答案

如果你想要真正的序列号,我建议解析 SMBIOS 表。

我第一次深入研究获取可靠的真实硬件 ID 时,我最终直接从映射的物理内存 (Windows XP) 读取 SMBIOS。在此之前,我曾尝试过许多人推荐的其他方法,但有些方法非常不可靠,并且在部署过程中注意到,使用其他一些方法在客户端之间存在重复。 20 多个人怎么会有相同的连续剧?这毫无意义,似乎 OEM 已经设置了字段。

从 Windows Vista 开始,检索表的正确方法是通过 GetSystemFirmwareTable .这是因为不再可能从用户模式映射 Windows Vista 上的物理内存(XP64 和 Server 2003 也一样)

GetSystemFirmwareTable可用于获取 SMBIOS 数据,然后您可以根据 SMBIOS spec 解析这些数据.表中有大量数据,因此生成唯一标识符应该不会太困难。 IIRC 你通常甚至可以获得 DRAM 等的连续剧......

我还建议对此进行彻底测试,并在调用失败时制定备用计划。在某些情况下它会失败,并且对导致失败的环境有一个很好的了解将为您节省很多时间。如果我没记错的话,在 Vista 时代我遇到了 UAC 和提升权限的问题,但是从那时起 MS 可能已经改变了这一点!

关于c++ - 获取主板序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43473262/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com