获取主板序列号

Ang*_*Cub 6 c++ windows winapi hardware-id

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

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

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

#define USER_SERIAL 123456789

double GetMotherBoardSerialNumber();
// ...

double currentSerial = GetMotherBoardSerialNumber();

if(currentSerial != USER_SERIAL) {
    exit 1;
}
Run Code Online (Sandbox Code Playgroud)

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

djg*_*ndy 5

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

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

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

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

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


Krz*_*zyk 2

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

"BiosMajorRelease"
"BiosMinorRelease"
"ECFirmwareMajorRelease"
"ECFirmwareMinorRelease"
"BaseBoardManufacturer"
"BaseBoardProduct"
"BaseBoardVersion"
"BIOSReleaseDate"
"BIOSVendor"
"BIOSVersion"
"SystemFamily"
"SystemManufacturer"
"SystemProductName"
"SystemSKU"
"SystemVersion"
Run Code Online (Sandbox Code Playgroud)

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

GUID gidReference;
HRESULT hCreateGuid = CoCreateGuid( &gidReference );
Run Code Online (Sandbox Code Playgroud)