什么是一个很好的独特的PC标识符?

我一直在看本教程中的代码,并且发现它使用My.Computer.Name来保存不应该在计算机之间漫游的设置。 但是,对于用户来说,完全有可能具有两个相同名称的PC。 例如,如果他们想要在每台PC上使用相同的用户名,那么最终可能会有两台名为“用户名PC”的PC。

什么是识别不同PC的好方法? 电脑是否有与之相关的GUID,或者我应该考虑从某些硬件拉出序列号? 我不在乎是否通过重新安装Windows仍然存在。

(我链接的教程是在VB.Net,但我正在实施它在C#中)

一些好的标识符:

  • MAC地址:这很容易,而且通常是独一无二的。 但是,它可以很容易被欺骗/改变,所以它取决于它的独特性。
  • CPU序列号:它在许多较旧的系统上不可用,但它在那里。 看看这个MSDN页面 。 它不会改变,但它必然是一台电脑。
  • HDD Serial Number(硬盘序列号):很可能不会改变,但如果HD出现故障,可能会造成麻烦。 看看这个MSDN页面 。

如果您在Windows上HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ CurrentVersion\ProductId是每台计算机/每个Windows安装唯一。 在一些其他的答案,如MAC地址,Proc SN和高清SN将在Windows重新安装/双启动情况下保持不变。

这个问题的真正答案是:没有这样的事情。

有几个“足够接近”的解决scheme,但每个人都有自己的限制。

所有硬件ID – 硬件更改。 而且,在许多情况下,您可以更改这些标识符(例如,MAC欺骗)。

正如我已经评论的那样,SID并不是那么好,因为如果计算机是从映像安装的,SID不会改变。 SID由Windows安装生成,如果没有安装Windows,但是从图像复制,SID不会改变(虽然由于关于“安全风险”的神话而重新生成它是很常见的 – 您不能计数在那)。

计算机名称 – 正如前面提到的那样,他们认为它们是独一无二的,但并没有以任何方式强制执行。

您可以实现的另一个解决scheme是生成您自己的唯一标识符并将其存储在本地(假设您可以执行此操作)。 再一次,如果您的计算机与您的应用程序成像,此解决scheme将无法正常工作。

对你来说最好的解决scheme实际上取决于你正在努力完成的事情。 我有一个相当大的networking同样的问题,在我的情况最好的解决scheme是电脑的名字。 如果您完全确定您的程序不会被成像,那么我会使用Guid生成一个唯一的标识符,因为它可能是最安全的。

这是一种唯一识别计算机的方法。 使用System.Management来获取Win32_BIOS,你可以从你的机器的BIOS获得唯一的值。

请参阅:Win32_BIOS类, http : //msdn.microsoft.com/en-us/library/aa394077.aspx

 using System.Management; string UniqueMachineId() { StringBuilder builder = new StringBuilder(); String query = "SELECT * FROM Win32_BIOS"; ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); // This should only find one foreach (ManagementObject item in searcher.Get()) { Object obj = item["Manufacturer"]; builder.Append(Convert.ToString(obj)); builder.Append(':'); obj = item["SerialNumber"]; builder.Append(Convert.ToString(obj)); } return builder.ToString(); } 

有了类似的逻辑,你也可以通过“Win32_DiskDrive”; http://msdn.microsoft.com/en-us/library/aa394132.aspx ; 并获得每个物理驱动器的“SerialNumber”。 在这种情况下,

  foreach (ManagementObject item in searcher.Get()) 

应该find多个项目

使用网卡的MAC地址。 这应该是独一无二的。 不过可以改变。 这取决于您期望用户的恶意程度以及您的应用程序的重要程度。

一些示例代码来做到这一点:

 public string GetMACAddress() { ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); string MACAddress = String.Empty; foreach (ManagementObject mo in moc) { if (MACAddress == String.Empty) { // only return MAC Address from first card if ((bool)mo["IPEnabled"] == true) MACAddress = mo["MacAddress"].ToString(); } mo.Dispose(); } return MACAddress; } 

每台电脑在正常情况下都具有唯一的SID。

有一件事你可以使用任何networking接口的MAC。 您还可以结合多个信息来源。 像HDD序列号,mac,处理器types来计算它的散列。

我不认为有可能在同一个域名上有两台同名的电脑。 你有没有尝试捕获域名?

看看这里: 使用.net从戴尔机器获取服务标签?

你可以从registry中抓取一些独特的数据。

取三个半唯一和半常量的标识符。 使用3个中有2个足以进行正确识别的规则。 更新偶尔出错的三分之一的注册数据。