Comment puis-je obtenir une liste de tous les périphériques USB connectés sur un ordinateur Windows?
Ajoutez une référence à System.Management pour votre projet, puis essayez quelque chose comme ceci:
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(ssortingng[] 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 GetUSBDevices() { List devices = new List (); ManagementObjectCollection collection; using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub")) collection = searcher.Get(); foreach (var device in collection) { devices.Add(new USBDeviceInfo( (ssortingng)device.GetPropertyValue("DeviceID"), (ssortingng)device.GetPropertyValue("PNPDeviceID"), (ssortingng)device.GetPropertyValue("Description") )); } collection.Dispose(); return devices; } } class USBDeviceInfo { public USBDeviceInfo(ssortingng deviceID, ssortingng pnpDeviceID, ssortingng description) { this.DeviceID = deviceID; this.PnpDeviceID = pnpDeviceID; this.Description = description; } public ssortingng DeviceID { get; private set; } public ssortingng PnpDeviceID { get; private set; } public ssortingng Description { get; private set; } } }
Je sais que je réponds à une vieille question, mais je viens de faire le même exercice et j’ai trouvé un peu plus d’informations, ce qui, je pense, consortingbuera beaucoup à la discussion et aidera quiconque trouve cette question et voit où les réponses existantes sont insuffisantes.
La réponse acceptée est proche et peut être corrigée en utilisant le commentaire de Nedko . Une compréhension plus détaillée des classes WMI impliquées permet de compléter le tableau.
Win32_USBHub
renvoie uniquement des concentrateurs USB. Cela semble évident avec le recul mais la discussion ci-dessus lui manque. Il n’inclut pas tous les périphériques USB possibles, seuls ceux qui peuvent (en théorie du moins) servir de hub 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. Le conseil de Russel Gantman d’utiliser une recherche de clause WHERE Win32_PnPEntity
pour un DeviceID commençant par “USB%” pour filtrer la liste est utile mais légèrement incomplet; Il manque des périphériques Bluetooth, des imprimantes / serveurs d’impression, 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ître” pour rechercher des informations une fois que vous êtes en possession du PNPDeviceID d’autres sources.
Ce que j’ai trouvé était le meilleur moyen d’énumérer les périphériques USB était d’interroger Win32_USBControllerDevice
. Bien qu’il ne fournisse pas d’informations détaillées sur les périphériques, il énumère complètement vos périphériques USB et vous offre une paire Antecedent / Dependent of PNPDeviceID
pour chaque périphérique USB (y compris les concentrateurs, les périphériques non-Hub et les périphériques compatibles HID) sur votre 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 Win32_USBController
il est assigné, l’un des contrôleurs USB renvoyé en interrogeant Win32_USBController
.
En prime, il semble que sous le capot, WMI parcourt l’ arborescence des périphériques lorsqu’il répond à la requête Win32_USBControllerDevice
. Par conséquent, l’ordre dans lequel ces résultats sont renvoyés peut aider à identifier les relations parent / enfant. (Ceci n’est pas documenté et n’est donc qu’une supposition; utilisez l’API SetupDi CM_Get_Parent (ou Child + Sibling ) pour obtenir des résultats définitifs.) En tant qu’option de l’API SetupDi, il semble que tous les périphériques listés sous Win32_USBHub
dans le registre (à HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ + PNPDeviceID
) et aura un paramètre ParentIdPrefix
qui sera le préfixe du dernier champ dans le PNPDeviceID de ses enfants, donc cela pourrait également être utilisé dans une correspondance générique avec filtrer la requête Win32_PnPEntity
.
Dans ma demande, j’ai fait ce qui suit:
Win32_PnPEntity
et stocké les résultats dans un mappage de valeurs-clés (avec PNPDeviceID comme clé) pour une récupération ultérieure. Ceci est facultatif si vous souhaitez effectuer des requêtes individuelles ultérieurement. Win32_USBControllerDevice
pour une liste définitive des périphériques USB sur mon système (toutes les dépendances) et extrait les identifiants PNPDeviceID. Je suis allé plus loin, en fonction de l’ordre suivant l’arborescence des périphériques, pour atsortingbuer des périphériques au concentrateur racine (le premier périphérique renvoyé, plutôt que le contrôleur) et créer une arborescence basée sur le préfixe parentId. L’ordre renvoyé par la requête, qui correspond à l’énumération de l’arbre du périphérique via SetupDi, correspond à chaque concentrateur racine (pour lequel l’antécédent identifie le contrôleur), suivi d’une itération des périphériques, par exemple sur mon système:
Win32_USBController
. Cela m’a donné les informations détaillées sur les PNPDeviceID de mes contrôleurs qui se trouvent en haut de l’arborescence des périphériques (qui étaient les antécédents de la requête précédente). En utilisant l’arbre dérivé à l’étape précédente, itère de manière récursive sur ses enfants (les hubs racine) et leurs enfants (les autres hubs) et leurs enfants (périphériques non concentrés et périphériques composites) et leurs enfants, etc.
Win32_PnPEntity
individuellement à l’aide de PNPDeviceId pour obtenir les informations à cette étape; probablement un compromis entre le processeur et la mémoire pour déterminer quel ordre est le meilleur). En résumé, les dépendances Win32USBControllerDevice
sont une liste complète de périphériques USB sur un système (autres que les contrôleurs eux-mêmes, qui sont les antécédents de la même requête) et en PNPDeviceId
références PNPDeviceId
ces paires PNPDeviceId
avec les informations du registre et des autres requêtes. mentionné, une image détaillée peut être construite.
Pour voir les appareils qui m’intéressaient, j’avais remplacé Win32_USBHub
par Win32_PnPEntity
dans le code d’Adel Hazzah, basé sur ce 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(ssortingng[] 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 GetUSBDevices() { List devices = new List (); ManagementObjectCollection collection; using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_PnPEntity")) collection = searcher.Get(); foreach (var device in collection) { devices.Add(new USBDeviceInfo( (ssortingng)device.GetPropertyValue("DeviceID"), (ssortingng)device.GetPropertyValue("PNPDeviceID"), (ssortingng)device.GetPropertyValue("Description") )); } collection.Dispose(); return devices; } } class USBDeviceInfo { public USBDeviceInfo(ssortingng deviceID, ssortingng pnpDeviceID, ssortingng description) { this.DeviceID = deviceID; this.PnpDeviceID = pnpDeviceID; this.Description = description; } public ssortingng DeviceID { get; private set; } public ssortingng PnpDeviceID { get; private set; } public ssortingng Description { get; private set; } } }
Si vous modifiez le ManagementObjectSearcher à la suivante:
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", @"SELECT * FROM Win32_PnPEntity where DeviceID Like ""USB%""");
Donc, le “GetUSBDevices () ressemble à ceci”
static List GetUSBDevices() { List devices = new List (); 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( (ssortingng)device.GetPropertyValue("DeviceID"), (ssortingng)device.GetPropertyValue("PNPDeviceID"), (ssortingng)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)
Vous pouvez trouver ce fil utile. Et voici un projet de code google illustrant cela (c’est P / setupapi.dll
dans setupapi.dll
).
Ceci est un exemple beaucoup plus simple pour les personnes qui recherchent uniquement des lecteurs USB amovibles.
using System.IO;
foreach (DriveInfo drive in DriveInfo.GetDrives()) { if (drive.DriveType == DriveType.Removable) { Console.WriteLine(ssortingng.Format("({0}) {1}", drive.Name.Replace("\\",""), drive.VolumeLabel)); } }
La réponse d’ Adel Hazzah donne un code fonctionnel, les commentaires de Daniel Widdis et de Nedko mentionnent que vous devez interroger Win32_USBControllerDevice et utiliser sa propriété Dependent, et la réponse de Daniel donne beaucoup de détails sans code.
Voici une synthèse de la discussion ci-dessus pour fournir un code de travail qui répertorie les propriétés du périphérique PNP directement accessibles de tous les périphériques USB connectés:
using System; using System.Collections.Generic; using System.Management; // reference required namespace cSharpUtilities { class UsbBrowser { public static void PrintUsbDevices() { IList usbDevices = GetUsbDevices(); foreach (ManagementBaseObject usbDevice in usbDevices) { Console.WriteLine("----- DEVICE -----"); foreach (var property in usbDevice.Properties) { Console.WriteLine(ssortingng.Format("{0}: {1}", property.Name, property.Value)); } Console.WriteLine("------------------"); } } public static IList GetUsbDevices() { IList usbDeviceAddresses = LookUpUsbDeviceAddresses(); List usbDevices = new List (); foreach (ssortingng 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 LookUpUsbDeviceAddresses() { // this query gets the addressing information for connected USB devices ManagementObjectCollection usbDeviceAddressInfo = QueryMi(@"Select * from Win32_USBControllerDevice"); List usbDeviceAddresses = new List (); foreach(var device in usbDeviceAddressInfo) { ssortingng curPnpAddress = (ssortingng)device.GetPropertyValue("Dependent"); // split out the address portion of the data; note that this includes escaped backslashes and quotes curPnpAddress = curPnpAddress.Split(new Ssortingng[] { "DeviceID=" }, 2, SsortingngSplitOptions.None)[1]; usbDeviceAddresses.Add(curPnpAddress); } return usbDeviceAddresses; } // run a query against Windows Management Infrastructure (MI) and return the resulting collection public static ManagementObjectCollection QueryMi(ssortingng query) { ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher(query); ManagementObjectCollection result = managementObjectSearcher.Get(); managementObjectSearcher.Dispose(); return result; } } }
Vous devrez append la gestion des exceptions si vous le souhaitez. Consultez la réponse de Daniel si vous voulez comprendre l’arbre des périphériques et autres.