获取设备父级的字符串

时间:2016-10-28 08:04:13

标签: c# vb.net windows

在com端口分支的windows7的设备管理器中,我选择菜单“属性”之一的端口。在“详细信息”选项卡中,我选择了属性“parent”并查看字符串:

enter image description here

我如何从vb .net或cmd中的visual studio中的其他语言获取此字符串也会很好?

我尝试使用win32_ clases:pnpentity,serialPort等但是这并没有解决我的问题,即使PS中的Get-WMIObject Win32_SerialPort输出也没有属性“parent”。

 Dim objService = GetObject("winmgmts://./root/cimv2")

        For Each objPort In objService.ExecQuery("SELECT * FROM Win32_PnPEntity WHERE ClassGuid='{4d36e978-e325-11ce-bfc1-08002be10318}'")

            Console.WriteLine(objPort.Caption & vbCrLf)

            Console.Write(objPort.DeviceID & vbCrLf)
            Console.ReadLine()

        Next

设备ID除外我尝试使用Caption和List中提供的所有语法。 你知道吗?

1 个答案:

答案 0 :(得分:0)

我的解决方法如下:

  1. 获取所有活动端口及其PnpDeviceId:

    private static List<PortInfo> GetActivePorts()
    {
        var ports = new List<PortInfo>();
    
        using (var searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_SerialPort"))
        using (var collection = searcher.Get())
        {
            foreach (var device in collection)
            {
                var portInfo = new PortInfo
                {
                    Port = (string)device.GetPropertyValue("DeviceID"),
                    PnPDeviceId = (string)device.GetPropertyValue("PNPDeviceID")
                };
                if (!string.IsNullOrEmpty(portInfo.Port) && !string.IsNullOrEmpty(portInfo.PnPDeviceId))
                {
                    ports.Add(portInfo);
                }
            }
        }
    
        return ports;
    }
    

其中PortInfo是

    private class PortInfo
    {
        public string Port { get; set; }
        public string PnPDeviceId { get; set; }
        public string ParentDeviceId { get; set; }
    }
  1. 填写ParentDeviceIds:

    private static async void FillParentIds(IReadOnlyCollection<PortInfo> ports)
    {
        var propertiesToQuery = new List<string> {
            "System.Devices.DeviceInstanceId",
            "System.Devices.Parent"
        };
    
        var aqs = string.Join(" OR ", ports.Select(p => $"System.Devices.DeviceInstanceId:={p.PnPDeviceId}"));
        var pnpDevices = await PnpObject.FindAllAsync(PnpObjectType.Device, propertiesToQuery, aqs);
        foreach (var pnpDevice in pnpDevices)
        {
            var port = ports.FirstOrDefault(p => string.Compare(p.PnPDeviceId, pnpDevice.Id, StringComparison.InvariantCultureIgnoreCase) == 0);
            if (port != null && pnpDevice.Properties.TryGetValue("System.Devices.Parent", out var parentId))
            {
                port.ParentDeviceId = parentId?.ToString();
            }
        }
    }
    

ParentDeviceId将是您要查找的字符串。