【问题标题】:Safest way to get processor ID or some hardware info获取处理器 ID 或某些硬件信息的最安全方法
【发布时间】:2011-06-02 17:34:36
【问题描述】:

我需要获取任何信息来识别机器,到目前为止我使用的是以下内容:

    internal static string GetProcessorId()
    {
        try
        {
            StringBuilder sb = new StringBuilder();
            using (System.Management.ManagementClass theClass = new System.Management.ManagementClass("Win32_Processor"))
            {
                using (System.Management.ManagementObjectCollection theCollectionOfResults = theClass.GetInstances())
                {
                    foreach (System.Management.ManagementObject currentResult in theCollectionOfResults)
                    {
                        sb.Append(currentResult["ProcessorID"].ToString());
                    }
                }
            }
            return sb.ToString();
        }
        catch (Exception exception)
        {
            Console.WriteLine(exception.Message);
            return "";
        }
    }

但是当我在 Windows XP(从虚拟机)上运行它时,我的 currentResult["ProcessorID"]null。我不确定是不是因为我使用的是虚拟机,但可能是因为是 XP。无论如何,我对这段代码不是很信任。它足够安全吗?我应该以其他方式获得计算机ID吗?这都是我正在开发的许可系统的一部分。

【问题讨论】:

  • 可能重复:stackoverflow.com/questions/1101772/… 我知道 VMWare 不支持“ProcessorID”。
  • @Cody Gray:你的意思是 VMWare 不模拟英特尔 CPUID 指令吗?还是您的意思是每个英特尔处理器应该具有的硬编码 ID(可以在 BIOS 中关闭...)
  • @JimR:是的。我的意思是,正如问题所述,返回的值将是null。请在他们的论坛上查看this thread 了解更多信息。
  • @Cody Gray:我认为您的意思是 Virtual Box,而不是 VMWare。你的链接也支持我的想法。我记得在 VMWare 支持处理器 ID 之前,过去使用一些延迟软件存在许可问题......该软件现在可以工作,所以这就是我问的原因。
  • @JimR:你是对的。我的意思是 Virtual Box,而不是 VMWare。有太多具有相似名称的虚拟化实用程序......无论哪种方式,关键是它并不总是有效。

标签: c# .net .net-4.0


【解决方案1】:

对于我编写的一个小工具(Windows Forms .NET 2.0),我需要类似的东西。

我写了一个helper class,它通过GetVolumeInformation函数的PInvoke简单地使用了一些常见的信息,比如硬盘序列号。

这绝不是真正的安全或防弹,但足够准确以满足我的需求。

(如果你有兴趣 this 是工具,如果我被允许链接到)

【讨论】:

  • 出于好奇,为什么免费软件需要一种方法来唯一地识别计算机?我不确定我是否喜欢这种类型的东西来强制执行许可协议,但我什至不明白你链接到的软件的意义。
  • 好问题 :-) 它是一个上传文件的工具(比如 YouSendIt)。最初,用户必须使用他的用户名和密码登录。一些评论者不喜欢这个。所以我介绍了硬件 ID 的东西并启用了该工具的匿名使用。这使用户能够在未来的任何时间将他的历史从匿名切换到注册用户,如果他愿意的话。底线:它是一种在服务器上的上传历史数据库中生成唯一密钥的机制。
  • 感谢您的诚实解释。这是有道理的。
  • GetVolumeInformation 不是返回 volume 序列号,而不是 drive 序列号吗?我的理解是卷序号is pretty easy to change
【解决方案2】:

即使它有效,它也不会做你想做的事。 ProcessorID 为您提供了进程产品(具有 Y 和 Z 功能的 Pentium X)的标识,而不是 CPU 的特定实例。是这样描述的:

描述处理器信息 处理器功能。对于 x86 类 CPU,字段格式取决于 CPUID 的处理器支持 操作说明。如果指令是 支持,该属性包含 2 (二) DWORD 格式的值。这 首先是 08h-0Bh 的偏移量,它 是 CPUID 的 EAX 值 指令返回并设置输入 EAX 到 1. 第二个是偏移量 0Ch-0Fh,这是 EDX 值 指令返回。只有 属性的前两个字节是 重要且包含内容 在 CPU 复位时的 DX 寄存器的所有 其他设置为 0(零),并且 内容为 DWORD 格式。

IBM PC 硬件没有任何类型的防伪硬件标识。

【讨论】:

  • 在这种情况下,你会用什么来为一台电脑生成一个唯一一致的 id?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 2010-10-28
  • 2012-07-13
  • 2018-12-22
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多