Pobierz listę podłączonych urządzeń USB

Jak mogę uzyskać listę wszystkich podłączonych urządzeń USB na komputerze z systemem windows?

 73
Author: Shimmy, 2010-07-26

7 answers

Dodaj odniesienie do systemu.Zarządzanie projektem, a następnie spróbuj czegoś takiego:

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; }
  }
}
 97
Author: Adel Hazzah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-05 22:53:42

Wiem, że odpowiadam na Stare pytanie, ale po prostu przeszedł przez to samo ćwiczenie i dowiedział się trochę więcej informacji, że myślę, że przyczyni się wiele do dyskusji i pomóc każdemu, kto znajdzie to pytanie i widzi, gdzie istniejące odpowiedzi są krótkie.

Przyjęta odpowiedź jest bliska i może być poprawiona za pomocą komentarza Nedko do niej. Bardziej szczegółowe zrozumienie zaangażowanych klas WMI pomaga ukończyć zdjęcie.

Win32_USBHub zwraca tylko Huby USB . Wydaje się to oczywiste z perspektywy czasu, ale powyższa dyskusja go pomija. Nie obejmuje wszystkich możliwych urządzeń USB, tylko te, które mogą (przynajmniej teoretycznie) działać jako hub dla dodatkowych urządzeń. Pomija niektóre urządzenia, które nie są hubami (szczególnie części urządzeń kompozytowych).

Win32_PnPEntity zawiera wszystkie urządzenia USB i setki innych urządzeń nie-USB. Russel Gantman ' s radzi, aby użyć przeszukiwania klauzuli WHERE Win32_PnPEntity dla DeviceID zaczynającego się od "USB%" do filtrowania listy jest pomocny, ale nieco niekompletny; brakuje mu urządzeń bluetooth, niektórych drukarek/serwerów wydruku oraz myszy i klawiatur zgodnych z HID. Widziałem "USB\%"," USBSTOR\%", " USBPRINT\%", " BTH\%", "SWD\%"i" HID\%". Win32_PnPEntity jest jednak dobrym" wzorcem " do wyszukiwania informacji, gdy jesteś w posiadaniu PNPDeviceID z innych źródeł.

Najlepszym sposobem wyliczenia urządzeń USB było zapytanie Win32_USBControllerDevice. Chociaż nie podaje szczegółowych informacji o urządzeniach, to całkowicie wylicza urządzenia USB i daje poprzedzającą / zależną Parę PNPDeviceID s dla każdego urządzenia USB (w tym koncentratorów, urządzeń innych niż Koncentratory i urządzeń zgodnych z HID) w systemie. Każda zależna zwrócona z zapytania będzie urządzeniem USB. Poprzedzającym będzie kontroler, do którego jest przypisany, jeden z kontrolerów USB zwracany przez zapytanie Win32_USBController.

Jako bonus, wydaje się, że pod maską, WMI wyświetla drzewo urządzeń podczas odpowiadania na zapytanie Win32_USBControllerDevice, więc kolejność, w jakiej te wyniki są zwracane, może pomóc zidentyfikować relacje rodzic / dziecko. (Nie jest to udokumentowane i dlatego jest tylko domyśleniem; użyj CM_Get_Parent (lub Child + rodzeństwo ) dla ostatecznych wyników.) Jako opcja dla API SetupDi, wydaje się, że dla wszystkich urządzeń wymienionych w Win32_USBHub mogą być wyszukane w rejestrze (w HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ + PNPDeviceID) i będą miały parametr ParentIdPrefix, który będzie prefiksem ostatniego pola w PNPDeviceID jego potomków, więc może być również użyty w dopasowaniu wieloznacznym do filtrowania zapytania Win32_PnPEntity.

