在C#中无法获取CPU序列号

3

我正在尝试获取CPU序列号,但无法获取。我可以获取主板和硬盘,但无法获取CPU。

以下是我的代码。我做错了什么?

public static void GetClientComputerInfo()
    {
        HDDSerial = "0";
        BoardSerial = "0";
        CPUSerial = "0";

        try
        {
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_DiskDrive");

            foreach (ManagementObject share in searcher.Get())
            {
                foreach (PropertyData PC in share.Properties)
                {
                    if (PC.Name == "SerialNumber")
                    {
                        HDDSerial = PC.Value.ToString();
                    }

                    if (PC.Name == "SerialNumber")
                    {
                        BoardSerial = PC.Value.ToString();
                    }

                    if (PC.Name == "ProcessorID")
                    {
                        CPUSerial = PC.Value.ToString();
                    }
                }
            }
        }
        catch
        {

        }
    }

你正在尝试获取一个序列号,但你的if语句中CPU部分正在检查if (PC.Name == "ProcessorID")吗? - Thewads
@Thewads:在每个foreach迭代中,PC.Name会发生变化。 - Rob
http://www.vcskicks.com/hardware_id.php - naveejr
Win32_DiskDrive无法提供处理器ID。您可以使用“Select * FROM WIN32_Processor”来搜索处理器ID。 - naveejr
PC.Value Can return null then you will get an exception. Use var value = (string)PC.Value - Andrei Krasutski
1个回答

8

试试这个

 string cpuInfo = string.Empty;
    ManagementClass mc = new ManagementClass("win32_processor");
    ManagementObjectCollection moc = mc.GetInstances();

    foreach (ManagementObject mo in moc)
    {
         cpuInfo = mo.Properties["processorID"].Value.ToString();
         break;
    }

代码摘自这里


1
这个foreach循环中的'break'有意义吗? - Martin Tausch
对我来说,ManagementObjectCollection包含2个值,但两者都相同。老实说,我不知道为什么它有2个值。我认为这取决于CPU的核心数。在这种情况下,不需要使用foreach。但是,如果您想打印所有值,我在for循环中放置了一个控制台输出而没有break。 - naveejr
2
如果有多个值,foreach/break将获取第一个值,但如果集合为空,则防止索引超出范围异常。 如果旧系统不提供值并且您猜测[0]存在,则可能会发生这种情况。 - Tim
在 Virtual Box VM 中, cpuInfo = mo.Properties["processorID"].Value.ToString(); 会抛出 NullReferenceException。使用 cpuInfo = (string)mo.Properties["processorID"].Value; 来避免错误。 - Andrei Krasutski

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