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

11

我希望能够在C语言中唯一地标识一个机器。

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

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

对于所有的问号,我应该如何在C语言中获取序列号? 如果你提供了依赖于操作系统的解决方案,请同时提供Windows/*nix两种解决方法。 对于Windows,请不要使用WMI。

谢谢!


你想监视你程序的用户吗? - Jens Gustedt
拥有序列号如何意味着间谍活动? - chacham15
仅仅因为你能够追踪个人行为。想象一下,你把这个功能实现在一个网络浏览器中。那么,无论以哪种网络身份呈现,都可以用来跟踪特定计算机上该浏览器的所有网络访问。因此,这很容易被滥用以侵犯隐私。 - Jens Gustedt
啊,你犯了一个错误。这段代码是客户端可执行文件。不需要序列号,如果程序的目的是跟踪所有计算机使用情况,它本身就可以通过键盘记录来实现。 - chacham15
我只想对一台机器进行身份验证,不想验证其他任何机器。使用Cookie的问题在于它可以被复制,这是一个安全漏洞。此外,任何可以被删除的东西都可以被复制。看到问题了吗? - chacham15
显示剩余2条评论
1个回答

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/

关于Windows链接,我明确说明了不使用WMI。至于Linux BIOS链接,那是版本号,而不是序列号。 - chacham15
@Eric J. 我很感激你提到现有的专利!你知道它什么时候过期吗? - Dave
@supertwang:这是由Uniloc持有的216专利。不确定其过期时间。请参见http://en.wikipedia.org/wiki/Uniloc。 - Eric J.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接