在C#中获取唯一的系统标识符

9

使用C#可以轻松获取哪些“唯一”的系统标识符(用于哈希和唯一地标识一个系统)?我可以仅对硬盘大小等进行哈希,但我需要识别和区分所有由相同组件构建的计算机,因此不能只依靠这些。

感谢提示、思路和示例代码!


1
我会小心处理这个问题,以免让你的客户讨厌你。他们应该能够更换网络卡、硬盘和内存大小,而不必告诉你。 - John Saunders
4
这个要求实际上确实来自于客户。 - Alex
6个回答

10

以下是使用WMI的良好起点...

// Win32_CPU will work too
var search = new ManagementObjectSearcher( "SELECT * FROM Win32_baseboard" );
var mobos = search.Get();

foreach (var m in mobos)
{
  var serial = m["SerialNumber"]; // ProcessorID if you use Win32_CPU
}

你可以使用多个硬件设备来解决这个问题。


我尝试过那个......但是我发现这些天没有序列号被维护。主板、处理器......通过更改NIC更改MAC......该选什么? - Rick2047
由于Win32_BaseBoard SerialNumber在大多数情况下不再返回值,您最好使用Win32_Processor中的ProcessorID。 - Chris Watts
请注意,同一类型的处理器的ProcessorID是相同的。如果您测试两个i7-FooBar处理器,它们的ID将是相同的。 - ANeves

8

为了更详细地阐述这个问题和其他答案:网络卡的MAC地址将是唯一的,即使机器都使用相同的组件。我会从这里开始。其次,您应该能够获取主板和CPU序列号,就像JP所说的那样。这些加上物理NIC的MAC地址应该足以唯一标识一台机器。只需注意,如果更换零件,所有这些都可能会改变。 - Jamie Penney
网络适配器的MAC地址可以通过软件设置,因此您不能指望它是唯一的。另一方面,我认为主硬盘+MAC地址+处理器ID+主板可能是一个安全的选择。 - Vinko Vrsalovic

6

如果你在谈论Windows,那么每个Windows安装都有一个唯一的产品ID(当您查看“我的电脑”的属性时可以看到)。我认为这是存储在 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion:ProductId(REG_SZ) 中的。我猜你想要更多信息吗?


1
当Windows操作系统镜像被复制到另一台计算机上时会怎样?克隆机器上的注册表键是否相同? - Ulysses Alves

2
您可以考虑使用GUID
什么是GUID?
对于那些不知道的人来说,GUID(全局唯一标识符)是一个128位整数,可用于唯一标识某些东西。您可能会在数据库中存储用户或产品,并且希望以某种方式唯一地标识数据库中的每一行。一种常见的方法是创建自动递增的整数,另一种方法是为您的产品创建GUID。
如何在C#中创建GUID?
GUID方法可以在System命名空间中找到。GUID方法System.Guid.NewGuid()初始化GUID类的新实例。
对于那些想以特定格式格式化GUID的人,也有几个重载可用。
以下实时示例将输出生成的GUID,源代码也在下面。
Response.Write(@"<br>System.Guid.NewGuid().ToString() = " + System.Guid.NewGuid().ToString());
Response.Write(@"<br>System.Guid.NewGuid().ToString(""N"") = " + System.Guid.NewGuid().ToString("N"));
Response.Write(@"<br>System.Guid.NewGuid().ToString(""D"") = " + System.Guid.NewGuid().ToString("D"));
Response.Write(@"<br>System.Guid.NewGuid().ToString(""B"") = " + System.Guid.NewGuid().ToString("B"));
Response.Write(@"<br>System.Guid.NewGuid().ToString(""P"") = " + System.Guid.NewGuid().ToString("P"));

2
微软实现的GUID使用MAC地址和当前时间,因此它们几乎是创建每台计算机唯一标识符的保证方式。 - Timothy Walters
我认为链接已经损坏了。 - Anders Finn Jørgensen
@AndersFinnJørgensen - 谢谢,我已经将链接的内容添加到答案中。 - SwDevMan81

2

网络适配器MAC地址:

foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
{
    // probably need to do some filtering on ni.NetworkInterfaceType here
    Console.WriteLine(ni.GetPhysicalAddress());
}

1
虽然这是一个好主意,但如果系统没有NIC,我认为它会失败! - Smith
2
这不是一个好主意,因为当用户禁用连接或软件安装虚拟连接时,此ID会发生变化。 - a.toraby

2

你可以使用C#与WMI来获取关于硬件的相当多的信息。

硬盘ID和以太网MAC地址是系统识别方案中常用的两种唯一标识符。理论上,MAC地址对于每个网络卡是唯一的。


1
理论上讲,没有一个单一的唯一标识符可供使用,因为有很多并且很容易获取,最好选择两个或三个并将它们组合起来创建一个唯一的字符串(或哈希)。 - Vinko Vrsalovic
是的,我同意。这就是为什么有"理论上"的原因 :) - Reed Copsey

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