Что такое хороший уникальный идентификатор ПК? - PullRequest
41 голосов
/ 09 августа 2010

Я просматривал код в этого урока и обнаружил, что он использует My.Computer.Name для сохранения настроек, которые не должны перемещаться между компьютерами.Однако для пользователя вполне возможно иметь два ПК с одинаковыми именами.Например, если они хотят иметь одно и то же имя пользователя на каждом ПК, у них может получиться два ПК с именем Username-PC.

Каковы хорошие методы идентификации разных ПК?Есть ли у ПК идентификаторы GUID, связанные с ними, или я должен изучить возможность удаления серийного номера какого-либо оборудования?Мне все равно, если идентификация сохраняется после переустановки Windows.

(Учебник, который я связал, находится в VB.Net, но я реализую его в C #)

Ответы [ 10 ]

43 голосов
/ 09 августа 2010

Несколько хороших идентификаторов:

  • MAC-адрес: на него довольно легко попасть, и он обычно уникален.Однако его можно легко подделать / изменить, поэтому это зависит от того, насколько уникальным он должен быть.
  • Серийный номер ЦП: он недоступен на многих старых системах, но он есть.Проверьте эту страницу MSDN .Он не изменится, но будет привязан к компьютеру.
  • Серийный номер жесткого диска: скорее всего, он не изменится, но может привести к неприятностям в случае сбоя жесткого диска.Проверьте эту страницу MSDN .
18 голосов
/ 09 августа 2010

Если у вас Windows HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ CurrentVersion\ProductId уникально для каждой машины / для каждой установки Windows.где, как и в некоторых других ответах, таких как MAC-адрес, Proc SN и HD SN, остаются неизменными между переустановками Windows / ситуациями двойной загрузки.

11 голосов
/ 22 сентября 2012

Реальный ответ на этот вопрос: такой вещи не существует.

Существует несколько «достаточно близких» решений, но у каждого из них есть свои ограничения.

Все оборудованиеИдентификаторы - Аппаратные изменения.И во многих случаях вы можете изменить эти идентификаторы (например, спуфинг MAC).

SID, как я уже прокомментировал, также не так хорош, потому что SID не изменится, есликомпьютер был установлен из образа.SID генерируется установкой Windows, если окна не были установлены, но скопированы из образа, SID не изменится (хотя обычно его восстанавливают из-за мифа о «угрозе безопасности» - вы не можете рассчитывать на это).

Имя компьютера - Ну, как уже упоминалось, они предполагают, что они уникальны, но никак не применяются.

Другое решение, которое вы можете реализовать,создать свой собственный уникальный идентификатор и хранить его локально (при условии, что вы можете сделать это).Опять же, это решение не будет работать, если ваш компьютер был создан с приложением.

Лучшее решение для вас действительно зависит от того, чего вы пытаетесь достичь.У меня была такая же проблема с довольно большой сетью, и лучшим решением в моем случае было имя компьютера.Если вы абсолютно уверены, что ваш процесс не будет отображаться, я сгенерирую уникальный идентификатор с помощью Guid, поскольку он, вероятно, будет самым безопасным.

9 голосов
/ 05 марта 2013

Вот способ уникальной идентификации компьютера. Используя System.Management для получения Win32_BIOS, вы можете получить уникальные значения из BIOS вашей машины.

См .: класс Win32_BIOS, http://msdn.microsoft.com/en-us/library/aa394077.aspx

using System.Management;

string UniqueMachineId()
{
    StringBuilder builder = new StringBuilder();

    String query = "SELECT * FROM Win32_BIOS";
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
    //  This should only find one
    foreach (ManagementObject item in searcher.Get())
    {
        Object obj = item["Manufacturer"];
        builder.Append(Convert.ToString(obj));
        builder.Append(':');
        obj = item["SerialNumber"];
        builder.Append(Convert.ToString(obj));
    }

return builder.ToString();
}

С подобной логикой вы также можете пройти через "Win32_DiskDrive"; http://msdn.microsoft.com/en-us/library/aa394132.aspx; и получить «SerialNumber» для каждого физического диска. В этом случае

    foreach (ManagementObject item in searcher.Get())

должен найти несколько предметов

5 голосов
/ 11 сентября 2017

Возьмите три идентификатора, которые являются полуединственными и полупостоянными.Используйте правило, что 2 из 3 достаточно для положительной идентификации.Обновите зарегистрированные данные для 1 из 3, что иногда неправильно.

2 голосов
/ 09 августа 2010

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

Пример кода для этого:

public string GetMACAddress() {
    ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
    ManagementObjectCollection moc = mc.GetInstances();

    string MACAddress = String.Empty;

    foreach (ManagementObject mo in moc) {
        if (MACAddress == String.Empty) { // only return MAC Address from first card
            if ((bool)mo["IPEnabled"] == true) MACAddress = mo["MacAddress"].ToString();
        }
        mo.Dispose();
    }

    return MACAddress;
}
1 голос
/ 09 августа 2010

Одна вещь, которую вы можете использовать, это MAC-адрес любого сетевого интерфейса.Вы также можете объединить несколько источников информации.Как и HDD Serial number, mac, тип процессора для вычисления хеша из него.

0 голосов
/ 09 августа 2010

Каждый компьютер имеет уникальный идентификатор безопасности в обычных условиях.

0 голосов
/ 09 августа 2010

Посмотрите здесь: Получение метки обслуживания с компьютера Dell с использованием .net?

Вы можете выхватить некоторые уникальные данные из реестра.

0 голосов
/ 09 августа 2010

Я не думаю, что возможно иметь два компьютера с одинаковым именем в одном домене. Вы пытались захватить доменное имя?

...