【问题标题】:Getting the motherboard's serial number获取主板序列号
【发布时间】:2017-09-14 08:34:04
【问题描述】:

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

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

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

#define USER_SERIAL 123456789

double GetMotherBoardSerialNumber();
// ...

double currentSerial = GetMotherBoardSerialNumber();

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

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

【问题讨论】:

  • 是的,我已经阅读了那些,但正如第一个答案(关于 WMI)中提到的:“我发现检索主板的序列号可能会导致非常不同结果取决于制造商和分销渠道。"
  • @Angry Club 只生成 GUID
  • 您可能还需要考虑将计算机修复为违反许可的行为会让一些客户非常沮丧。
  • @BoPersson 提出了一个很好的观点。而且这个问题越来越严重。当然让服务器启动并运行。并使用 cpuid 和 mac 地址来跟踪您的用户拥有哪些计算机,并检测被黑的帐户。
  • “我只想为特定用户编译一次。” - 如果你对你的软件很认真,你必须在你的办公室里保留调试符号对于每个版本。只需要 TB 级的存储空间来存储调试符号并不需要大量的客户。这种方法不能很好地扩展。

标签: c++ windows winapi hardware-id


【解决方案1】:

您可以查看此注册表项:[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 );

【讨论】:

  • 好资料,但不包括序列号
  • @Jeff 你想让它生成计算机 UID 吗?
  • @Joel 是的,序列号的用途是作为唯一标识符
  • @AngryCub 所以看看我的编辑,有了这个你可以获得唯一标识符,写入注册表并从注册表中读取这个 uid。
  • @Joel 哦等等,我现在看到你编辑了你的答案,让我看看新元素
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-05-12
    • 1970-01-01
    • 2011-10-16
    • 2011-04-06
    • 1970-01-01
    • 2011-01-30
    • 2016-06-12
    • 1970-01-01
    • 2017-09-06
    相关资源
    最近更新 更多