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

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

版。 我们可以使用类似的东西来识别.Net中的主板(请参阅C#中的获取唯一系统标识符 ):

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

但不幸的是,Mono不支持System.Management。 如何在Mono for Linux下进行? – 我不知道 :(

网卡的MAC地址怎么样?

编写一个函数,它将一些独特的硬件参数作为输入,并从中生成散列。

例如,Windows激活会查看以下硬件特征:

  • 显示适配器
  • SCSI适配器
  • IDE适配器(实际上是主板)
  • 网络适​​配器(NIC)及其MAC地址
  • RAM数量范围(即0-64mb,64-128mb等)
  • 处理器类型
  • 处理器序列号
  • 硬盘设备
  • 硬盘卷序列号(VSN)
  • CD-ROM / CD-RW / DVD-ROM

您可以选择其中一些来生成唯一的计算机标识符。

请参阅: 使用C#获取唯一系统标识符

试试这个:

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

就个人而言,我会选择硬盘序列号。 如果主板死机并被更换,则该PC不再有效。 如果更换硬盘驱动器,则无关紧要,因为软件已在其上。

当然,另一方面,如果硬盘只是移动到其他地方,信息随之而来,所以你可能想要查看序列号的组合,这取决于你想要的。

你实际上有MotherboardID,CPUID,磁盘串口和MAC地址,从经验来看,它们都不是100%。

我们的统计数据显示

  • 磁盘序列缺失0.1%
  • MAC缺席1.3%
  • 主板ID丢失30%
  • CPUID缺少99%

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

磁盘序列是最可靠的,但易于更改,mac可以更改,并且取决于读取时应用的过滤,如果添加了设备驱动程序(hyperv,wireshark等),它可能会更改。

主板和CPUID有时会返回无效“NONE”,“AAAA ..”,“XXXX ……”等的值。

你还应该注意,这些函数调用起来可能很慢(即使在快速PC上它们也可能需要几秒钟),因此可能值得尽早在后台线程上将它们踢掉,理想情况下你不想要阻止他们。