我怎样才能在C中唯一标识一台机器?

我想在C中唯一标识一台机器

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

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

对于所有的问号,我如何获得C中的序列号? 如果您使用依赖于系统的解决scheme进行回答,请提供Windows / * nix。 另外,对于Windows,请不要WMI。

谢谢!

一般来说,您需要确定组件的组合,并了解组件可以随时间变化。 您需要使用容差算法对变更代表您之前识别的计算机的更新时间或以前没有见过的新计算机作出明智的猜测。

一个简单的方法就是枚举当你需要确定你正在处理哪台机器时列出的所有组件,并与以前看过的机器的以前的快照进行比较。 如果序列号相匹配,可以很安全地假设你正在处理同一台机器(尽管当然有人可能将某个硬盘驱动器转移到一台新机器上,但这是简单的方法。等级启发式要复杂得多)。

专门用于软件激活的这种方法的使用受到积极执行的专利的保护,所以要小心你正在做的事情。 如果您确实想要这样做来保护您的软件,那么使用商业解决方案可能会更好。 有些是相当实惠的。 谷歌“软件激活”的选项。

以下是获取特定系统信息的一些参考资料(不是所有的都是特定的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 ++:获取Vista上的网络适配器的MAC地址?

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