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

C# WIN32_Processor::ProcessorId对于所有计算机都是唯一的,c#,winapi,wmi,C#,Winapi,Wmi,我想用一些独特的东西作为授权系统。我决定使用Win32_处理器管理类中的ProcessorID 我在两个不同的系统上试用了相同的处理器类型 它为两个系统显示相同的processorID。我正在使用这个代码 public static String GetCPUId() { String processorID = ""; ManagementObjectSearcher searcher = new ManagementObjectSearcher( "Sele

我想用一些独特的东西作为授权系统。我决定使用Win32_处理器管理类中的ProcessorID

我在两个不同的系统上试用了相同的处理器类型

它为两个系统显示相同的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,最好的办法是创建一个id,它是系统上各种组件id的混合体


硬件的各种值的散列(不仅仅是任何散列,而是具有很少冲突的散列)就足够了。您可能希望使用嵌入在系统中的东西,如处理器、主板信息,但不要使用容易分离/更改的东西,如USB驱动器/集线器等。

对于您要查找的唯一字符串,我们使用MAC地址。如果用户没有安装,我们只允许多个安装。它涵盖了我们想要完成的大多数情况

大多数许可证系统依赖多个硬件组件来创建指纹。没有单个组件用作唯一的唯一键。因此,您可以考虑以下几点:

  • 所有网络适配器的MAC地址(如果它们有扩展底座或在笔记本电脑上启用/禁用无线,则可能会变得棘手)
  • CPUID
  • 主板组件零件号(如IDE或SCSI控制器)
  • 系统驱动器的序列号(不是易于更改的卷ID)
  • 等等
当组合为一个整体时,您将获得机器的唯一表示。当然,当用户在他们的机器上更改某些内容时,危险就来了。他们的驾照丢了吗?他们必须联系你吗

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


执行硬件锁定非常困难。所以我推荐1个。不要这样做或2。购买已经这样做的商业库。

ProcessorID或CPUID用于识别处理器(,)的型号和功能集

奔腾III支持处理器序列号(PSN),这个


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

那么我该怎么办??我能从系统中得到什么独特的东西?我们使用CPUID和MAC地址的组合来生成唯一的id,但不幸的是,后来我们发现办公室中有三台计算机正在生成相同的id:(是的,在我亲眼看到这件事发生之前,我也认为这是不可能发生的,但它确实发生了。@Paul Alexander:我也知道MAC地址是唯一的,因为我在网络课程中学习过。但是你知道吗,在windows中,MAC地址是可以更改的。只需稍微搜索一下。你会得到很多结果我们需要更改MAC。搜索后请告诉我它是否唯一。是的,您可以配置MAC地址,并且您的代码可以检测到。如果您允许在授权指纹中使用伪造的MAC地址,这是代码中的一个错误。@重复的MAC地址在虚拟机进入等式时变得更常见,因为它们确实存在没有唯一分配的MAC地址。我也有同样的问题,但似乎没有答案。这么多年后,你找到答案了吗?@jyz,这取决于你希望ID的唯一性。如果你的付费用户不受服务中断的影响,对你的软件进行一点盗版可能是可以接受的。