Wie kann ich eine Liste aller angeschlossenen USB-Geräte auf einem Windows-Computer abrufen?
92
Fügen Sie einen Verweis auf System.Management für Ihr Projekt hinzu und versuchen Sie Folgendes:
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; }
}
}
Ich weiß, dass ich auf eine alte Frage antworte, aber ich habe gerade dieselbe Übung durchlaufen und ein bisschen mehr Informationen herausgefunden, von denen ich denke, dass sie viel zur Diskussion beitragen und allen anderen helfen werden, die diese Frage finden und sehen, wo die Bestehende Antworten sind unzureichend.
Die akzeptierte Antwort ist nah und kann mit Nedkos Kommentar korrigiert werden . Ein detaillierteres Verständnis der beteiligten WMI-Klassen rundet das Bild ab.
Win32_USBHub
Gibt nur USB- Hubs zurück . Das scheint im Nachhinein offensichtlich, aber die obige Diskussion übersieht es. Es sind nicht alle möglichen USB-Geräte enthalten, sondern nur diejenigen, die (zumindest theoretisch) als Hub für zusätzliche Geräte fungieren können. Es fehlen einige Geräte, die keine Hubs sind (insbesondere Teile von Verbundgeräten).Win32_PnPEntity
Enthält alle USB-Geräte und Hunderte weiterer Nicht-USB-Geräte. Russel Gantmans Rat, eine WHERE-Klausel zu verwenden, umWin32_PnPEntity
nach einer Geräte-ID zu suchen, die mit "USB%" beginnt, um die Liste zu filtern, ist hilfreich, aber etwas unvollständig. Es fehlen Bluetooth-Geräte, einige Drucker / Druckserver sowie HID-kompatible Mäuse und Tastaturen. Ich habe "USB \%", "USBSTOR \%", "USBPRINT \%", "BTH \%", "SWD \%" und "HID \%" gesehen.Win32_PnPEntity
ist jedoch eine gute "Master" -Referenz, um Informationen nachzuschlagen, sobald Sie im Besitz der PNPDeviceID aus anderen Quellen sind.Was ich fand, war der beste Weg, um USB-Geräte aufzulisten, das Abfragen
Win32_USBControllerDevice
. Es enthält zwar keine detaillierten Informationen zu den Geräten, listet jedoch Ihre USB-Geräte vollständig auf und bietet Ihnen ein Antecedent / Dependent-Paar vonPNPDeviceID
s für jedes USB-Gerät (einschließlich Hubs, Nicht-Hub-Geräte und HID-kompatible Geräte) auf Ihrem Gerät System. Jeder von der Abfrage zurückgegebene Abhängige ist ein USB-Gerät. Der Antecedent ist der Controller, dem er zugewiesen ist, einer der USB-Controller, die durch Abfrage zurückgegeben werdenWin32_USBController
.Als Bonus scheint WMI unter der Haube den Gerätebaum zu durchlaufen, wenn auf die
Win32_USBControllerDevice
Abfrage geantwortet wird. Die Reihenfolge, in der diese Ergebnisse zurückgegeben werden, kann daher dazu beitragen, Eltern-Kind-Beziehungen zu identifizieren. (Dies ist nicht dokumentiert und daher nur eine Vermutung. Verwenden Sie CM_Get_Parent (oder Child + Sibling ) der SetupDi-API für endgültige Ergebnisse.) Als Option für die SetupDi-API können anscheinend alle unter aufgeführten GeräteWin32_USBHub
nachgeschlagen werden in der Registrierung (atHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ + PNPDeviceID
) und hat einen Parameter,ParentIdPrefix
der das Präfix des letzten Felds in der PNPDeviceID seiner untergeordneten Felder ist, sodass dies auch in einem Platzhalterabgleich zum Filtern derWin32_PnPEntity
Abfrage verwendet werden kann.In meiner Bewerbung habe ich Folgendes getan:
Win32_PnPEntity
und Speicherung der Ergebnisse in einer Schlüsselwertzuordnung (mit PNPDeviceID als Schlüssel) zum späteren Abrufen. Dies ist optional, wenn Sie später einzelne Abfragen durchführen möchten.Win32_USBControllerDevice
nach einer endgültigen Liste der USB-Geräte auf meinem System (alle Abhängigen) und Extraktion der PNPDeviceIDs dieser. Ich ging weiter, basierend auf der Reihenfolge nach dem Gerätebaum, Geräte dem Root-Hub zuzuweisen (das erste zurückgegebene Gerät anstelle des Controllers) und erstellte einen Baum basierend auf dem parentIdPrefix. Die von der Abfrage zurückgegebene Reihenfolge, die der Gerätebaumaufzählung über SetupDi entspricht, ist jeder Root-Hub (für den der Antecedent den Controller identifiziert), gefolgt von einer Iteration der darunter liegenden Geräte, z. B. auf meinem System:Win32_USBController
. Dies gab mir die detaillierten Informationen zu den PNPDeviceIDs meiner Controller, die sich oben im Gerätebaum befinden (die die Antezedenzien der vorherigen Abfrage waren). Verwenden Sie den im vorherigen Schritt abgeleiteten Baum, um rekursiv über seine untergeordneten Elemente (die Root-Hubs) und ihre untergeordneten Elemente (die anderen Hubs) und ihre untergeordneten Elemente (Nicht-Hub-Geräte und zusammengesetzte Geräte) und ihre untergeordneten Elemente usw. zu iterieren.Win32_PnPEntity
einzeln mit der PNPDeviceId abfragen, um die Informationen in diesem Schritt zu erhalten. Wahrscheinlich ein Kompromiss zwischen CPU und Speicher, der bestimmt, welche Reihenfolge besser ist.)Zusammenfassend ist
Win32USBControllerDevice
Dependents eine vollständige Liste der USB-Geräte auf einem System (mit Ausnahme der Controller selbst, die die Antecedents in derselben Abfrage sind), und durch Querverweise auf diesePNPDeviceId
Paare mit Informationen aus der Registrierung und den anderen genannten Abfragen. es kann ein detailliertes Bild erstellt werden.quelle
Um die Geräte sehe ich interessiert war, hatte ich ersetzen
Win32_USBHub
durchWin32_PnPEntity
in Adel Hazzah Kodex, basierend auf diesen Beitrag . Das funktioniert bei mir:quelle
Adel Hazzah Die Antwort ergibt Code arbeiten, Daniel Widdis ist und Nedko der Kommentare erwähnen , dass Sie Win32_USBControllerDevice abfragen müssen, und nutzen seine Dependent - Eigenschaft und Daniels Antwort gibt viele Details , ohne Code.
Hier ist eine Synthese der obigen Diskussion, um einen Arbeitscode bereitzustellen, der die direkt zugänglichen PNP-Geräteeigenschaften aller angeschlossenen USB-Geräte auflistet:
Sie müssen die Ausnahmebehandlung hinzufügen, wenn Sie dies wünschen. Konsultieren Sie Daniels Antwort, wenn Sie den Gerätebaum und dergleichen herausfinden möchten.
quelle
Dies ist ein viel einfacheres Beispiel für Leute, die nur nach austauschbaren USB-Laufwerken suchen.
using System.IO;
quelle
Wenn Sie den ManagementObjectSearcher wie folgt ändern:
Das "GetUSBDevices () sieht also so aus"
}}
Ihre Ergebnisse sind auf USB-Geräte beschränkt (im Gegensatz zu allen Typen auf Ihrem System).
quelle
Du wirst vielleicht finden diesen Thread nützlich finden. Und hier ist ein Google-Code-Projekt, das dies veranschaulicht (es wird aufgerufen
setupapi.dll
).quelle
quelle
object value
tun?