- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想将程序绑定(bind)到特定计算机,为此我想使用主板的序列号作为唯一标识符。
虽然我可以找到一些 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) 读取 SMBIOS。在此之前,我曾尝试过许多人推荐的其他方法,但有些方法非常不可靠,并且在部署过程中注意到,使用其他一些方法在客户端之间存在重复。 20 多个人怎么会有相同的连续剧?这毫无意义,似乎 OEM 已经设置了字段。
从 Windows Vista 开始,检索表的正确方法是通过 GetSystemFirmwareTable .这是因为不再可能从用户模式映射 Windows Vista 上的物理内存(XP64 和 Server 2003 也一样)
GetSystemFirmwareTable可用于获取 SMBIOS 数据,然后您可以根据 SMBIOS spec 解析这些数据.表中有大量数据,因此生成唯一标识符应该不会太困难。 IIRC 你通常甚至可以获得 DRAM 等的连续剧......
我还建议对此进行彻底测试,并在调用失败时制定备用计划。在某些情况下它会失败,并且对导致失败的环境有一个很好的了解将为您节省很多时间。如果我没记错的话,在 Vista 时代我遇到了 UAC 和提升权限的问题,但是从那时起 MS 可能已经改变了这一点!
关于c++ - 获取主板序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43473262/
我很想知道 Board/Machine ID 的重要性。我有几个与之相关的问题: 机器 ID 与电路板 ID 相同还是不同? 这个 ID 对于引导加载程序和内核引导有什么意义? 谁决定董事会 ID?
我在 C++ 类中使用 WMI 来检索我的主板的序列号。查询如下: "SELECT SerialNumber FROM Win32_BaseBoard" 我自己写了查询,所以我不确定它是否正确,但它确
我有一台服务器,它运行在 Intel S1200RP 主板上,CPU 是 Xeon 1270 v3。我已经安装了 msr-tools,rdmsr 0x3A 返回了 5,这意味着 Bios 中启用了 6
我是一名优秀的程序员,十分优秀!