我想将程序绑定(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/

10-11 06:46