11

对于生成每台 PC 许可证密钥的要求,我需要一些代码,这些代码将在任何 PC 上返回一个稳定且(接近)唯一的密钥。它不必保证是唯一的,但要接近不过,它确实需要相当稳定,以便给定的 PC 始终生成相同的结果,除非硬件发生重大变化。

这适用于 Windows 应用程序,使用 wxWidgets 但 Win32 或其他选项很好。

我在考虑 MAC 地址,但是笔记本电脑可以在省电模式下定期禁用网卡呢?我遇到了GetCurrentHwProfile但它看起来不像我想要的?

4

7 回答 7

6

不久前我有一个想法是使用CryptProtectData作为识别机器的一种方式。在该 API 的幕后,Microsoft 已经完成了您正在寻找的事情。我从来没有测试过它,我很好奇它是否真的可行。

CryptProtectData基本上你会用with编码一个常量魔法值,CRYPTPROTECT_LOCAL_MACHINE结果就是你的机器 ID。

于 2010-09-03T13:23:08.370 回答
2

我只会使用 MAC 地址方法;当无线/ LAN 卡关闭时,它们仍会显示在网络连接中。因此,您应该仍然能够获得 MAC。

考虑一下:任何时候您可以联系您的网络服务器或任何您用来编目这些 ID 的东西,用户必须有某种形式的网卡可用。

哦,你也许可以使用客户电脑支持的CPU序列号。

于 2010-09-03T13:32:42.477 回答
2

我认为到目前为止,这里还没有发现真正简单而独特的方法。

  1. GetVolumeInformation 检索甚至不接近唯一 ID .....
  2. 使用任何硬件序列都是有问题的,因为制造商并不承诺始终支持它,尤其是保持它在全球范围内的唯一性
  3. GetCurrentHwProfile 检索 GUID,但它的值受次要影响!硬件改动...
  4. 使用产品密钥...将使您能够处理被盗软件 - 全球有很多盗版安装。
  5. 创建自己的 GUID 并将其保存在注册表下(在任何地方)不会通过克隆图像来防止复制 ....
    等... 从我的角度来看,最好的方法是结合:卷 ID + MAC 的列表 + 机器 SID +机器名称。并且显然在服务器端管理许可证策略;0)

问候米克尔。

于 2010-11-17T17:09:37.760 回答
1

对于一个漂亮的脑死亡测试,我使用操作系统的 ProductID 代码和计算机名称 - 两者都从注册表中提取。不是很安全,但无论如何它都假装安全。

编辑

要回答约翰关于我正在阅读什么键的问题:

SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductID

SYSTEM\CurrentControlset\Control\ComputerName\ComputerName\ComputerName

于 2010-09-03T13:26:35.473 回答
1

如果您想要比机器本身可以告诉您的更难欺骗的东西,您可能需要提供专用于此目的的 USB 加密狗(不仅仅是闪存驱动器)。

于 2010-09-03T13:32:53.500 回答
1

用安装windows的硬盘的序列号怎么样?

函数GetVolumeInformation()会给你这样的序列号。要访问硬盘供应商分配的 ID 而不是 Windows 分配的 ID,您可以使用 Win32_PhysicalMedia 类。

要确定安装 windows 的驱动器,您可以使用函数 ExpandEnvironmentStrings() 扩展变量 %windir"

如果您的体系结构允许,另一种选择是使用 UuidCreate() 在安装时生成随机 GUID 并将其永久保存在注册表中。只要保留注册表,此 GUID 就可以用作 ID。新的注册表数据库通常被视为新安装。

第三种选择是让知名服务器分配 ID。启动时,软件可以在注册表中查找 ID,如果找不到,将联系服务器并提供其 MAC 地址、主机名、硬盘序列号、机器 SID 和任何数量的可识别信息(密钥)。

然后服务器根据给定的信息确定客户端是否已经注册。服务器可以有一个宽松的策略,例如只需要大部分密钥进行匹配,这样即使在注册表完全清除并且部分(但不是全部)硬件的情况下,该机制也可以工作。更换。

于 2010-09-03T14:53:12.287 回答
-1

如何使用 CPU 的序列号。我记得微软曾经为此提供了一个 api,它可以运行必要的汇编代码,并为您提供有关 CPU 的各种信息,包括序列号。不确定它是否适用于 AMD 芯片,我认为它是特定于英特尔的。

当然,CPU ID 足够安全和​​静态!!

于 2010-09-06T16:40:25.233 回答