C# 两台Intel机器上的CPU ID相同

C# 两台Intel机器上的CPU ID相同,c#,C#,可能重复: 我正在创建一个具有试用功能的应用程序。要检测某个用户是否已使用试用版,应用程序将使用其机器连接到我的服务器hash machineHash功能如下所示: string cpuInfo = string.Empty; ManagementClass mc = new ManagementClass("win32_processor"); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementOb

可能重复:

我正在创建一个具有试用功能的应用程序。要检测某个用户是否已使用试用版,应用程序将使用其
机器连接到我的服务器hash

machineHash
功能如下所示:

string cpuInfo = string.Empty;
ManagementClass mc = new ManagementClass("win32_processor");
ManagementObjectCollection moc = mc.GetInstances();

foreach (ManagementObject mo in moc)
{
    if (cpuInfo == "")
    {
        //Get only the first CPU's ID
        cpuInfo = mo.Properties["processorID"].Value.ToString();
        break;
    }
}
return cpuInfo;
using System.Management;
ManagementObjectSearcher searcher = new ManagementObjectSearcher(
"select * from " + whatever_id);
但是,它确实将我的处理器ID报告为
BFEBFBFF000206A7
(在两台不同的Intel机器上,i5和Celeron)。Google
BFEBFBFF000206A7
也有点击率,所以它不是唯一的


有人能告诉我为什么这不是唯一的吗?我不想使用
C:\
驱动器的VolumeSerial,因为它可以通过简单的命令轻松更改。

不要使用处理器ID,而是将系统的多个ID组合成一个字符串,以便在程序每次发送检查时进行比较

使用类似以下内容:

string cpuInfo = string.Empty;
ManagementClass mc = new ManagementClass("win32_processor");
ManagementObjectCollection moc = mc.GetInstances();

foreach (ManagementObject mo in moc)
{
    if (cpuInfo == "")
    {
        //Get only the first CPU's ID
        cpuInfo = mo.Properties["processorID"].Value.ToString();
        break;
    }
}
return cpuInfo;
using System.Management;
ManagementObjectSearcher searcher = new ManagementObjectSearcher(
"select * from " + whatever_id);
可以在此处找到可以替换任何_id的所有值:


我会找到一些您想要使用的,其中一些可以是唯一的,但即使您不使用唯一字段,您也可以进行组合,在大多数情况下,这些组合都是唯一的。

考虑使用/添加用户机器上的MAC地址到您的方案中,但是您需要更多的信息才能正常工作。MAC地址可能是伪造的。我不相信这一点。@DWright不,因为你会有其他问题(就像笔记本电脑一样,它们大多都有有线和无线以及其他(VPN)适配器)。我只需要一些简单的东西。也许CPUID甚至在根本上存在缺陷:EAX=3“此功能不再实现”是的,上面的警告就是我说需要更多的原因。我只提到了MAC地址,因为在一个幼稚的实现中,这可以被认为是唯一的,但是欺骗MAC地址的问题仍然存在。在任何情况下,您都必须做一些工作,以确保获得真正适配器的地址(不是虚拟的,不是vpn,不是环回)。我认为你可以从各种评论中看出,你可能需要找到一种更稳健的方法。