Получить список подключенных USB-устройств - PullRequest
80 голосов
/ 26 июля 2010

Как получить список всех подключенных USB-устройств на компьютере с ОС Windows?

Ответы [ 8 ]

103 голосов
/ 26 июля 2010

Добавьте ссылку на System.Management для своего проекта, затем попробуйте что-то вроде этого:

namespace ConsoleApplication1
{
  using System;
  using System.Collections.Generic;
  using System.Management; // need to add System.Management to your project references.

  class Program
  {
    static void Main(string[] args)
    {
      var usbDevices = GetUSBDevices();

      foreach (var usbDevice in usbDevices)
      {
        Console.WriteLine("Device ID: {0}, PNP Device ID: {1}, Description: {2}",
            usbDevice.DeviceID, usbDevice.PnpDeviceID, usbDevice.Description);
      }

      Console.Read();
    }

    static List<USBDeviceInfo> GetUSBDevices()
    {
      List<USBDeviceInfo> devices = new List<USBDeviceInfo>();

      ManagementObjectCollection collection;
      using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub"))
        collection = searcher.Get();      

      foreach (var device in collection)
      {
        devices.Add(new USBDeviceInfo(
        (string)device.GetPropertyValue("DeviceID"),
        (string)device.GetPropertyValue("PNPDeviceID"),
        (string)device.GetPropertyValue("Description")
        ));
      }

      collection.Dispose();
      return devices;
    }
  }

  class USBDeviceInfo
  {
    public USBDeviceInfo(string deviceID, string pnpDeviceID, string description)
    {
      this.DeviceID = deviceID;
      this.PnpDeviceID = pnpDeviceID;
      this.Description = description;
    }
    public string DeviceID { get; private set; }
    public string PnpDeviceID { get; private set; }
    public string Description { get; private set; }
  }
}
33 голосов
/ 03 июня 2016

Я знаю, что отвечаю на старый вопрос, но я только что прошел это же упражнение и узнал немного больше информации, которая, я думаю, внесет большой вклад в обсуждение и поможет всем, кто найдет этот вопрос ивидит, где существующих ответов не хватает.

Принятый ответ близок, и его можно исправить, используя комментарий Недко к нему.Более подробное понимание задействованных классов WMI помогает завершить картину.

Win32_USBHub возвращает только USB Концентраторы .Оглядываясь назад, это кажется очевидным, но в приведенной выше дискуссии об этом не говорится.Он не включает в себя все возможные устройства USB, только те, которые могут (по крайней мере, в теории) выступать в качестве концентратора для дополнительных устройств.Он пропускает некоторые устройства, которые не являются концентраторами (в частности, части составных устройств).

Win32_PnPEntity включает в себя все устройства USB и сотни других устройств, отличных от USB. Совет Рассела Гантмана по использованию предложения WHERE для поиска по номеру Win32_PnPEntity для DeviceID, начинающегося с "USB%", для фильтрации списка полезен, но немного неполон;он пропускает устройства Bluetooth, некоторые принтеры / серверы печати, а также HID-совместимые мыши и клавиатуры.Я видел "USB \%", "USBSTOR \%", "USBPRINT \%", "BTH \%", "SWD \%" и "HID \%".Win32_PnPEntity, однако, является хорошим «основным» справочником для поиска информации, когда вы обладаете PNPDeviceID из других источников.

То, что я нашел, было лучшим способом перечисления USB-устройств, это запрос Win32_USBControllerDevice.Хотя он не дает подробной информации об устройствах, он полностью перечисляет ваши USB-устройства и дает вам пару Antecedent / Dependent PNPDeviceID s для каждого USB-устройства (включая концентраторы, не-концентраторы и HID-совместимые устройства).) в вашей системе.Каждый зависимый, возвращенный из запроса, будет устройством USB.Antecedent будет тем Контроллером, которому он назначен, а один из контроллеров USB возвращается с помощью запроса Win32_USBController.

В качестве бонуса представляется, что под капотом WMI при ответе на запрос Win32_USBControllerDevice обходится Дерево устройств , поэтому порядок, в котором возвращаются эти результаты, может помочь определить родителя./ детские отношения.(Это не задокументировано и, таким образом, является лишь предположением; для получения окончательных результатов используйте API-интерфейс SetupDi CM_Get_Parent (или Child + Sibling ).) Как вариантПохоже, что в API SetupDi для всех устройств, перечисленных в Win32_USBHub, их можно найти в реестре (в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ + PNPDeviceID), и у них будет параметр ParentIdPrefix, который будет префиксом последнего поля в PNPDeviceID.его дочерних элементов, так что это также может быть использовано в сопоставлении с подстановочными знаками для фильтрации запроса Win32_PnPEntity.

