代码之家  ›  专栏  ›  技术社区  ›  Mr. Boy

基于软件/硬件唯一标识PC

  •  9
  • Mr. Boy  · 技术社区  · 14 年前

    对于一个要求生成每台电脑的许可证密钥,我需要一些代码,这将返回一个稳定的和(接近)唯一的密钥在任何电脑上。它没有 要保证独特,但接近。它 但是需要相当稳定,这样一台给定的PC总是产生相同的结果,除非硬件发生了实质性的改变。

    这适用于Windows应用程序,使用wxWidgets,但是使用Win32或其他选项就可以了。

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

    7 回复  |  直到 14 年前
        1
  •  2
  •   Billy ONeal IS4    14 年前

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

    考虑一下:任何时候你可以联系你的web服务器或者任何你正在编目这些id的东西,用户都会 提供某种形式的网卡。

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

        2
  •  6
  •   tenfour    14 年前

    CryptProtectData 作为识别机器的一种方法。在API的幕后,微软已经完成了你想要的。我从来没有测试过它,我很好奇它是否真的可行。

    CryptProtectData CRYPTPROTECT_LOCAL_MACHINE ,结果是您的机器ID。

        3
  •  2
  •   Mickel    14 年前

    1. GetVolumeInformation甚至检索不到唯一ID。。。。。
    2. 使用任何硬件序列号都是有问题的,因为制造商并没有承诺始终支持它,特别是保持它的全球唯一性
    3. GetCurrentHwProfile检索GUID,但它的值受次要影响!硬件更改。。。
    4. 创建自己的GUID并将其保存在注册表中(在任何地方)不会阻止通过克隆映像进行复制。。。。
      从我的角度来看,最好的方法是结合: 卷ID+MAC的列表+机器SID+机器名。并在服务器端管理许可证策略;0)

    当做 米克尔。

        4
  •  1
  •   Bruno    14 年前

    如果你想要比机器本身告诉你的更难欺骗的东西,你可能需要为此提供一个USB加密狗(不仅仅是一个闪存驱动器)。

        5
  •  1
  •   Peter M    14 年前

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

    编辑

    软件\Microsoft\Windows NT\CurrentVersion\ProductID

    系统\CurrentControlset\Control\ComputerName\ComputerName\ComputerName

        6
  •  1
  •   Fabio Fernandes    14 年前

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

    函数 GetVolumeInformation() 会给你这样的序列号。

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

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

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

        7
  •  0
  •   display101    14 年前

    使用CPU的序列号怎么样。我记得微软曾经为此提供了一个api,它可以运行必要的汇编代码,并返回有关CPU的各种信息,包括序列号。不确定它是否能与AMD芯片一起工作,我认为它是英特尔特有的。

    当然CPU Id是安全的和静态的!!