Что такое хороший уникальный идентификатор ПК?
Я просматривал код этот учебник, и я обнаружил, что он использует My.Computer.Name
для сохранения настроек, которые не должны перемещаться между компьютерами. Однако вполне возможно, что у пользователя есть два идентично названных компьютера. Например, если они хотели иметь одно и то же имя пользователя на каждом ПК, они могут в конечном итоге иметь два компьютера с именем Username-PC.
Какие хорошие методы идентификации разных ПК? У ПК есть связанные с ними идентификаторы GUID, или я должен смотреть на вытягивание серийного номера какого-либо оборудования? Мне все равно, сохраняется ли идентификация при переустановке Windows.
(Учебное пособие, которое я связал, находится в VB.Net, но я реализую его на С#)
Ответы
Ответ 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
Я не думаю, что возможно иметь два компьютера с одинаковым именем в одном домене. Вы пытались захватить доменное имя?
Ответ 9
Взгляните сюда: Получение тега службы от Dell Machine с помощью .net?
Вы можете получить некоторые уникальные данные из реестра.
Ответ 10
Каждый компьютер имеет SID, который уникален при обычных обстоятельствах.
Ответ 11
Здесь приведен пример кода с полными примечаниями here