В моем приложении я сделал следующее:

  • (необязательно) ЗапрошеноWin32_PnPEntity и сохранил результаты в карте значения ключа (с PNPDeviceID в качестве ключа) для последующего извлечения.Это необязательно, если вы хотите выполнить отдельные запросы позже.
  • Запрос Win32_USBControllerDevice для получения окончательного списка USB-устройств в моей системе (всех зависимых элементов) и извлечения из них PNPDeviceID.Я пошел дальше, основываясь на порядке следования за деревом устройств, чтобы назначить устройства корневому концентратору (возвращено первое устройство, а не контроллер) и построил дерево на основе parentIdPrefix.Порядок, возвращаемый запросом, который соответствует перечислению дерева устройств через SetupDi, представляет собой каждый корневой концентратор (для которого Antecedent идентифицирует контроллер), за которым следует итерация устройств под ним, например, в моей системе:
    • Rootконцентратор первого контроллера
    • корневой концентратор второго контроллера
      • первый концентратор под корневым концентратором второго контроллера (имеет parentIdPrefix)
        • первое составное устройство под первым концентратором под корневым концентратором второгоконтроллер (PNPDeviceID соответствует вышеуказанному ParentIdPrefix концентратора; имеет свой собственный ParentIdPrefix)
          • HID Часть устройства составного устройства (PNPDeviceID соответствует вышеуказанному ParentIDPrefix составного устройства)
        • Второе устройство под первымконцентратор под корневым концентратором второго контроллера
          • HID Часть устройства составного устройства
      • Второй концентратор под корневым концентратором второго контроллера
        • Первое устройство под вторым концентратором под корневым концентраторомвторого контроллера
      • Третий концентратор под корневым концентратором второго контроллера
      • и т. д.
  • ЗапрошеноWin32_USBController.Это дало мне подробную информацию о PNPDeviceIDs моих контроллеров, которые находятся в верхней части дерева устройств (которые были Antecedents предыдущего запроса).Используя дерево, полученное на предыдущем шаге, рекурсивно итерируем его дочерние элементы (корневые концентраторы) и их дочерние элементы (другие концентраторы), а также их дочерние элементы (не-концентраторы и составные устройства) и их дочерние элементы и т. Д.* Полученные данные для каждого устройства в моем дереве, ссылаясь на карту, сохраненную в первом шаге.(При желании можно пропустить первый шаг и запросить Win32_PnPEntity по отдельности, используя PNPDeviceId, чтобы получить информацию на этом шаге; возможно, соотношение между процессором и памятью определяет, какой порядок лучше.)

В итоге, Win32USBControllerDevice Зависимости - это полный список USB-устройств в системе (кроме самих контроллеров, которые являются антецедентами в том же запросе), и путем перекрестной ссылки на эти пары PNPDeviceIdс информацией из реестра и из других упомянутых запросов можно построить детальную картину.

12 голосов
/ 03 июля 2014

Чтобы увидеть устройства, которые меня интересовали, мне пришлось заменить Win32_USBHub на Win32_PnPEntity в коде Адель Хацзы, основанном на этого поста . Это работает для меня:

namespace ConsoleApplication1
{
  using System;
  using System.Collections.Generic;
  using System.Management; // need to add System.Management to your project references.

  class Program
  {
    static void Main(string[] args)
    {
      var usbDevices = GetUSBDevices();

      foreach (var usbDevice in usbDevices)
      {
        Console.WriteLine("Device ID: {0}, PNP Device ID: {1}, Description: {2}",
            usbDevice.DeviceID, usbDevice.PnpDeviceID, usbDevice.Description);
      }

      Console.Read();
    }

    static List<USBDeviceInfo> GetUSBDevices()
    {
      List<USBDeviceInfo> devices = new List<USBDeviceInfo>();

      ManagementObjectCollection collection;
      using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_PnPEntity"))
        collection = searcher.Get();      

      foreach (var device in collection)
      {
        devices.Add(new USBDeviceInfo(
        (string)device.GetPropertyValue("DeviceID"),
        (string)device.GetPropertyValue("PNPDeviceID"),
        (string)device.GetPropertyValue("Description")
        ));
      }

      collection.Dispose();
      return devices;
    }
  }

  class USBDeviceInfo
  {
    public USBDeviceInfo(string deviceID, string pnpDeviceID, string description)
    {
      this.DeviceID = deviceID;
      this.PnpDeviceID = pnpDeviceID;
      this.Description = description;
    }
    public string DeviceID { get; private set; }
    public string PnpDeviceID { get; private set; }
    public string Description { get; private set; }
  }
}
4 голосов
/ 23 января 2018

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * *} *} * 100 * * * * * * * * * * * * * * * * * * * * * * * * * * * ”*” * ”*” ”Даниэль Уидзис”, а также ”в комментариях * 1006” * * ** ответ дает много подробностей без кода.

Ниже приведено обобщение вышеприведенного обсуждения, чтобы предоставить рабочий код, в котором перечислены свойства устройства PNP, доступные для прямого доступа ко всем подключенным USB-устройствам:

using System;
using System.Collections.Generic;
using System.Management; // reference required

