Как я могу однозначно идентифицировать машину в C? - PullRequest
11 голосов
/ 16 сентября 2011

Я хочу однозначно идентифицировать машину в C.

Ниже приведены источники, имеющие серийные номера, но они не гарантированно являются уникальными или присутствуют (например, съемный жесткий диск или сетевая карта).

  • CPU: я использую инструкцию cpuid, однако серийный номер не реализован ни для одного процессора, кроме Pentium 3, т.е. не имеет значения. Я могу использовать сигнатуру процессора, но она не будет уникальной для каждого процессора.
  • HDD:?
  • BIOS:?
  • материнская плата:?
  • MAC-адрес: через вызовы системных функций.

Для всех вопросительных знаков, как я могу получить серийные номера в C? Если вы отвечаете системно-зависимым решением, укажите обе версии Windows / * nix. Кроме того, для Windows, пожалуйста, не WMI.

Спасибо!

1 Ответ

2 голосов
/ 16 сентября 2011

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

Простым подходом будет перечисление всех перечисленных компонентов, когда вам необходимо определить, с какой машиной вы работаете, и сравнить с предыдущими снимками машин, которые вы видели ранее. Если что-либо с серийным номером совпадает, вы можете с уверенностью предположить, что имеете дело с той же машиной (хотя, конечно, возможно, что кто-то перенес жесткий диск на новую машину ... но тогда это просто ) подход. Эвристика коммерческого уровня намного сложнее.).

Использование этого подхода специально для активации программного обеспечения защищено патентом, который активно применяется, поэтому будьте осторожны с тем, что вы делаете. Если вы хотите сделать это для защиты своего программного обеспечения, может быть лучше использовать коммерческое решение. Некоторые из них вполне доступны. Google "активация программного обеспечения" для вариантов.

Вот некоторые ссылки для получения конкретной системной информации (не все являются конкретными поваренными книгами C, но C может использоваться в каждом случае).

Жесткий диск Windows http://www.codeproject.com/KB/cs/hard_disk_serialno.aspx

HDD Linux http://www.webmasterworld.com/forum40/957.htm

BIOS Windows http://msdn.microsoft.com/en-us/library/aa394077(v=vs.85).aspx

BIOS Linux http://www.dufault.info/blog/a-better-way-to-find-your-bios-version-in-linux/

MAC-адрес Windows C ++: получить MAC-адрес сетевых адаптеров в Vista?

MAC-адрес Linux http://www.linuxquestions.org/questions/programming-9/linux-determining-mac-address-from-c-38217/

...