Как получить уникальный идентификатор системы

Мне нужен уникальный идентификатор системы. Я использовал processid, но он также не уникален для всех ПК. Итак, я получаю серийный номер процессора.

Я использую WMI, чтобы получить серийный номер. // Win32_CPU

var search = new ManagementObjectSearcher( "SELECT * FROM Win32_baseboard" );
var mobos = search.Get();

foreach (var m in mobos)
{
  var serial = m["SerialNumber"]; // ProcessorID if you use Win32_CPU
}

Но возвращаетсяЗаполняется О.М.М."

Почему он не возвращает точный серийный номер.

Пожалуйста, дайте мне знать, как я могу это исправить.

Ответы на вопрос(4)

OEM, который собрал компьютер, никогда не вводил серийный номер.

Чтобы это исправить, вы можете собрать свой собственный компьютер и правильно ввести серийный номер.

 Bear Monkey29 сент. 2010 г., 18:17
«Чтобы исправить это, вы можете собрать свой собственный компьютер и правильно ввести серийный номер», намеренно легкомысленно?

Закончил дело с MAC-адресом, которое ужасно сломалось, поскольку мы быстро нашли несколько дубликатов только на 10 тысячах пользователей. У нас были проблемы в тот день, когда продукт умер.

Другой проект нуждался в подобном решении, и мы попробовали NTFS Id для диска C: \. Мы выдвинули эту идею и затем рассмотрели идентификатор машины Win32, который, конечно, также был отброшен.

Наконец, мы остановились на следующем: мы создали Guid, зашифровали его с помощью ключа машины RSA и поместили в реестр.

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

static class MachineKey
{
    const byte[] ENTROPY = null;
    const string KEY_PATH = @"HKEY_LOCAL_MACHINE\SOFTWARE\company-name-goes-here";

    public static Guid Get()
    {
        try
        {
            string base64 = Microsoft.Win32.Registry.GetValue(KEY_PATH, "HostId", null) as string;
            if (base64 == null) 
                return Create();

            byte[] cypher = System.Convert.FromBase64String(base64);
            byte[] bytes = System.Security.Cryptography.ProtectedData.Unprotect(cypher, ENTROPY, 
                System.Security.Cryptography.DataProtectionScope.LocalMachine);

            if (bytes.Length != 20 || bytes[0] != 'H' || bytes[1] != 'o' || bytes[2] != 's' || bytes[3] != 't')
                return Create();

            byte[] guid = new byte[16];
            Array.Copy(bytes, 4, guid, 0, 16);
            return new Guid(guid);
        }
        catch
        {
            return Create();
        }
    }

    static Guid Create()
    {
        byte[] prefix = new byte[] { (byte)'H', (byte)'o', (byte)'s', (byte)'t' };
        Guid id = Guid.NewGuid();
        byte[] store = new byte[20];
        Array.Copy(prefix, store, 4);
        Array.Copy(id.ToByteArray(), 0, store, 4, 16);

        store = System.Security.Cryptography.ProtectedData.Protect(store, ENTROPY,
            System.Security.Cryptography.DataProtectionScope.LocalMachine);

        Microsoft.Win32.Registry.SetValue(KEY_PATH, "HostId", System.Convert.ToBase64String(store));
        return id;
    }
}
 SLaks29 сент. 2010 г., 19:59
byte[] prefix = Encoding.ASCII.GetBytes("Host")
 r3plica15 окт. 2013 г., 12:32
Ваш ответ был именно таким, каким я был после +1
 Bear Monkey29 сент. 2010 г., 20:06
Что делать, если ОС установлена ​​на съемный диск? Я не знаю, может ли Windows загружаться с карты памяти USB. Комбинация идентификаторов GUID и идентификаторов оборудования может решить эту проблему.
 csharptest.net30 сент. 2010 г., 17:04
Я ожидал, что это было ваше использование. Вы должны быть в состоянии переместить лицензию с одного идентификатора на другой. Что делать, если я обновляю или заменяю материнскую плату, процессор, диск и т. Д. Я не думаю, что вы можете избежать этой проблемы.
 SLaks29 сент. 2010 г., 20:00
Обратите внимание, что ключ машины может измениться.
 Adil Fazal30 сент. 2010 г., 16:45
Мне это нужно для лицензирования одного компьютера. Я не могу пресистить GUI в реестре. Потому что мне нужно разрешить пользователю устанавливать программное обеспечение, если он установил новую ОС.
 csharptest.net30 сент. 2010 г., 01:50
Я думаю, все сводится к тому, что вы пытаетесь определить и почему. Для чего-то вроде схемы лицензирования SAS это работает достаточно хорошо.

Распространенным подходом является использование MAC-адреса сетевой карты. Это может быть изменено, но для большинства целей его достаточно хорошо.

public PhysicalAddress GetMacAddress()
{
    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
    {
        if (nic.OperationalStatus == OperationalStatus.Up)
        {
            return nic.GetPhysicalAddress();
        }
    }

    return null;
}

Вы также можете попробовать Win32_Processor, Win32_Bios или их комбинацию. Под этим я подразумеваю идентификаторы concat из нескольких компонентов системы, чтобы сгенерировать уникальный идентификатор для системы, поэтому не имеет значения, если, например, один из идентификаторов компонентов не является уникальным. Это, конечно, проблема в том, что при изменении компонента уникальный идентификатор изменяется.

 Rev1.011 янв. 2013 г., 13:28
Чтобы указать на потенциальную ловушку с этим решением: условие «if (nic.OperationalStatus == OperationalStatus.Up)» требует, чтобы адаптер действительно был подключен к сети (мог передавать пакеты данных).

Вы пробовали вWin32_BIOS ?

 oleksii21 авг. 2012 г., 09:53
@Ruel это появилось во вкладке обзора как некачественный пост, это только один из готовых ответов.
 Ruel21 авг. 2012 г., 04:22
@oleksii Ты понимаешь, что это был двухлетний ответ. Это не субъективное утверждение, а этоМожно дать правильное решение, если только оно не вернуло пустую строку.
 Adil Fazal29 сент. 2010 г., 18:29
Серийный номер Win32_BIOS возвращает пустую строку
 oleksii19 авг. 2012 г., 13:00
Это действительно комментарий, а не ответ на вопрос. Пожалуйста, используйте "Добавить комментарий", чтобы оставить отзыв для автора.

Ваш ответ на вопрос