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

问题描述 投票:0回答:6

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

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

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

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

c# .net mono
6个回答
13
投票

编写一个函数,将一些唯一的硬件参数作为输入,并根据它们生成哈希值。

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

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

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



4
投票

您实际上拥有主板 ID、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 上,它们也可能需要几秒钟),因此可能值得尽早在后台线程上启动它们,但理想情况下不要这样做想要阻止他们。


3
投票

试试这个:

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

就我个人而言,我会选择硬盘序列号。如果主板损坏并被更换,那么该电脑就不再有效。如果更换硬盘驱动器,也没有太大关系,因为软件就在上面。

当然,另一方面,如果硬盘刚刚移动到其他地方,信息也会随之而来,因此您可能需要查看序列号的组合,具体取决于您想要它的用途。


2
投票

网卡的MAC地址怎么样?


0
投票

您可以使用DeviceId库。 从这里开始

string deviceId = new DeviceIdBuilder()
    .AddMachineName()
    .AddOsVersion()
    .OnWindows(windows => windows
        .AddProcessorId()
        .AddMotherboardSerialNumber()
        .AddSystemDriveSerialNumber())
    .ToString();
© www.soinside.com 2019 - 2024. All rights reserved.