2010-08-09 3 views
35

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

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

(Обучающий я связан в VB.Net, но я его реализация в C#)

+0

http://stackoverflow.com/questions/671876/whats-a-good-way-to-uniquely-identify-a-computer –

+0

http://stackoverflow.com/questions/99880/generating-a-unique -machine-id –

ответ

35

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

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

+1 Да, будьте осторожны с MAC. У меня было много проблем до того, как MAC изменился и был дублирован. PITA. –

+0

Осторожно: я видел случаи, когда процессор (ноутбука) поджаривался и должен был быть заменен. Новый CPU, новый CPUID. –

+1

@Steven: Хорошая точка. Как правило, я бы счел его одним из «самых надежных» идентификаторов в системе. Сбой CPU относительно необычен (по сравнению с отказом HD). Следует также отметить, что при запуске виртуализации этот номер может быть загипнотизирован. – mattbasta

0

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

+1

У меня есть 2 компьютера в одном домене с тем же именем :-) Я дважды загружаю между xp и win 7 ... хотя еще не загрузился в xp fr за 2 недели – SQLMenace

+0

@SQLMenace: Если это не так, тот же SID, сеть по-прежнему рассматривает их как разные блоки. –

+0

Это тот же самый ящик. Мне нужно было сделать некоторые причудливые вещи, чтобы сделать это в домене из обоих ящиков. – SQLMenace

0

Посмотрите здесь: Getting Service Tag from Dell Machine using .net?

Вы могли бы вырвать некоторые уникальные данные из реестра.

+0

И когда изменяется реестр ... –

+0

Стивен, эти конкретные значения являются аппаратными. – JonH

+1

Аппаратные изменения. Дисковые накопители, CPU, все это. Когда он ломается, он заменяется. –

1

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

+3

Почему это принятый ответ? Что это за SID и как его получить? – Marek

+2

И это даже неправильно. Удалите отметку из этого ответа. SID (идентификатор безопасности) - это идентификатор, сгенерированный при установке окон. Очень маловероятно, что на двух компьютерах будет одинаковый SID. SID изначально был разработан для идентификации пользователей по сети. Почему это не достаточно хорошо? Поскольку, если компьютер не был установлен с нуля, но был установлен с изображения, то он будет иметь тот же SID исходного компьютера. Этот метод установки компьютеров очень распространен в больших сетях, поэтому SID является плохим выбором на практике. – DiGMi

+0

@DiGMi, вы правы в клонировании, в результате чего тот же SID. Вот почему я сказал «при нормальных обстоятельствах». Как вы упомянули в своем ответе, некоторые компании, которые устанавливают клонированные изображения, восстанавливают SID. –

1

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

+2

Чем больше источников вы используете, тем более надежным. Однако чем больше источников вы используете, тем более уязвимы вы к ложным срабатываниям. –

14

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

+1

Это номер, используемый Windows для определения того, когда он был установлен на другую машину? –

+0

@Steven Sudit, Да, я считаю, что это число генерируется хешем из нескольких фрагментов HW-информации, окна серийный ключ и временную метку. Когда вы активируете окна, они отправляют серийный ключ и этот код и сохраняют код на своих серверах. –

+0

Вот страница wiki talk abou t, как они сгенерированы. http://wiki.lunarsoft.net/wiki/Product_IDs –

2

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

Реальный ответ на этот вопрос: Там нет такого понятия.

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

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

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

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

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

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

9

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

Очень опасно использовать серийный номер Bios, так как вы можете получить много этих (идентичных!) Строк: «Чтобы быть заполненным O.E.M.». – movAX13h

0

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