获取主板的序列号

时间:2017-04-18 13:13:34

标签: 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;
}

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

2 个答案:

答案 0 :(得分: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 );

答案 1 :(得分:1)

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

我第一次尝试获得可靠的真实硬件ID时,我最终直接从映射的物理内存(Windows XP)读取SMBIOS。我曾经尝试过许多其他许多方法,但有些方法非常不可靠,而且在部署过程中,我们注意到客户端中存在一些其他方法的重复。 20多人怎么会有相同的连续剧?它没有任何意义,似乎OEM已经设置了领域。

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

GetSystemFirmwareTable可用于获取SMBIOS数据,然后您可以根据SMBIOS spec进行解析。表格中有相当数量的数据,因此生成唯一标识符不会太困难。 IIRC你通常甚至可以获得DRAM等系列产品......

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