Antworten:
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, um Win32_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 von PNPDeviceID
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 werden Win32_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äte Win32_USBHub
nachgeschlagen werden in der Registrierung (at HKEY_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 der Win32_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 diese PNPDeviceId
Paare mit Informationen aus der Registrierung und den anderen genannten Abfragen. es kann ein detailliertes Bild erstellt werden.
Um die Geräte sehe ich interessiert war, hatte ich ersetzen Win32_USBHub
durch Win32_PnPEntity
in Adel Hazzah Kodex, basierend auf diesen Beitrag . Das funktioniert bei mir:
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; }
}
}
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:
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;
}
}
}
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.
Dies ist ein viel einfacheres Beispiel für Leute, die nur nach austauschbaren USB-Laufwerken suchen.
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));
}
}
Wenn Sie den ManagementObjectSearcher wie folgt ändern:
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2",
@"SELECT * FROM Win32_PnPEntity where DeviceID Like ""USB%""");
Das "GetUSBDevices () sieht also so aus"
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;
}
}}
Ihre Ergebnisse sind auf USB-Geräte beschränkt (im Gegensatz zu allen Typen auf Ihrem System).
Du wirst vielleicht finden diesen Thread nützlich finden. Und hier ist ein Google-Code-Projekt, das dies veranschaulicht (es wird aufgerufen setupapi.dll
).
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);
}
}
}
}
object value
tun?