W moim zgłoszeniu zrobiłem:

  • (Opcjonalnie) Odpytywał Win32_PnPEntity i zapisywał wyniki w mapie klucz-wartość (z PNPDeviceID jako kluczem) do późniejszego pobrania. Jest to opcjonalne, jeśli chcesz wykonać poszczególne zapytania później.
  • zapytałem Win32_USBControllerDevice o ostateczną listę urządzeń USB w moim systemie (wszystkie Zależności) i wyodrębnił PNPDeviceIDs z nich. Poszedłem dalej, w oparciu o kolejność po drzewie urządzeń, aby przypisać urządzenia do koncentratora głównego (pierwsze urządzenie wróciło, a nie kontroler) i zbudowałem drzewo oparte na parentIdPrefix. Kolejność zwracana przez zapytanie, która odpowiada wyliczeniu drzewa urządzeń za pomocą SetupDi, to każdy węzeł główny (dla którego poprzedzający identyfikuje kontroler), a następnie iteracja urządzeń pod nim, np. w moim systemie:
    • Root hub of first controller
    • główny koncentrator drugiego kontrolera
      • pierwszy hub pod głównym hub drugiego kontrolera (ma parentIdPrefix)
        • pierwsze urządzenie złożone pod pierwszym hubem pod głównym hubem drugiego kontrolera (PNPDeviceID pasuje do ParentIdPrefix huba; ma swój własny ParentIdPrefix)
            Urządzenie HID część urządzenia kompozytowego (PNPDeviceID pasuje powyżej rodzica urządzenia kompozytowego)
      • drugie urządzenie pod pierwszym hubem pod głównym hubem drugiego kontroler
        • część urządzenia HID złożonego urządzenia
    • drugi hub pod głównym hub drugiego kontrolera
      • pierwsze urządzenie pod drugim hubem pod głównym hubem drugiego kontrolera
    • trzeci hub pod głównym hubem drugiego kontrolera
    • itd.
  • Queried Win32_USBController. To dało mi szczegółowe informacje o identyfikatorach Pnpdeviceid moich kontrolerów, które znajdują się na szczycie drzewa urządzeń (które były poprzedzające poprzednie zapytanie). Używając drzewa uzyskanego w poprzednim kroku, rekurencyjnie iterował nad jego dziećmi (węzłami korzeniowymi) i ich dziećmi (innymi węzłami) oraz ich dziećmi (urządzeniami nie-węzłowymi i urządzeniami kompozytowymi) i ich dziećmi itp.
    • Pobrano szczegóły dla każdego urządzenia w moim drzewie, odwołując się do mapy przechowywanej w pierwszym kroku. (Opcjonalnie można pominąć pierwszy krok i odpytywać Win32_PnPEntity indywidualnie za pomocą PNPDeviceId, aby uzyskać informacje na tym etapie; prawdopodobnie procesor vs. wymiana pamięci określająca, która kolejność jest lepsza.)
  • Podsumowując, Win32USBControllerDevice zależności są kompletną listą urządzeń USB w systemie (innych niż same Kontrolery, które są poprzedzającymi w tym samym zapytaniu), a porównując te pary PNPDeviceId z informacjami z rejestru i z innych zapytań wymienionych, można stworzyć szczegółowy obraz.

     25
    Author: Daniel Widdis,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2018-07-24 18:19:32

    Aby zobaczyć urządzenia, które mnie interesowały, musiałem zastąpić Win32_USBHub przez Win32_PnPEntity w kodzie Adela Hazzaha, na podstawie tego postu. To mi działa:

    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; }
      }
    }
    
     10
    Author: ocroquette,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2017-05-23 10:31:31

    Jeśli zmienisz ManagementObjectSearcher na następujący:

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

    Więc "GetUSBDevices () wygląda tak"

    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;
    }
    

    }

    Twoje wyniki będą ograniczone do urządzeń USB (w przeciwieństwie do wszystkich typów w Twoim systemie)

     3
    Author: Russell Gantman,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2016-05-04 19:44:43

    Jest to o wiele prostszy przykład dla osób szukających tylko wymiennych dysków 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
    Author: Baddack,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2017-01-04 01:00:32

    Możesz znaleźć Ten wątek przydatny. A oto projekt kodu google na przykładzie tego (P / wywołuje w setupapi.dll).

     2
    Author: Darin Dimitrov,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2010-07-25 21:20:08

    ODPOWIEDŹ Adela Hazzaha podaje działający kod, Komentarze Daniela Widdisai Nedkowspominają, że musisz odpytywać Win32_USBControllerDevice i używać jego zależnej właściwości, a odpowiedź Daniela daje wiele szczegółów bez kodu.

    Oto synteza powyższej dyskusji, aby dostarczyć działający kod, który wymienia bezpośrednio dostępne właściwości urządzeń PNP wszystkich podłączonych urządzeń 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;
            }
    
        }
    
    }
    

    Musisz dodać obsługę wyjątków, jeśli chcesz tego. Skonsultuj odpowiedź Daniela, jeśli chcesz dowiedzieć się o drzewie urządzeń i tym podobnych.

     2
    Author: Tydaeus,
    Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
    2018-01-22 21:07:43