2009-08-20 6 views
6

Какие «уникальные» системные идентификаторы можно легко получить с помощью C# (для хэша и затем однозначно идентифицировать систему)? Я мог бы просто изменить размер жесткого диска и тому подобное, но мне нужно идентифицировать и отличать компьютеры, которые все построены одними и теми же компонентами, поэтому я не могу этого сделать.Получите уникальные системные идентификаторы в C#

Цените подсказки, идеи, образец кода!

+0

Я был бы осторожен с этим, чтобы вы не заставляли своих клиентов ненавидеть вас. Они должны иметь возможность изменять сетевые карты, жесткие диски и размер памяти, не сообщая вам об этом. –

+4

О, это требование действительно приходит от * клиента :) – Alex

ответ

8

Вот хороший старт с WMI ...

// Win32_CPU will work too 
var search = new ManagementObjectSearcher("SELECT * FROM Win32_baseboard"); 
var mobos = search.Get(); 

foreach (var m in mobos) 
{ 
    var serial = m["SerialNumber"]; // ProcessorID if you use Win32_CPU 
} 

Вы можете сделать это со многими частями аппаратного обеспечения и придумать решение.

+0

Я пробовал это ... но я вижу, что это дни, когда ни один из серийных номеров не поддерживается. Материнская плата, процессор ... MAC меняется, меняя NIC ... что выбрать? – Rick2047

+0

Поскольку Win32_BaseBoard SerialNumber больше не возвращает значение в большинстве случаев, лучшим вариантом является ProcessorID в Win32_Processor – CJxD

+0

Обратите внимание, что ProcessorID равен для всех процессоров того же типа. Если вы протестируете два процессора i7-FooBar, оба будут иметь одинаковый идентификатор. – ANeves

2

Вы можете использовать WMI с C#, чтобы получить довольно много информации об оборудовании.

Идентификаторы жестких дисков и MAC-адрес Ethernet - это два общих уникальных идентификатора, используемых в схемах идентификации системы. MAC-адрес, теоретически, уникален для каждой сетевой карты.

+1

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

+0

Да, я согласен. Вот почему «в теории» :) –

8

Вы можете использовать пространство имен System.Management, чтобы получить все, что связано с аппаратным обеспечением, ProcessorId, MAC-адресами и намного больше информации, которую вы можете использовать вместе с хэшем.

Посмотрите на эту статью:

http://www.codeproject.com/KB/system/GetHardwareInformation.aspx

+0

Чтобы развернуть этот и другие ответы немного: MAC-адрес сетевой карты (-ов) будет уникальным, даже если все машины используют одни и те же компоненты. Я бы начал с этого. Во-вторых, вы должны иметь возможность получать серийные номера материнской платы и процессора, как сказал JP. Те, плюс MAC-адрес физических сетевых адаптеров, должны быть достаточно легкими, чтобы однозначно идентифицировать машину. Просто имейте в виду, что все они могут измениться, если детали заменены. –

+0

MAC-адрес сетевой карты может быть установлен программным обеспечением, поэтому вы не можете рассчитывать на то, что он уникален. С другой стороны, я думаю, что основной диск + mac address + processorId + материнская плата может быть безопасной ставкой. –

2

Предположив вы говорите о Windows, то каждая установка Windows, имеет идентификатор уникальный продукт (который вы можете увидеть при просмотре свойств My Computer) , Я думаю, что это хранится в HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion:ProductId(REG_SZ). Полагаю, вы хотите больше этого?

+0

Это выглядит kool. – Rick2047

0

Вы можете посмотреть в использовании GUID's

+2

+1 Реализация GUID в Microsoft использует MAC-адрес и текущее время, поэтому они в значительной степени гарантируют создание идентификаторов, которые будут уникальными для каждого компьютера. –

2

Сетевая карта MAC-адрес:

foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) 
{ 
    // probably need to do some filtering on ni.NetworkInterfaceType here 
    Console.WriteLine(ni.GetPhysicalAddress()); 
} 
+1

, в то время как это хорошая идея, я ничего не потерпи, если в системе нет сетевого адаптера! – Smith

+1

Это не очень хорошая идея, потому что этот идентификатор изменяется, когда пользователь отключает соединение или если программное обеспечение устанавливает виртуальное соединение. –

 Смежные вопросы

  • Нет связанных вопросов^_^