繁体   English   中英

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

[英]Is it possible to get PC's # of physical USB ports?

我正在尝试为不同的 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 上,有普通的USB作为InternalReferenceDesignator并且外部是空的。

对于 XP,这似乎工作得很好,但在 Win8 上,端口数量又是六 (6)。 实际端口数为 3 和坞站站七 (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);
}    

那么它甚至有可能还是我只是从错误的地方看?

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

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

我知道这个问题被问到已经有一段时间了,但我恰好正在为某种支持应用程序开发 USB 端口树。 最初,我尝试使用 Win32 ...,尽管它不打算用作重建设备树的信息来源,但这篇文章的答案解释了一些可能性( 获取已连接 USB 设备的列表) . 我玩过它,但我不喜欢它。 UsbView 本身也不是一种选择(C 缺乏技能)。 幸运的是,我找到了 NativeUsbLib 它为您提供了一个 USB 设备树,您只需要了解如何阅读它。 不是物理 USB 端口此图像显示的端口清楚地表明无法使用它。 除了该参数之外,还有“Companion Hub 符号链接名称”,根据我的经验,它必须存在于有效的 USB 端口上。 至于多个控制器,甚至一个controller中的多个端口满足我之前的说法,有一个解释。 同一个物理端口的多个端口,在我的例子中,端口 1 和 13 是相同的。 如果设备是 1.1 或 2.0,它将显示在端口 1 下,如果它支持 3.0,它将显示在端口 13 下。两个控制器也是如此,它们没有 100% 相同的结构,但是一旦你去掉不必要的数据,并合并剩下的数据(不一定是全部),结果将是 USB 端口树。 我不能保证所有陈述都是真实的,但这是我目前的经验,我可能会更新这篇文章。 如果没有,如果您有任何问题,请随时给我留言。 顺便提一句。 NativeUsbLib默认情况下不为没有设备存在(插入)的端口提供数据。 要解决这个问题,请注释掉 DeviceFactory 中检查设备是否存在的行(第 35 行)。 希望这对某人有帮助,并对我的拼写感到抱歉,我确定我在某个地方搞砸了......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM