Я пытаюсь получить количество физических 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);
}
Так что это возможно или я просто смотрю из-за неправильного места?
актуальны? https://msdn.microsoft.com/en-ca/library/windows/hardware/ff560019%28v=vs.85%29.aspx –
Может быть, я заглядываю в него. Но мне нужно получить информацию без внешних инструментов. –
должен иметь источник доступной утилиты, который позволит вам определить, какие api (ы) вам нужно использовать. –