什么是好的唯一PC标识符?

dlr*_*as2 41 .net c# guid

我一直在查看本教程中的代码,我发现它用于My.Computer.Name保存不应在计算机之间漫游的设置.但是,完全有可能用户拥有两台名称相同的PC.例如,如果他们想在每台PC上拥有相同的用户名,他们最终可能会得到两台名为Username-PC的PC.

识别不同PC有哪些好方法?PC是否有与之关联的GUID,或者我是否应该考虑从某些硬件中提取序列号?我不关心通过重新安装Windows是否仍然存在.

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

mat*_*sta 43

一些好的标识符:

  • MAC地址:它很容易获得,它通常是独一无二的.但是,它可以很容易地被欺骗/改变,因此它取决于它需要的独特性.
  • CPU序列号:它不适用于许多旧系统,但它就在那里.查看此MSDN页面.它不会改变,但它与计算机绑定.
  • HDD序列号:它可能不会改变,但如果HD出现故障可能会令人讨厌.查看此MSDN页面.

  • +1是的,小心MAC.在MAC更改和重复之前,我遇到了很多问题.PITA. (4认同)
  • @Steven:好点.但是,一般来说,我认为它是系统中"最可靠"的ID之一.CPU故障相对不常见(与HD故障相比).还应该注意的是,当您开始处理虚拟化时,这个数字可能会被搞砸. (2认同)

Sco*_*ain 19

如果您在Windows上HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ CurrentVersion\ProductId是唯一的每台机器/每个Windows安装.在某些其他答案中,如MAC地址,Proc SN和HD SN将在Windows重新安装/双启动情况之间保持不变.

  • 好吧,积极的一面是,任何能够更改此产品 ID 的行为也将给 Windows 本身带来很大的痛苦。:-) (2认同)
  • @Rory我相信执行[sysprep](http://technet.microsoft.com/en-us/library/hh824816.aspx)会导致该ID在您第一次启动系统时更改(如果您是使用系统映像你真的*应该使用sysprep) (2认同)
  • 我知道已经有一段时间了,但是今天我在这里找到了 [其他答案](http://stackoverflow.com/a/28200014/4241435),因此我想知道 `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ 中的 id 之间有什么区别Windows NT\ CurrentVersion\ProductId` 和 `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\MachineGuid` 中? (2认同)

DiG*_*GMi 11

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

有几个"足够接近"的解决方案,但每个解决方案都有其自身的局限性.

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

正如我已经评论过的那样,SID也不是那么好,因为如果从图像安装计算机,SID就不会改变.SID是由Windows安装生成的,如果未安装Windows,但是从图像复制,SID将不会更改(尽管由于关于"安全风险"神话而重新生成它是常见的- 您无法计算在那).

计算机名称 - 如上所述,他们认为它是独一无二的,但它并没有以任何方式强制执行.

您可以实现的另一个解决方案是生成您自己的唯一标识符并将其存储在本地(假设您可以执行此类操作).同样,如果您的计算机是使用您的应用程序成像的,那么此解决方案将无效.

最适合您的解决方案取决于您要完成的任务.我有一个相当大的网络问题,在我的情况下,最好的解决方案是计算机的名称.如果你完全确定你的进程不会成像,我会使用Guid生成一个唯一的标识符,因为它可能是最安全的.


小智 9

这是一种唯一标识计算机的方法.使用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();
}
Run Code Online (Sandbox Code Playgroud)

使用类似的逻辑,您也可以单步执行"Win32_DiskDrive"; http://msdn.microsoft.com/en-us/library/aa394132.aspx ; 并为每个物理驱动器获取"SerialNumber".在这种情况下,

    foreach (ManagementObject item in searcher.Get())
Run Code Online (Sandbox Code Playgroud)

应该找到多个项目

  • 使用Bios序列号是非常不安全的,因为你可能会得到很多这些(相同的!)字符串:"由OEM填充". (3认同)

小智 5

取三个分别为半唯一和半恒定的标识符。使用以下规则:3个中的2个足以进行肯定标识。偶尔为3个中的1个更新注册数据。


归档时间:

查看次数:

71852 次

最近记录:

6 年,2 月 前