获取主板的序列号

Getting the motherboard's serial number

本文关键字:序列号 主板 获取      更新时间:2023-10-16

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

尽管我可以找到一些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(读取了SMBIO。我曾尝试过许多人在此之前推荐的其他方法,但有些方法非常不可靠,在部署中,人们注意到,客户遍布其他一些方法。20多个人如何具有相同的系列?这是没有意义的,似乎OEM的固定字段。

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

(

getSystemFirmWaretable可用于获取SMBIO数据,然后您可以根据SMBIOS规格解析这些数据。表中有大量数据,因此生成唯一标识符的数据不应该太困难。iirc通常您甚至会得到DRAM等的序列...

我还建议彻底测试此通话,并制定备份计划。在某些情况下,它只是失败了,并且对导致失败的环境有一个很好的了解将为您节省很多时间。如果我的记忆在Vista时代就为我服务,我对UAC和特权提高有问题,但是MS可能已经改变了!

您可以查看此注册表密钥:[HKEY_LOCAL_MACHINEHARDWAREDESCRIPTIONSystemBIOS]。您会看到以下:

"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 );