在虚拟机上获取CPU ID

3

我正在尝试使用这段代码:

public string GetCPUId()
{
    string cpuInfo = String.Empty;
    string temp = String.Empty;
    ManagementClass mc = new ManagementClass("Win32_Processor");
    ManagementObjectCollection moc = mc.GetInstances();
    foreach (ManagementObject mo in moc)
    {
        if (cpuInfo == String.Empty)
        {
            cpuInfo = mo.Properties["ProcessorId"].Value.ToString();
        }
    }
    return cpuInfo;
}

在XP虚拟机(virtualbox)上获取hw uid,但我只收到一个弹出消息框,上面写着:
Object reference not set to an instance of an object.

是因为它是虚拟机吗?

3个回答

7

是的,这是因为你正在运行虚拟机。 mo.Properties["ProcessorId"] 将返回 null。请查看此处的答案。


请注意,该问题目前被接受的答案建议一种方法,据我所知,这种方法会给出 序列号(很容易更改),而不是 驱动器 序列号(不容易更改)。 - reirab

3
我在这里找到了一个更快的解决方案: http://www.dotnetspark.com/kb/24-get-processor-id-using-c-sharp.aspx 它比你的方法更快,而且在我的虚拟 Windows(使用安装了 Windows XP 的 VMware Workstation 7.0.0)中也可以工作。由于两个代码都使用相同的库,因此你的代码也应该可以工作!尝试在项目输出中包含 dll 文件可能会有帮助。
更新(2022年):由于链接页面不再可用,我将贴出代码:
public static string GetProcessorID()
{

    string sProcessorID = "";

    string sQuery = "SELECT ProcessorId FROM Win32_Processor";

    ManagementObjectSearcher oManagementObjectSearcher = new ManagementObjectSearcher(sQuery);

    ManagementObjectCollection oCollection = oManagementObjectSearcher.Get();
    foreach (ManagementObject oManagementObject in oCollection)
    {
        sProcessorID = (string)oManagementObject["ProcessorId"];
    }
    return (sProcessorID);
}

你好,链接已经失效了,你有代码吗? - Simon Mardiné
我能够在这里的网络档案中找到它,我也会将代码添加到帖子中 https://web.archive.org/web/20181126114501/http://www.dotnetspark.com/kb/24-get-processor-id-using-c-sharp.aspx - Omid S.

0

在虚拟机上应该可以正常工作。虚拟CPU呈现的CPU ID可能与物理CPU匹配,也可能不匹配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接