WIN32_Processor :: ProcessorId对于所有计算机都是唯一的

我想用一些许可制度独一无二的东西。 我决定从Win32_Processorpipe理类使用ProcessorID。

我尝试过两种不同的处理器types相同的系统。

它显示两个系统相同的processorID。 我正在使用这个代码

public static String GetCPUId() { String processorID = ""; ManagementObjectSearcher searcher = new ManagementObjectSearcher( "Select * FROM WIN32_Processor"); ManagementObjectCollection mObject = searcher.Get(); foreach (ManagementObject obj in mObject) { processorID = obj["ProcessorId"].ToString(); } return processorID; } 

不,不能保证它是唯一的,因为处理器可能甚至不支持CPUID指令,在这种情况下,呼叫不能保证成功。

此外,你忽略了一台机器可能有多个处理器,所以得到一个处理器的ID没有帮助。


正如其他人所指出的,如果你想得到一个唯一的系统ID,你最好的办法是创build一个id,它是系统中各种组件id的混合物。

硬件的各种价值的散列(而不仅仅是任何,但只有很less的冲突) 可能就足够了。 你可能想要使用相当embedded在系统中的东西,比如处理器,主板信息,但不能轻易拆卸/更改的东西,比如USB驱动器/集线器等等。

大多数许可系统依靠多个硬件组件来创build指纹。 没有单个组件被用作唯一的唯一键。 所以你可以考虑以下几点:

  • 所有networking适配器的MAC地址(如果他们有一个扩展坞或在笔记本电脑上启用/禁用无线networking,可能会变得棘手)
  • CPUID
  • 主板组件部件号(如IDE或SCSI控制器)
  • 系统驱动器的序列号(不容易改变的卷ID)
  • 等等

作为一个整体进行组合时,您将获得机器的唯一表示。 当用户改变他们的机器上的东西时,危险就来了。 他们是否失去执照? 他们有联系吗?

另外请注意,WMI类通常需要pipe理员权限才能阅读您正在查找的信息,这对于Vista和Windows 7用户来说是一个真正的麻烦。

做硬件locking是非常困难的。 所以我build议要么1,不要这样做,或者2,购买已经做到这一点的商业图书馆。

ProcessorID或CPUID用于识别处理器( ARM , x86 / x64 )的型号和function集。

奔腾III支持处理器序列号(PSN)。 除了只支持Pentium III(以及Transmeta的Efficeon和Crusoe处理器) ,该function必须在BIOS中启用,并引发了隐私问题 。

所以不,ProcessorID对于所有的计算机都不是唯一的。 此外,很可能在您公司的电脑中不是唯一的(因为许多组织购买同一型号的多台电脑)。

对于您正在寻找的唯一string,我们使用MAC地址。 如果用户没有MAC地址,我们只允许多个安装。 它涵盖了大部分我们想要完成的事情。