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

米科·维塔拉(Mikko Viitala)

我正在尝试获取适用于不同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>as,ExternalReferenceDesignator但在WinXP上,它是普通的USBInternalReferenceDesignator而external是空的。

对于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);
}    

那么,是否有可能或者我只是从错误的地方看呢?

米科·维塔拉(Mikko Viitala)

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

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

图片

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否可以使用PyUSB通过USB端口获取USB设备

来自分类Dev

路由器的局域网端口数量增加

来自分类Dev

查找USB端口的物理位置?

来自分类Dev

物理USB端口的永久名称

来自分类Dev

是否可以从Ubuntu上打开USB集线器上的端口?

来自分类Dev

是否可以从Ubuntu上打开USB集线器上的端口?

来自分类Dev

是否可以获取USB wifi设备的devtype?

来自分类Dev

通过物理 USB 端口分配 IP 地址

来自分类Dev

是否可以防止PC读取USB存储设备?

来自分类Dev

是否可以通过USB C连接两台PC?

来自分类Dev

如果外部硬盘的USB端口被拔出,将硬盘的SATA直接插入PC是否可行?

来自分类Dev

在ubuntu发行版中获取开放端口数。

来自分类Dev

如果没有任何东西获取 COM 端口数据,则 Windows 无响应

来自分类Dev

如何确定哪个物理USB端口属于USB 3.0总线?

来自分类Dev

USB总线端口号与USB物理位置

来自分类Dev

关闭PC时,请禁用USB端口

来自分类Dev

是否可以将USB打印机连接到以太网端口?

来自分类Dev

是否可以将监视器连接到每个USB-C端口?

来自分类Dev

多次触发串行端口数据接收

来自分类Dev

显示端口数据类型

来自分类Dev

串行端口数据捕获问题

来自分类Dev

是否可以将两个 USB-C 设备插入一个 USB-C 端口?

来自分类Dev

可以使用configfs创建的USB小工具数量是否有限制?

来自分类Dev

是否可以ping地址:端口?

来自分类Dev

是否可以在不连接所有内部USB的情况下启动PC?

来自分类Dev

磁盘标签sda / sdb / sdc / ...是否绑定到物理端口?

来自分类Dev

USB端口故障:只读安装是否安全?

来自分类Dev

USB 3.0端口是否为黄色?

来自分类Dev

是否可以访问物理地址0?

Related 相关文章

热门标签

归档