Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C#唯一地识别计算机?_C#_.net_Mono - Fatal编程技术网

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

如何使用C#唯一地识别计算机?,c#,.net,mono,C#,.net,Mono,如何使用C#(.Net/Mono,本地应用程序)唯一标识计算机(主板) 版本。我们可以使用以下内容在.Net中识别主板(请参阅): 但不幸的是,Mono不支持System.Management。如何在Mono for Linux下实现这一点我不知道:(试试这个: 但就我个人而言,我会选择硬盘序列号。如果主板死亡并被更换,那台电脑将不再有效。如果硬盘驱动器被更换,这并不重要,因为软件就在上面 当然,另一方面,如果硬盘只是移动到其他地方,信息也会随之移动,因此您可能需要查看序列号的组合,这取决于您

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

版本。我们可以使用以下内容在.Net中识别主板(请参阅):

但不幸的是,Mono不支持System.Management。如何在Mono for Linux下实现这一点我不知道:(

试试这个:

但就我个人而言,我会选择硬盘序列号。如果主板死亡并被更换,那台电脑将不再有效。如果硬盘驱动器被更换,这并不重要,因为软件就在上面


当然,另一方面,如果硬盘只是移动到其他地方,信息也会随之移动,因此您可能需要查看序列号的组合,这取决于您想要它做什么。

请参见:

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

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

  • 显示适配器
  • SCSI适配器
  • IDE适配器(有效地连接主板)
  • 网络适配器(NIC)及其MAC地址
  • RAM数量范围(即0-64mb、64-128mb等)
  • 处理器类型
  • 处理器序列号
  • 硬盘设备
  • 硬盘驱动器卷序列号(VSN)
  • CD-ROM/CD-RW/DVD-ROM

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

网卡的名称如何?

您实际上拥有主板ID、CPUID、磁盘序列号和MAC地址,根据经验,它们都不是100%

我们的数据显示

  • 磁盘序列丢失0.1%
  • MAC缺少1.3%
  • 主板ID丢失30%
  • CPUID缺少99%
0.04%的被测试机器没有生成任何信息,我们甚至无法读取计算机名称。这可能是某种虚拟PC、HyperV或VMWare实例,或者可能只是非常锁定?无论如何,您的设计必须能够应对这些情况

磁盘串行是最可靠的,但很容易更改,mac可以更改,并且根据读取时应用的过滤,如果添加了设备驱动程序(hyperv、wireshark等),它可以更改

主板和CPUID有时返回无效的值“无”、“AAAA…”、“XXXX…”等


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

另一方面,您可能希望将它们分开。这将允许例如放入更多内存,并且您可以允许更改,只要更改一次发生一个。生成哈希的好主意。我的mainbo和ards和我的操作系统往往比我的硬盘寿命长。至少到目前为止。有一种称为“备份”的东西可以使OS+软件在即将消亡的硬盘驱动器中生存:-)对我来说,定义计算机的最独特的东西是硬盘驱动器。您将硬盘驱动器带到另一个主板。你认为你的电脑是空的/有一个新的硬盘主板还是有你所有的数据、操作系统等的?也许你是对的。Windows和Linux使用Mono的简单通用方法是获取网卡的MAC地址。我们使用(第一个)网卡的MAC地址(可能不止一个!),对于数百个客户端,这种变化比我们想象的更频繁。我们目前正在寻找替代方案。@史密斯,谢谢您的反馈。请提出另一个同样简单的解决方案。使用WMI获取系统信息(如processorid)是一个简单的解决方案start@Smith这听起来与Mono不兼容,因为WMI是特定于Windows的。
using System.Management;
...
ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_MotherboardDevice");
...