如何使用C#唯一标识计算机?

12

如何使用C#(.Net/Mono, 本地应用程序)唯一标识计算机(主板)?

附注. 我们可以像这样使用.Net来识别主板(详见Get Unique System Identifiers in C#):

using System.Management;
...
ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_MotherboardDevice");
...

但是不幸的是,Mono不支持System.Management。如何在Linux下使用Mono实现它?- 我不知道 :(

5个回答

13
编写一个函数,它以几个唯一的硬件参数作为输入,并生成一个哈希值。
例如,Windows激活会查看以下硬件特征:
  • 显示适配器
  • SCSI适配器
  • IDE适配器(实际上是主板)
  • 网络适配器(NIC)及其MAC地址
  • RAM数量范围(即0-64mb、64-128mb等)
  • 处理器类型
  • 处理器序列号
  • 硬盘设备
  • 硬盘卷序列号(VSN)
  • CD-ROM / CD-RW / DVD-ROM
您可以选择其中几个来生成您的唯一计算机标识符。

5
另一方面,您可能希望将它们分开。这将允许例如增加更多内存,并且只要更改一次一个,就可以进行更改。 - Guffa
生成哈希的想法不错。 - Matt Hanson


4

在实际操作中,您可以获取主板ID、CPU ID、磁盘序列号和MAC地址,但从经验来看,它们都不是100%可靠的。

我们的数据显示:

  • 磁盘序列号缺失0.1%
  • MAC地址缺失1.3%
  • 主板ID缺失30%
  • CPU ID缺失99%

0.04%的机器测试没有提供任何信息,我们甚至无法读取计算机名称。这可能是某种虚拟PC、HyperV或VMWare实例,或者可能只是非常安全的设定?无论如何,您的设计必须能够处理这些情况。

磁盘序列号是最可靠的,但易受更改;MAC地址也可以更改,而且根据读取时应用的过滤器,如果添加了设备驱动程序(例如Hyperv、Wireshark等),则可能会发生变化。

主板ID和CPU ID有时会返回无效的值,如“NONE”、“AAAA..”、“XXXX...”等。

您还应该注意,调用这些函数可能非常缓慢(即使在快速PC上也可能需要几秒钟),因此最好尽早在后台线程中启动它们,理想情况下不要在它们上面阻塞。


3

试试这个:

http://carso-owen.blogspot.com/2007/02/how-to-get-my-motherboard-serial-number.html

个人而言,我会选择硬盘序列号。如果主板损坏并更换了,那么该计算机将不再有效。如果更换了硬盘驱动器,则不太重要,因为软件已经在其中。

当然,另一方面,如果硬盘驱动器只是移动到其他地方,信息也随之移动,所以您可能需要结合使用序列号,具体取决于您的需求。


2
我的主板和操作系统往往比我的硬盘寿命更长。至少目前为止是这样的。有一种叫做“备份”的东西,可以让操作系统和软件在硬盘死亡时幸存下来 :-) - Joey
对我来说定义计算机最独特的东西是硬盘驱动器(HDD)。如果你将 HDD 移到另一个主板上,你认为你的计算机是空的/具有新的 HDD 主板还是拥有所有数据、操作系统等的那个主板? - Clement Herreman

2

也许你是对的。在Windows和Linux上使用Mono的简单常见方法是获取网络适配器的MAC地址。 - macropas
我们使用第一张网卡的MAC地址(可能不止一张!),由于有几百个客户端,这个地址变化比我们预想的要频繁。我们目前正在寻找替代方案。 - epalm
@Smith,感谢您的反馈。请提出另一个同样简单的解决方案。 - kenny
使用WMI获取系统信息,例如处理器ID是一个开始。 - Smith
@Smith,这听起来与Mono不兼容,因为WMI是Windows特定的。 - kenny
正如您从下一个答案中所看到的那样,硬件信息似乎是最好的。在其他操作系统中获取这些硬件信息肯定有方法,您知道哪个API吗? - Smith

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