在C#中获取唯一标识符的最佳方法

时间:2012-04-25 06:18:29

标签: c# uniqueidentifier

之前我曾问过类似的问题,但我现在正在减少对我需要的一些限制。

我需要在C#上有效地在计算机上找到唯一的标识符。它应该始终在任何特定的计算机上保持不变,并且可以是许多因素的组合 - 只要它很容易检索。

我已经考虑过将MAC地址与WMI网络查询一起使用,但这种速度太慢,因为通常有10多个适配器。使用WHERE IPEnabled = true子句可能会更好,但我认为可能比这更好。

想法?

(P.S。它不一定非常独特。只要碰撞的机会很小,它就是完美的。)

4 个答案:

答案 0 :(得分:15)

首先获取如下处理器ID :(添加对System.Management的引用)

    ManagementObjectCollection mbsList = null;
    ManagementObjectSearcher mbs = new ManagementObjectSearcher("Select * From Win32_processor");
    mbsList = mbs.Get();
    string id = "";
    foreach (ManagementObject mo in mbsList)
    {
        id = mo["ProcessorID"].ToString();
    }

//然后你可以得到主板序列号:

    ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_BaseBoard");
    ManagementObjectCollection moc = mos.Get();
    string motherBoard = "";
    foreach (ManagementObject mo in moc)
    {
        motherBoard = (string)mo["SerialNumber"];
    }

您可以连接以上两个并获得唯一ID

    string myUniqueID = id + motherBoard;
    Console.WriteLine(myUniqueID);

另请查看此链接Finding Hardware ID, CPU ID, Motherboard ID, Hard-Disk ID of a computer

答案 1 :(得分:2)

机器SID也很稳定 - 下面有各种方法...

How can I retrieve a Windows Computer's SID using WMI?

答案 2 :(得分:1)

真的很好的例子,你会在这里看到Generating-Unique-for-a-Computer

答案 3 :(得分:1)

您可以查看此technical bulletin on Windows Product Activation。从您的评论来看,您可能不希望这些长度,但也许它可以为您提供一些灵感...

WPA根据以下某些硬件项的序列号生成哈希:

  • 显示适配器
  • SCSI适配器
  • IDE适配器
  • 网络适配器(MAC地址)
  • RAM金额范围
  • 处理器类型
  • 处理器序列号
  • 硬盘
  • 硬盘卷序列号
  • CD-ROM / CD-RW / DVD-ROM
相关问题