С# Создание уникального идентификатора на основе идентификаторов оборудования
Я создаю лицензию, специфичную для машины. Лицензия основана на следующих элементах:
- MAC-адрес
- Серийный номер процессора
- Объем компьютера Последовательный номер диска0
Я предполагаю, что если 2 из 3 соответствуют, то моя лицензия действительна. Таким образом, может появиться новая сетевая карта, и лицензия все еще действительна и т.д.
Является ли это хорошим подходом или у меня возникнут проблемы с тем, что это не соответствует или не меняется регулярно?
Я пытаюсь получить уникальный идентификатор для компьютера, чтобы я мог проверить лицензию.
Пожалуйста, дайте мне знать, как это выглядит или у вас есть лучшее решение!
Еще раз спасибо!
** ЗДЕСЬ, ЧТО Я ПРИНИМАЮ С **
В итоге я использовал только VolumeSerial, CpuId и VideoControllerDescription.
public enum HardwareProfileComponents
{
ComputerModel,
VolumeSerial,
CpuId,
MemoryCapacity,
VideoControllerDescription
}
public static Dictionary<string, string> HardwareProfile()
{
var retval = new Dictionary<string, string>
{
{HardwareProfileComponents.ComputerModel.ToString(), GetComputerModel()},
{HardwareProfileComponents.VolumeSerial.ToString(), GetVolumeSerial()},
{HardwareProfileComponents.CpuId.ToString(), GetCpuId()},
{HardwareProfileComponents.MemoryCapacity.ToString(), GetMemoryAmount()},
{HardwareProfileComponents.VideoControllerDescription.ToString(), GetVideoControllerDescription()}
};
return retval;
}
private static string GetVideoControllerDescription()
{
Console.WriteLine("GetVideoControllerDescription");
var s1 = new ManagementObjectSearcher("select * from Win32_VideoController");
foreach (ManagementObject oReturn in s1.Get())
{
var desc = oReturn["AdapterRam"];
if ( desc == null) continue;
return oReturn["Description"].ToString().Trim();
}
return string.Empty;
}
private static string GetComputerModel()
{
Console.WriteLine("GetComputerModel");
var s1 = new ManagementObjectSearcher("select * from Win32_ComputerSystem");
foreach (ManagementObject oReturn in s1.Get())
{
return oReturn["Model"].ToString().Trim();
}
return string.Empty;
}
private static string GetMemoryAmount()
{
Console.WriteLine("GetMemoryAmount");
var s1 = new ManagementObjectSearcher("select * from Win32_PhysicalMemory");
foreach (ManagementObject oReturn in s1.Get())
{
return oReturn["Capacity"].ToString().Trim();
}
return string.Empty;
}
private static string GetVolumeSerial()
{
Console.WriteLine("GetVolumeSerial");
var disk = new ManagementObject(@"win32_logicaldisk.deviceid=""c:""");
disk.Get();
string volumeSerial = disk["VolumeSerialNumber"].ToString();
disk.Dispose();
return volumeSerial;
}
private static string GetCpuId()
{
Console.WriteLine("GetCpuId");
var managClass = new ManagementClass("win32_processor");
var managCollec = managClass.GetInstances();
foreach (ManagementObject managObj in managCollec)
{
//Get only the first CPU ID
return managObj.Properties["processorID"].Value.ToString();
}
return string.Empty;
}
Ответы
Ответ 1
Вот довольно приличная статья о том, как MS это сделала с Windows XP. Возможно, не совсем то, что вы ищете, но это отличная точка перехода.
Развернуть объяснение Windows XP
Какое оборудование проверяет Windows?
Система проверяет эти десять категорий аппаратного обеспечения:
- Адаптер отображения
- Адаптер SCSI
- Адаптер IDE (фактически, материнская плата)
- Сетевой адаптер (NIC) и его MAC-адрес
- Объем оперативной памяти (т.е. 0-64mb, 64-128mb и т.д.).
- Тип процессора
- Серийный номер процессора
- Устройство жесткого диска
- Серийный номер тома жесткого диска (VSN)
- CD-ROM/CD-RW/DVD-ROM
Ответ 2
Не совсем ответ, а слово предостережения. Я работал в компании-разработчике программного обеспечения, которая выполняла аналогичный механизм лицензирования, и она была... хрупкой. Особенно на ноутбуках. Рассмотрим:
-
При переключении между проводной и беспроводной сетью на ноутбуке у вас будет отдельный MAC-адрес на каждом интерфейсе.
-
При изменении MAC-адреса могут быть преимущества. например, некоторые провайдеры кабельного интернета в штатах глупо связывают ваш MAC-адрес с вашей учетной записью, и, возможно, придется подключить их компьютер прямо к кабельному модему, а затем клонировать их MAC-адрес маршрутизатора, если их маршрутизатор должен умереть.
-
Если пользователь загружался с другого жесткого диска (например, флеш-накопителя или USB-накопителя), изменилось бы то, что сообщалось как первый диск?
И это было задолго до дней виртуализации товара. Теперь подумайте, что вы можете переключать настройки и перезагружать свою виртуальную машину и иметь: различный объем оперативной памяти, жесткий диск другого размера, тип типа виртуального жесткого диска (IDE, SCSI, возможно, несколько интерфейсов контроллера SCSI). И вы можете подключать CD/DVD-устройства с горячей заменой и изменять настройки NIC с помощью мыши.
Поэтому я не говорю "не делай этого" точно, но я попрошу вас протестировать этот механизм на столько машин, сколько вы можете, и я буду предлагать, чтобы ваш у пользователей будет очень мало терпения, если они не смогут запустить программное обеспечение, за которое они заплатили.
Вы рассматривали аппаратные ключи?
Ответ 3
Я обнаружил, что MAC-адрес сейчас не стоит проверять. Каждый компьютер имеет более одного сетевого адаптера, любой из которых может быть внешним устройством, которое может или не может присутствовать в любой момент времени. Мы выкатили систему, которая много лет уделяла много внимания MAC-адресу, и это в конечном итоге стало катастрофой обслуживания клиентов.
С другой стороны, относительно редко можно заменить ваш процессор, материнскую плату, контроллеры шины/диска или основной жесткий диск.