2015-02-06 4 views
1

Я пытаюсь получить количество физических USB-портов ПК для разных операционных систем Windows. Начать с этого казалось легкой задачей, но теперь я начинаю отчаянно.Возможно ли получить USB-порты 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 - док-станции (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); 
}  

Так что это возможно или я просто смотрю из-за неправильного места?

+0

актуальны? https://msdn.microsoft.com/en-ca/library/windows/hardware/ff560019%28v=vs.85%29.aspx –

+0

Может быть, я заглядываю в него. Но мне нужно получить информацию без внешних инструментов. –

+0

должен иметь источник доступной утилиты, который позволит вам определить, какие api (ы) вам нужно использовать. –

ответ

2

И ответить на мой собственный вопрос: Нет, это невозможно.

Результаты запроса WMIC для Win32_USBController (или некоторые связанные пути) могут показаться правильными, но вы не можете сделать из них никаких выводов. Информация о соединителях не сохраняется на основной плате или в любом другом месте.

Например старый Dell Latitude D830 с Windows XP SP3 имеет три (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