Как получить уникальный идентификатор системы - PullRequest
0 голосов
/ 29 сентября 2010

Мне нужен уникальный идентификатор системы. Я использовал 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 ]

4 голосов
/ 29 сентября 2010

Мне нужно было решить ту же проблему раньше.

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

В другом проекте требовалось аналогичное решение, и мы попробовали 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;
    }
}
3 голосов
/ 29 сентября 2010

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

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

0 голосов
/ 29 сентября 2010

«Мне нужен уникальный идентификатор системы.»

Распространенным подходом является использование 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 из нескольких компонентов системы, чтобы сгенерировать уникальный идентификатор для системы, поэтому не имеет значения, если, например, один из идентификаторов компонентов не является уникальным.Это, конечно, проблема в том, что при изменении компонента уникальный идентификатор изменяется.

0 голосов
/ 29 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...