Comment 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 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; }
}
}
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 PNPDeviceID
s 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:
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.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: .____.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.)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.
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; }
}
}
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));
}
}
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)
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);
}
}
}
}