我想在C中唯一地识别一台机器。
以下是具有序列号的来源,但不保证它们是唯一的或存在的(如可移动的HDD或网卡)。
cpuid
指令,但是,除Pentium 3之外的任何处理器都没有实现序列号,即不相关。我可以使用处理器签名,但这对于每个处理器来说都不是唯一的。对于所有问号,我如何获得C中的序列号? 如果您使用系统相关解决方案回答,请同时提供Windows / * nix。 另外,对于Windows,请不要使用WMI。
谢谢!
答案 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/