如何在C中唯一标识机器?

时间:2011-09-16 06:03:40

标签: c windows linux identification

我想在C中唯一地识别一台机器。

以下是具有序列号的来源,但不保证它们是唯一的或存在的(如可移动的HDD或网卡)。

  • CPU:我正在使用cpuid指令,但是,除Pentium 3之外的任何处理器都没有实现序列号,即不相关。我可以使用处理器签名,但这对于每个处理器来说都不是唯一的。
  • 硬盘:?
  • BIOS:?
  • 主板:?
  • MAC地址:通过系统函数调用。

对于所有问号,我如何获得C中的序列号? 如果您使用系统相关解决方案回答,请同时提供Windows / * nix。 另外,对于Windows,请不要使用WMI。

谢谢!

1 个答案:

答案 0 :(得分:2)

一般来说,您需要确定组件的组合,并了解组件可以并且将随时间发生变化。您需要容差算法来做出明智的猜测,了解更改何时表示您之前识别的计算机的更新,或者您之前未见过的新计算机。

一种简单的方法是枚举您在确定要处理的计算机时列出的所有组件,并与之前看到的计算机的先前快照进行比较。如果序列号匹配的话,你可以非常安全地假设你正在处理同一台机器(当然有人可能会将硬盘转移到新机器上......但是,这就是简单方法。商业级启发式算法要复杂得多。)。

专门用于软件激活的这种方法的使用由积极执行的专利涵盖,因此请小心您正在做什么。如果您确实希望这样做以保护您的软件,那么使用商业解决方案可能会更好。有些很实惠。谷歌“软件激活”的选项。

以下是获取特定系统信息的一些参考资料(并非所有参考资料都是特定的C烹饪书,但在每种情况下都可以使用C语言。)

HDD 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++: Get MAC address of network adapters on Vista?

MAC地址Linux http://www.linuxquestions.org/questions/programming-9/linux-determining-mac-address-from-c-38217/