6

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

虽然我可以找到 C# 和 Java 的一些示例,但我找不到 C++ 可靠的东西(我读过 WMI 可能会因硬件而失败),但肯定有办法在 C++ 中做到这一点吗?

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

#define USER_SERIAL 123456789

double GetMotherBoardSerialNumber();
// ...

double currentSerial = GetMotherBoardSerialNumber();

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

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

4

2 回答 2

4

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

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

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

GetSystemFirmwareTable可用于获取 SMBIOS 数据,然后您可以根据SMBIOS 规范对其进行解析。表中有大量数据,因此生成唯一标识符应该不会太难。IIRC,您通常甚至可以获得 DRAM 等的序列号...

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

于 2017-04-18T13:35:32.797 回答
2

您可以查看此注册表项:[HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\BIOS]. 您将看到以下内容:

"BiosMajorRelease"
"BiosMinorRelease"
"ECFirmwareMajorRelease"
"ECFirmwareMinorRelease"
"BaseBoardManufacturer"
"BaseBoardProduct"
"BaseBoardVersion"
"BIOSReleaseDate"
"BIOSVendor"
"BIOSVersion"
"SystemFamily"
"SystemManufacturer"
"SystemProductName"
"SystemSKU"
"SystemVersion"

如果这不满足您,您仍然可以使用GetSystemInfo函数。我认为这种使用主板信息不会帮助您作为唯一ID。如果您想获得唯一的计算机标识符,请使用GUID或其他东西。要创建 GUID,您只需:

GUID gidReference;
HRESULT hCreateGuid = CoCreateGuid( &gidReference );
于 2017-04-18T13:18:59.323 回答