对于生成每个PC许可证密钥的要求,我需要一些代码,这些代码将在任何PC上返回稳定和(近乎)唯一密钥。 不保证唯一,但是关闭。它确实需要相当稳定,因此除非硬件发生实质性改变,否则给定的PC总会生成相同的结果。
这适用于Windows应用程序,使用wxWidgets但Win32或其他选项都可以。
我在考虑MAC地址,但笔记本电脑可以在省电模式下常规禁用网卡呢?我遇到GetCurrentHwProfile,但它看起来不像我想要的那样?
答案 0 :(得分:4)
我暂时想到的一个想法是使用CryptProtectData作为识别机器的方法。在该API的幕后,微软已经完成了你正在寻找的东西。我从未测试过它,我很好奇它是否真的可行。
基本上,您会使用CryptProtectData
CRYPTPROTECT_LOCAL_MACHINE
编码一个恒定的魔术值,结果就是您的机器ID。
答案 1 :(得分:2)
我会选择MAC地址方法;当无线/ LAN卡关闭时,它们仍然显示在网络连接中。因此,您仍然可以获得MAC。
请考虑这一点:只要您能够联系您的网络服务器或任何您正在使用这些ID编目的内容,用户就会拥有以获得某种形式的网卡。< / p>
哦,您可能可以使用客户计算机的CPU序列号来支持它。
答案 2 :(得分:1)
如果你想要的东西比机器本身可以告诉你的更难,你可能需要提供专用于此目的的USB加密狗(不仅仅是闪存驱动器)。
答案 3 :(得分:1)
如何使用安装了Windows的硬盘的序列号?
函数GetVolumeInformation()将为您提供此类序列号。 要访问由硬盘供应商分配的ID而不是Windows分配的ID,您可以使用Win32_PhysicalMedia类。
要确定安装Windows的驱动器,可以使用函数ExpandEnvironmentStrings()扩展变量%windir“
如果您的体系结构允许,另一个选项是使用UuidCreate()在安装时生成随机GUID并将其永久保存在注册表中。只要注册表仍然存在,就可以将此GUID用作ID。新的注册表数据库通常被视为新安装。
第三种选择是让知名服务器分配ID。启动时,软件可以在注册表中查找ID,如果没有找到,将联系服务器并提供其MAC地址,主机名,硬盘序列号,机器SID和任意数量的可识别信息(密钥)。
然后,服务器根据给定的信息确定客户端是否已注册。服务器可以有一个宽松的策略,例如只需要大多数密钥进行匹配,这样即使在完全擦除注册表的情况下该机制也可以工作,并且部分(但不是全部)硬件是替换。
答案 4 :(得分:1)
我认为到目前为止还没有发现真正简单而独特的方法。
此致 MICKEL。
答案 5 :(得分:0)
对于一个漂亮的脑死测试,我使用的是操作系统的ProductID代码和计算机名 - 都是从注册表中提取的。不是很安全,但无论如何它都假装安全。
修改
回答John关于我正在读什么键的问题:
SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ProductID
系统\ CurrentControlSet \控制\计算机名\计算机名\计算机名
答案 6 :(得分:0)
如何使用CPU的序列号。我记得微软曾经为此提供了一个API,它将运行必要的汇编程序代码并返回各种有关CPU的信息,包括序列号。不确定它是否适用于AMD芯片,我认为这是特定于英特尔的。
当然,CPU ID安全且足够静态!!