获取处理器ID或某些硬件信息的最安全方法

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

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吗? 这是我正在开发的许可系统的一部分。

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

我编写了一个帮助程序类 ,它只是通过GetVolumeInformation函数的PInvoke使用一些常见信息,如HDD序列号。

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

(如果您感兴趣, 这是工具,如果我被允许链接到)

即使它有效,它也不会做你想要的。 ProcessorID为您提供过程产品的标识(Pentium X具有functionY和Z),而不是CPU的特定实例。 因此描述如下:

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

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