Я пытаюсь получить уникальный идентификатор процессора

Я использую код ниже, чтобы получить уникальный идентификатор процессора, я нашел различные примеры в Интернете, используя это. Тем не мение. Случайно у меня есть 2 ноутбука Asus. Один - четырехъядерный процессор i5, другой - сверхпрочный i7 octocore, оба - 64-битные машины. К моему большому удивлению, они оба выдают один и тот же "уникальный" идентификатор процессора???

Так что этот код не работает для меня, есть ли другие способы получить уникальные идентификаторы процессора или я делаю что-то не так здесь. Я надеюсь получить число, специфичное для каждого процессора

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

foreach (ManagementObject mo in moc)
{
 if (cpuID == "")
 {
      //Remark gets only the first CPU ID
      cpuID = mo.Properties["processorID"].Value.ToString();

 }
}
return cpuID;

5 ответов

Решение

Я пришел к выводу, что это не очень хороший способ получить уникальные идентификаторы. Поэтому вместо этого метода я написал гораздо больший фрагмент кода, в котором я запросил гораздо больше аппаратных идентификаторов системы для создания уникального идентификатора.

Это лучше, так как этот метод будет даже производить разные числа, если я запусту его на клонированном оборудовании или если аппаратное обеспечение будет изменено. Вокруг много информации о WMI, и я думаю, что именно здесь люди должны искать что-то уникальное, а не использовать ProcessorID.

Может быть UUID собственность Win32_ComputerSystemProduct Объект подойдет вашим потребностям. Предполагается, что она будет уникальной для каждой материнской платы, если ее настраивает производитель. В любом случае, процессор не слишком часто перемещается без материнской платы.

Пытаться

ManagementClass managClass = new ManagementClass("win32_processor");
ManagementObjectCollection managCollec = managClass.GetInstances();

foreach (ManagementObject managObj in managCollec)
{
    cpuInfo = managObj.Properties["processorID"].Value.ToString();
    break;
}

работает нормально здесь...

Хотя существует четкая машинная инструкция, запрашивающая CPUID у CPU, это не гарантирует возврата уникального идентификатора, поэтому практически невозможно получить универсальный уникальный CPUID независимо от того, какой метод вы используете. Мы исследовали процедуры сборки на низком уровне и получили одинаковый идентификатор для двух разных процессоров AMD.

    var mbs = new ManagementObjectSearcher("Select ProcessorID From Win32_processor");
    var mbsList = mbs.Get();

    foreach (ManagementObject mo in mbsList)
    {
        cpuid = mo["ProcessorID"].ToString();
        textBox1.Text=cpuid;
    }

Взгляните на этот пост: x86 / x64 CPUID в C#

И этот из моих Закладок: попытка перенести CPUID в C#

Другие вопросы по тегам