使用ManagementObjectSearcher查询Win32_PnPEntity返回空

时间:2015-04-09 09:41:18

标签: c# wmi

好的,所以这让我疯了。

下面的代码在Windows 7和.NET 3.5中运行良好。 在Windows 8.1和.NET 4.5.1中,我得到一个空结果,但使用WMI Code Creator我可以得到结果。

我在网上找不到任何相关内容。

我想获得任何COM端口的友好名称,例如“通讯端口(COM1)”。

只使用System.IO.Ports.SerialPort.GetPortNames()不会。

我真的希望有人知道如何做到这一点。谢谢!

using System;
using System.Collections.Generic;
using System.Management;

namespace OakHub
{
    public class SerialMgmt
    {
        static public List<String> GetCOMDevices()
        {
            List<String> list = new List<String>();

            ManagementScope scope = new ManagementScope(@"\\" + Environment.MachineName + @"\root\CIMV2");
            SelectQuery sq = new SelectQuery("SELECT Caption FROM Win32_PnPEntity");
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, sq);
            ManagementObjectCollection moc = searcher.Get();

            foreach (ManagementObject mo in moc)
            {
                String name = mo.ToString();
                if (name.ToString().Contains("(COM"))
                {
                    list.Add(name);
                }
            }
            return list;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

首先,我不知道为什么这段代码甚至适合你(使用.Net 3.5)。

  1. 您刚刚选择了属性Caption。 (如果需要,使用*选择全部)
  2. 我想你想要Win32_PnPEntity-Devices的名字, cant 用这行代码获取它

    String name = mo.ToString();

    因为Name是一个属性。首先必须使用WMI字符串加载属性:

    SELECT Name,Caption FROM Win32_PnPEntity //获取姓名和标题属性

    SELECT * FROM Win32_PnPEntity //加载该WMI-Obj的所有Propertys

  3. 而且你必须检查值是否为null - >返回值

    代码:

    public List<String> GetLocalCOMDevices()
            {
                List<String> list = new List<String>();
    
                ManagementScope scope = new ManagementScope(@"\\" + Environment.MachineName + @"\root\CIMV2");
                SelectQuery sq = new SelectQuery("SELECT Name,Caption FROM Win32_PnPEntity");
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, sq);
                ManagementObjectCollection moc = searcher.Get();
    
                foreach (ManagementObject mo in moc)
                {
                    object propName = mo.Properties["Name"].Value;
                    if (propName == null) { continue; }
    
                    list.Add(propName.ToString());
                }
                return list;
            }