Что такое хороший уникальный идентификатор ПК?
Я смотрел на код в этом руководстве, и я обнаружил, что он использует My.Computer.Name
сохранить настройки, которые не должны перемещаться между компьютерами. Однако для пользователя вполне возможно иметь два ПК с одинаковыми именами. Например, если они хотят иметь одинаковое имя пользователя на каждом ПК, у них может получиться два компьютера с именем Username-PC.
Каковы хорошие методы идентификации разных компьютеров? Есть ли у ПК идентификаторы GUID, связанные с ними, или я должен изучить возможность удаления серийного номера какого-либо оборудования? Мне все равно, если идентификация сохраняется через переустановку Windows.
(Учебник, на который я ссылаюсь, находится в VB.Net, но я реализую его в C#)
10 ответов
Несколько хороших идентификаторов:
- MAC-адрес: довольно легко получить, и обычно он уникален. Однако его можно довольно легко подделать / изменить, так что это зависит от того, насколько уникальным он должен быть.
- Серийный номер процессора: он недоступен на многих старых системах, но он есть. Проверьте эту страницу MSDN. Это не изменится, но связано с компьютером.
- Серийный номер жесткого диска: скорее всего, он не изменится, но может привести к неприятностям в случае отказа жесткого диска. Проверьте эту страницу MSDN.
Если вы на окнах HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ CurrentVersion\ProductId
уникален для каждой машины / установки Windows. где, как и в некоторых других ответах, таких как MAC-адрес, Proc SN и HD SN, остаются неизменными между переустановками Windows / двойной загрузкой.
Реальный ответ на этот вопрос: такого нет.
Есть несколько "достаточно близких" решений, но каждое из них имеет свои ограничения.
Все аппаратные идентификаторы - Аппаратные изменения. И во многих случаях вы можете изменить эти идентификаторы (например, подмена MAC).
SID, как я уже прокомментировал, тоже не так хорош, потому что SID не изменится, если компьютер был установлен из образа. SID генерируется установкой Windows, если окна не были установлены, но скопированы из образа, SID не изменится (хотя обычно его восстанавливают из-за мифа о "угрозе безопасности" - вы не можете сосчитать на что).
Имя компьютера - Ну, как уже упоминалось, они предполагают, что они уникальны, но никак не применяются.
Другое решение, которое вы можете реализовать, - это сгенерировать свой уникальный идентификатор и сохранить его локально (при условии, что вы можете сделать это). Опять же, это решение не будет работать, если ваш компьютер был создан с приложением.
Лучшее решение для вас действительно зависит от того, что вы пытаетесь достичь. У меня была такая же проблема с довольно большой сетью, и лучшим решением в моем случае было имя компьютера. Если вы абсолютно уверены, что ваш процесс не будет отображаться, я сгенерирую уникальный идентификатор с помощью Guid, потому что он, вероятно, будет самым безопасным.
Вот способ уникальной идентификации компьютера. Используя 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())
должен найти несколько предметов
Возьмите три идентификатора, которые являются полуединственными и полупостоянными. Используйте правило, что 2 из 3 достаточно для положительной идентификации. Обновите зарегистрированные данные для 1 из 3, что иногда неправильно.
Используйте 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;
}
Мы используем комбинацию ProcessorID
из Win32_processor
и UUID
из Win32_ComputerSystemProduct
:
ManagementObjectCollection mbsList = null;
ManagementObjectSearcher mos = new ManagementObjectSearcher("Select ProcessorID From Win32_processor");
mbsList = mos.Get();
string processorId = string.Empty;
foreach (ManagementBaseObject mo in mbsList)
{
processorId = mo["ProcessorID"] as string;
}
mos = new ManagementObjectSearcher("SELECT UUID FROM Win32_ComputerSystemProduct");
mbsList = mos.Get();
string systemId = string.Empty;
foreach (ManagementBaseObject mo in mbsList)
{
systemId = mo["UUID"] as string;
}
var compIdStr = $"{processorId}{systemId}";
Раньше мы использовали комбинацию: ID процессора ("Select ProcessorID From Win32_processor"
) и серийный номер материнской платы ("SELECT SerialNumber FROM Win32_BaseBoard"
), но потом выяснилось, что серийный номер материнской платы может быть не заполнен, а может быть заполнен единообразными значениями:
- Заполняется OEM
- Никто
- Строка по умолчанию
Поэтому стоит учесть эту ситуацию.
Также имейте в виду, что ProcessorID
номер может быть одинаковым на разных компьютерах.
Одна вещь, которую вы можете использовать, это MAC-адрес любого сетевого интерфейса. Вы также можете объединить несколько источников информации. Как и HDD Serial number, mac, тип процессора для вычисления хеша из него.
Я не думаю, что возможно иметь два компьютера с одним и тем же именем в одном домене. Вы пытались захватить доменное имя?
Каждый компьютер имеет уникальный идентификатор безопасности в обычных условиях.
В управляемой сетевой среде лучшим и наиболее надежным идентификатором может быть тот, который вы создаете, но есть некоторые недостатки.
Некоторые (многие?) Производители предоставляют утилиту, которая позволяет вам установить метку ресурса, которая хранится в прошивке. Это может быть загрузочная утилита, она может работать в Windows или даже может быть встроена в установку прошивки. Этот "тег" представляет собой произвольную текстовую строку, в которой вы можете установить все, что захотите, а затем прочитать ее, используя WMI и Win32_SystemEnclosure
класс...
string[] selectedProperties = new string[] { "SMBIOSAssetTag" };
ObjectQuery enclosureQuery = new SelectQuery("Win32_SystemEnclosure", null, selectedProperties);
using (ManagementObjectSearcher enclosureSearcher = new ManagementObjectSearcher(enclosureQuery))
using (ManagementObjectCollection enclosureCollection = enclosureSearcher.Get())
{
foreach (ManagementObject enclosure in enclosureCollection)
{
string assetTag = (string) enclosure.GetPropertyValue("SMBIOSAssetTag");
}
}
Плюсы:
- Вы можете использовать любую схему, которую хотите (например, включение даты, отдела, приращения целых чисел, GUID и т. Д.).
- Вы можете использовать одну схему для всех машин независимо от их производителя, вместо того, чтобы обрабатывать схемы, специфичные для производителя.
- Выделяя и отслеживая идентификаторы самостоятельно, вы можете гарантировать их уникальность. Если не полагаться на идентификатор, установленный производителем, это означает, что отсутствует риск дублирования внутри производителя или между производителями.
- Идентификатор хранится в прошивке, а не на жестком диске, поэтому он выдержит переформатирование, обновления и т. Д., Но также не будет дублироваться при резервном копировании / создании образов / клонировании.
Минусы:
- Вам действительно нужно установить тег актива; они все будут пустыми, пока вы этого не сделаете.
- Для установки тега ресурса машины может потребоваться физический доступ и перезагрузка.
- Теги ресурсов нельзя записывать однократно, и поэтому их можно изменить или стереть.
- Прошивка, защищенная паролем, должна запрашивать этот пароль перед изменением тега, но это не гарантируется.
- При самостоятельном выделении и отслеживании идентификаторов возникают не только накладные расходы на... выделение и отслеживание идентификаторов, но также вероятность того, что вы создадите дубликаты, если не будете осторожны.
- Использование тегов ресурсов для этой цели требует, чтобы все машины поддерживали установку тега ресурсов и должным образом сообщали об этом в WMI.
Посмотрите здесь: Получение метки обслуживания от Dell Machine с использованием.net?
Вы можете выхватить некоторые уникальные данные из реестра.
По этой ссылке есть образец кода с полными примечаниями для получения идентификатора CPU и HD Drive: http://www.vcskicks.com/hardware_id.php
добавить эту dll в ссылки
System.Management.dll
для идентификатора процессора:
string cpuInfo = string.Empty;
ManagementClass mc = new ManagementClass("win32_processor");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
if (cpuInfo == "")
{
//Get only the first CPU's ID
cpuInfo = mo.Properties["processorID"].Value.ToString();
break;
}
}
return cpuInfo;
и для идентификатора жесткого диска (серийный том):
ManagementObject dsk = new ManagementObject(@"win32_logicaldisk.deviceid=""" + drive + @":""");
dsk.Get();
string volumeSerial = dsk["VolumeSerialNumber"].ToString();