11

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

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

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

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

谢谢!

4

1 回答 1

2

一般来说,您需要识别组件的组合,并了解组件可以并且会随着时间的推移而变化。您需要容差算法来做出明智的猜测,即更改何时代表您之前确定的机器的更新,或者您以前从未见过的新机器。

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

专门用于软件激活的这种方法的使用受到积极实施的专利的保护,因此请小心您正在做的事情。如果您确实想这样做以保护您的软件,最好使用商业解决方案。有些是相当实惠的。谷歌“软件激活”选项。

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

硬盘 Windows http://www.codeproject.com/KB/cs/hard_disk_serialno.aspx

硬盘 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/

于 2011-09-16T06:27:40.170 回答