namespace cSharpUtilities
{
    class UsbBrowser
    {

        public static void PrintUsbDevices()
        {
            IList<ManagementBaseObject> usbDevices = GetUsbDevices();

            foreach (ManagementBaseObject usbDevice in usbDevices)
            {
                Console.WriteLine("----- DEVICE -----");
                foreach (var property in usbDevice.Properties)
                {
                    Console.WriteLine(string.Format("{0}: {1}", property.Name, property.Value));
                }
                Console.WriteLine("------------------");
            }
        }

        public static IList<ManagementBaseObject> GetUsbDevices()
        {
            IList<string> usbDeviceAddresses = LookUpUsbDeviceAddresses();

            List<ManagementBaseObject> usbDevices = new List<ManagementBaseObject>();

            foreach (string usbDeviceAddress in usbDeviceAddresses)
            {
                // query MI for the PNP device info
                // address must be escaped to be used in the query; luckily, the form we extracted previously is already escaped
                ManagementObjectCollection curMoc = QueryMi("Select * from Win32_PnPEntity where PNPDeviceID = " + usbDeviceAddress);
                foreach (ManagementBaseObject device in curMoc)
                {
                    usbDevices.Add(device);
                }
            }

            return usbDevices;
        }

        public static IList<string> LookUpUsbDeviceAddresses()
        {
            // this query gets the addressing information for connected USB devices
            ManagementObjectCollection usbDeviceAddressInfo = QueryMi(@"Select * from Win32_USBControllerDevice");

            List<string> usbDeviceAddresses = new List<string>();

            foreach(var device in usbDeviceAddressInfo)
            {
                string curPnpAddress = (string)device.GetPropertyValue("Dependent");
                // split out the address portion of the data; note that this includes escaped backslashes and quotes
                curPnpAddress = curPnpAddress.Split(new String[] { "DeviceID=" }, 2, StringSplitOptions.None)[1];

                usbDeviceAddresses.Add(curPnpAddress);
            }

            return usbDeviceAddresses;
        }

        // run a query against Windows Management Infrastructure (MI) and return the resulting collection
        public static ManagementObjectCollection QueryMi(string query)
        {
            ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher(query);
            ManagementObjectCollection result = managementObjectSearcher.Get();

            managementObjectSearcher.Dispose();
            return result;
        }

    }

}

Вам нужно будет добавить обработку исключений, если вы этого хотите.Обратитесь к ответу Даниэля, если хотите выяснить дерево устройств и тому подобное.

4 голосов
/ 04 января 2017

Это гораздо более простой пример для людей, которые ищут только съемные USB-накопители.

using System.IO;

foreach (DriveInfo drive in DriveInfo.GetDrives())
{
    if (drive.DriveType == DriveType.Removable)
    {
        Console.WriteLine(string.Format("({0}) {1}", drive.Name.Replace("\\",""), drive.VolumeLabel));
    }
}
3 голосов
/ 04 мая 2016

Если вы измените ManagementObjectSearcher на следующее:

ManagementObjectSearcher searcher = 
       new ManagementObjectSearcher("root\\CIMV2", 
       @"SELECT * FROM Win32_PnPEntity where DeviceID Like ""USB%"""); 

Так что «GetUSBDevices () будет выглядеть так»

static List<USBDeviceInfo> GetUSBDevices()
{
  List<USBDeviceInfo> devices = new List<USBDeviceInfo>();

  ManagementObjectCollection collection;
  using (var searcher = new ManagementObjectSearcher(@"SELECT * FROM Win32_PnPEntity where DeviceID Like ""USB%"""))
    collection = searcher.Get();      

  foreach (var device in collection)
  {
    devices.Add(new USBDeviceInfo(
    (string)device.GetPropertyValue("DeviceID"),
    (string)device.GetPropertyValue("PNPDeviceID"),
    (string)device.GetPropertyValue("Description")
    ));
  }

  collection.Dispose();
  return devices;
}

}

Ваши результаты будутбыть ограниченным USB-устройствами (в отличие от всех типов в вашей системе)

2 голосов
/ 26 июля 2010

Вы можете найти эту тему полезной. И вот проект кода Google , иллюстрирующий это (он P / вызывает setupapi.dll).

0 голосов
/ 10 октября 2018
  lstResult.Clear();
  foreach (ManagementObject drive in new ManagementObjectSearcher("select * from Win32_DiskDrive where InterfaceType='USB'").Get())
  {
       foreach (ManagementObject partition in new ManagementObjectSearcher("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + drive["DeviceID"] + "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition").Get())
       {
            foreach (ManagementObject disk in new ManagementObjectSearcher("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" + partition["DeviceID"] + "'} WHERE AssocClass = Win32_LogicalDiskToPartition").Get())
            {
                  foreach (var item in disk.Properties)
                  {
                       object value = disk.GetPropertyValue(item.Name);
                  }
                  string valor = disk["Name"].ToString();
                  lstResult.Add(valor);
                  }
             }
        }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...