web-dev-qa-db-fra.com

Obtenir la liste des périphériques USB connectés

Comment obtenir une liste de tous les périphériques USB connectés sur un ordinateur Windows?

76
Robert

Ajoutez une référence à System.Management pour votre projet, puis essayez l'une des solutions suivantes:

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; }
  }
}
100
Adel Hazzah

Je sais que je réponds à une vieille question, mais je viens de passer à travers le même exercice et de découvrir un peu plus d'informations. Je pense que cela contribuera beaucoup à la discussion et aidera quiconque trouve cette question et voit où le les réponses existantes sont insuffisantes.

Le la réponse acceptée est proche et peut être corrigé avec le commentaire de Nedko . Une compréhension plus détaillée des classes WMI impliquées aide à compléter le tableau.

Win32_USBHub renvoie uniquement USB Hubs. Cela semble évident avec le recul mais la discussion ci-dessus l’ignore. Il n'inclut pas tous les périphériques USB possibles, mais uniquement ceux qui peuvent (du moins en théorie) servir de concentrateur pour des périphériques supplémentaires. Il manque certains périphériques qui ne sont pas des concentrateurs (en particulier des composants de périphériques composites).

Win32_PnPEntity inclut tous les périphériques USB et des centaines de périphériques non USB. Russel Gantman conseil de recourir à une recherche de clause WHERE - code-- pour un DeviceID commençant par "USB%" afin de filtrer la liste est utile mais légèrement incomplet; il manque des périphériques Bluetooth, certaines imprimantes/serveurs d'impression, ainsi que des souris et des claviers compatibles HID. J'ai vu "USB \%", "USBSTOR \%", "USBPRINT \%", "BTH \%", "SWD \%" et "HID \%". Win32_PnPEntity est, cependant, une bonne référence "maîtresse" pour rechercher des informations une fois que vous êtes en possession du PNPDeviceID provenant d'autres sources.

Ce que j’ai trouvé est le meilleur moyen d’énumérer les périphériques USB, c’est d’interroger Win32_PnPEntity. Bien qu’elle ne fournisse pas d’informations détaillées sur les périphériques, elle énumère complètement vos périphériques USB et vous fournit une paire d'antécédents/dépendants de PNPDeviceIDs pour chaque périphérique USB (y compris les concentrateurs, les périphériques non-concentrateurs et les périphériques compatibles HID). système. Chaque personne à charge renvoyée par la requête sera un périphérique USB. L'antécédent sera le contrôleur auquel il est affecté, l'un des contrôleurs USB renvoyés par la requête Win32_USBControllerDevice

En prime, il semble que sous le capot, WMI parcourt le Tree Tree lors de la réponse à la requête Win32_USBController, afin que l’ordre dans lequel ces résultats sont renvoyés puisse aider à identifier les relations parent/enfant. (Ceci n'est pas documenté et n'est donc qu'une conjecture; utilisez les paramètres CM_Get_Parent (ou Child + Sibling de l'API SetupDi) pour obtenir des résultats définitifs.) que pour tous les périphériques listés sous Win32_USBControllerDevice, ils peuvent être recherchés dans le registre (at Win32_USBHub) et auront un paramètre ParentIdPrefix qui sera le préfixe du dernier champ dans le PNPDeviceID de ses enfants, cela pourrait donc également être utilisé dans une correspondance générique pour filtrer la requête HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ + PNPDeviceID.

Dans ma candidature, j'ai fait ce qui suit:

  • (Facultatif) Interrogé Win32_PnPEntity et stocké les résultats dans une mappe clé-valeur (avec PNPDeviceID comme clé) pour une extraction ultérieure. Ceci est facultatif si vous souhaitez effectuer ultérieurement des requêtes individuelles.
  • Interrogé Win32_PnPEntity pour obtenir une liste définitive des périphériques USB de mon système (tous les dépendants) et extrait les PNPDeviceIDs de ces derniers. Je suis allé plus loin, en fonction de l'ordre suivant l'arborescence de périphériques, pour affecter des périphériques au concentrateur racine (le premier périphérique renvoyé, plutôt que le contrôleur) et j'ai construit une arborescence basée sur le préfixe parentId. L'ordre renvoyé par la requête, qui correspond à l'énumération de l'arborescence de périphériques via SetupDi, correspond à chaque concentrateur racine (pour lequel l'Antecedent identifie le contrôleur), suivi d'une itération des périphériques correspondants, par exemple sur mon système: .____.
    • Hub racine du premier contrôleur
    • Hub racine du second contrôleur
      • Premier concentrateur sous le concentrateur racine du second contrôleur (avec parentIdPrefix)
        • Premier périphérique composite situé sous le premier concentrateur sous le concentrateur racine du deuxième contrôleur (PNPDeviceID correspond au ParentIdPrefix ci-dessus du concentrateur; a son propre ParentIdPrefix)
          • Partie Périphérique HID du périphérique composite (PNPDeviceID correspond au préfixe ParentID du périphérique composite)
        • Deuxième périphérique sous le premier concentrateur sous le concentrateur racine du deuxième contrôleur
          • Partie HID Device du périphérique composite
      • Deuxième concentrateur sous le concentrateur racine du deuxième contrôleur
        • Premier périphérique sous le second concentrateur sous le concentrateur racine du second contrôleur
      • Troisième hub sous le hub racine du second contrôleur
      • etc.
  • Interrogé Win32_USBControllerDevice. Cela m'a donné les informations détaillées sur les PNPDeviceIDs de mes contrôleurs qui se trouvent en haut de l'arborescence de périphériques (qui étaient les antécédents de la requête précédente). En utilisant l’arborescence dérivée à l’étape précédente, itérative récursive sur ses enfants (les concentrateurs racines) et leurs enfants (les autres concentrateurs) et leurs enfants (périphériques non concentrateurs et composites) et leurs enfants, etc. .Récupération des détails pour chaque périphérique de mon arbre en référençant la carte stockée dans la première étape. (Vous pouvez éventuellement ignorer la première étape et interroger Win32_USBController individuellement à l'aide de PNPDeviceId pour obtenir les informations à cette étape. Probablement un compromis entre le processeur et la mémoire déterminant le meilleur ordre.)
    • Retrieved details for each device in my tree by referencing the map stored in the first step. (Optionally, one could skip the first step, and query Win32_PnPEntity individually using the PNPDeviceId to get the information at this step; probably a cpu vs. memory tradeoff determining which order is better.)

In summary, Win32USBControllerDevice Dependents are a complete list of USB Devices on a system (other than the Controllers themselves, which are the Antecedents in that same query), and by cross-referencing these PNPDeviceId pairs with information from the registry and from the other queries mentioned, a detailed picture can be constructed.

29
Daniel Widdis

Pour voir les appareils qui m'intéressaient, je devais remplacer Win32_USBHub par Win32_PnPEntity dans le code d'Adel Hazzah, basé sur this post . Cela fonctionne pour moi:

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

Ceci est un exemple beaucoup plus simple pour les personnes recherchant uniquement des lecteurs USB amovibles.

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));
    }
}
5
Baddack

Si vous modifiez ManagementObjectSearcher comme suit:

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

Donc, "GetUSBDevices () ressemble à ceci"

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

}

Vos résultats seront limités aux périphériques USB (par opposition à tous les types de votre système)

3
Russell Gantman

Vous pouvez trouver ce fil utile. Et voici un projet de code google qui en est un exemple (il est appelé dans setupapi.dll).

2
Darin Dimitrov
  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);
                  }
             }
        }
   }
0
JxDarkAngel