Подтвердить что ты не робот

Что такое хороший уникальный идентификатор ПК?

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

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

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

4b9b3361

Ответ 1

Некоторые хорошие идентификаторы:

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

Ответ 2

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

Ответ 3

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

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

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

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

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

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

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

Ответ 4

Вот способ уникальной идентификации компьютера. Используя 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

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

Ответ 6

Используйте 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;
}

Ответ 7

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

Ответ 8

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

Ответ 10

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

Ответ 11

Здесь приведен пример кода с полными примечаниями here