是否可以获得PC的物理USB端口数量?

时间:2015-02-06 19:15:39

标签: c# .net usb wmi wmic

我试图为不同的Windows操作系统获取PC的多个物理USB端口。首先,这似乎是一件容易的事,但现在我变得绝望了。

也许这个问题甚至无效,因为我不知道如何在硬件级别处理USB端口。

我认为使用WMI(C)ManagementObjectSearcher将是正确的路径,它会在某些操作系统上返回正确的值。或者那就是我的想法。

例如,我尝试了以下内容:

// >wmic path win32_usbhub get name

private const string UsbProperty = "Name";
private const string UsbPath = "Win32_USBHub";
private const string UsbPortName = "USB ROOT HUB";

...

// Get USB Ports
public IEnumerable<string> GetUsbPorts()
{
    // All from Win32_USBHub where name contains USB ROOT HUB
    return GetManagementObjectValues(UsbProperty, UsbPath).Where(name => 
        CultureInfo.CurrentCulture.CompareInfo.IndexOf(
            name, UsbPortName, CompareOptions.IgnoreCase) >= 0);
}

// Query
private static IEnumerable<string> GetManagementObjectValues(
    string properties, string path, Func<object, string> formatter = null)
{
    var values = new List<string>();
    string query = string.Format("SELECT {0} FROM {1}", properties, path);
    var search = new ManagementObjectSearcher(query);

    try
    {
        foreach (ManagementObject item in search.Get())
        {
            string value = string.Empty;
            foreach (string property in properties.Split(',')
                .Select(prop => prop.Trim()))
            {
                if (item[property] == null)
                    continue;

                if (value.Length > 0)
                    value += " ";

                if (formatter != null)
                    value += formatter(item[properties]);
                value += item[property].ToString();
            }
            values.Add(value.TrimEnd());
        }
    }
    catch (Exception e)
    {
        if (e is ManagementException)
            Logger.Warn(string.Format(
                "Can't extract {0} properties of {1}", properties, path), e);
        else
            Logger.Error(e);
    }

    return values.Count >= 1 ? values : new List<string> { DefaultValue };
}

这似乎让我在Windows8上获得了正确的数量,但在WindowsXP上完全没有。

接下来,我尝试了(例如)以下内容。我注意到在Win8上我的USB<number>ExternalReferenceDesignator,但在WinXP上,USBInternalReferenceDesignator,外部为空。

对于XP来说,这似乎工作得很好,但是再次在Win8端口的数量是六(6)。实际端口数为3,并且对接站7(7)。

// >wmic path Win32_PortConnector get ExternalReferenceDesignator,InternalReferenceDesignator

private const string UsbPortName = "USB";     
private const string PortProperties = 
    "ExternalReferenceDesignator, InternalReferenceDesignator";
private const string PortPath = @"Win32_PortConnector";

...

public IEnumerable<string> GetEthernetPorts()
{
    // All where external includes USB or internal equals USB
    return GetManagementObjectValues(PortProperties, PortPath).Where(name => 
        CultureInfo.CurrentCulture.CompareInfo.IndexOf(
            name, UsbPortName, CompareOptions.IgnoreCase) >= 0 ||
        string.Compare(name, UsbPortName, StringComparison.OrdinalIgnoreCase) == 0);
}    

所以它甚至是可能还是我只是从错误的地方看?

1 个答案:

答案 0 :(得分:2)

回答我自己的问题:不,这是不可能的。

Win32_USBController(或某些相关路径)的WMIC查询结果似乎是正确的,但您无法从中得出任何结论。有关连接器的信息也不存储在基板或任何其他位置。

例如,带有Windows XP SP3的旧Dell Latitude D830有三(3)个物理连接器,但WMIC和USBView.exe显示以下结果:

C:\>wmic path win32_usbcontroller get caption
Caption
Intel(R) ICH8 Family USB Universal Host Controller - 2834
Intel(R) ICH8 Family USB Universal Host Controller - 2835
Intel(R) ICH8 Family USB2 Enhanced Host Controller - 283A
Intel(R) ICH8 Family USB Universal Host Controller - 2830
Intel(R) ICH8 Family USB Universal Host Controller - 2831
Intel(R) ICH8 Family USB Universal Host Controller - 2832
Intel(R) ICH8 Family USB2 Enhanced Host Controller - 2836

imgur