it-swarm.com.de

Liste der angeschlossenen USB-Geräte abrufen

Wie kann ich eine Liste aller angeschlossenen USB-Geräte auf einem Windows-Computer erhalten?

76
Robert

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

Ich weiß, dass ich auf eine alte Frage antworte, aber ich habe gerade dieselbe Übung durchlaufen und ein bisschen mehr Informationen herausgefunden, die meiner Meinung nach viel zur Diskussion beitragen und allen anderen helfen werden, die diese Frage finden und sehen, wo die vorhandene Antworten sind unzureichend.

Die akzeptierte Antwort ist nah und kann mit Nedkos Kommentar korrigiert werden. Ein genaueres 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 lässt es aus. 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 weitere Nicht-USB-Geräte. Russel Gantmans Der Ratschlag, mit einer WHERE-Klausel Win32_PnPEntity Nach einer DeviceID 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 "Haupt" -Referenz, um Informationen nachzuschlagen, sobald Sie im Besitz der PNPDeviceID aus anderen Quellen sind.

Was ich fand, war die beste Möglichkeit, USB-Geräte zu zählen, die Abfrage von Win32_USBControllerDevice. Es gibt zwar keine detaillierten Informationen zu den Geräten, listet jedoch Ihre USB-Geräte vollständig auf und gibt Ihnen für jedes USB-Gerät (einschließlich Hubs, Nicht-Hub-Geräte und HID-Geräte) ein vorzeitiges/abhängiges Paar von PNPDeviceIDs. kompatiblen Geräten) auf Ihrem 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 wird durch Abfrage von Win32_USBController Zurückgegeben.

Als Bonus sieht es so aus, als würde WMI bei der Beantwortung der Win32_USBControllerDevice - Abfrage unter der Haube den Gerätebaum durchgehen, sodass die Reihenfolge, in der diese Ergebnisse zurückgegeben werden, dabei helfen kann, Eltern/Kind zu identifizieren Beziehungen. (Dies ist nicht dokumentiert und ist daher nur eine Vermutung. Verwenden Sie die SetupDi-APIs CM_Get_Parent (oder Child + Sibling ) für definitive Ergebnisse.) As Als Option für die SetupDi-API können alle unter Win32_USBHub aufgelisteten Geräte in der Registrierung nachgeschlagen werden (unter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ + PNPDeviceID) und haben einen Parameter ParentIdPrefix Dies ist das Präfix des letzten Felds in der PNPDeviceID seiner untergeordneten Elemente, sodass dies auch in einer Platzhalterübereinstimmung zum Filtern der Win32_PnPEntity - Abfrage verwendet werden kann.

In meiner Bewerbung habe ich Folgendes getan:

  • (Optional) Abgefragt Win32_PnPEntity Und die Ergebnisse in einer Schlüsselwertzuordnung (mit PNPDeviceID als Schlüssel) zum späteren Abrufen gespeichert. Dies ist optional, wenn Sie später einzelne Abfragen durchführen möchten.
  • Abgefragt Win32_USBControllerDevice Für eine definitive Liste der USB-Geräte auf meinem System (alle Abhängigen) und extrahiert die PNPDeviceIDs von diesen. Ich ging weiter, basierend auf der Reihenfolge, die dem Gerätebaum folgt, um Geräte dem Root-Hub zuzuweisen (das erste zurückgegebene Gerät und nicht der Controller) und erstellte einen Baum basierend auf dem parentIdPrefix. Die von der Abfrage zurückgegebene Reihenfolge, die mit der Gerätebaumaufzählung über SetupDi übereinstimmt, ist jeder Root-Hub (für den der Antecedent den Controller identifiziert), gefolgt von einer Iteration der Geräte darunter, z. B. auf meinem System:
    • Root-Hub des ersten Controllers
    • Root-Hub des zweiten Controllers
      • Erster Hub unter Root-Hub des zweiten Controllers (hat parentIdPrefix)
        • Erstes zusammengesetztes Gerät unter dem ersten Hub unter dem Root-Hub des zweiten Controllers (PNPDeviceID stimmt mit dem ParentIdPrefix des Hub überein; hat ein eigenes ParentIdPrefix)
          • HID-Geräteteil des zusammengesetzten Geräts (PNPDeviceID stimmt mit ParentIDPrefix des zusammengesetzten Geräts überein)
        • Zweites Gerät unter dem ersten Hub unter dem Root-Hub des zweiten Controllers
          • HID Device Teil des zusammengesetzten Geräts
      • Zweiter Hub unter Root-Hub des zweiten Controllers
        • Erstes Gerät unter dem zweiten Hub unter dem Root-Hub des zweiten Controllers
      • Dritter Hub unter dem Root-Hub des zweiten Controllers
      • usw.
  • Abgefragt Win32_USBController. Dies gab mir die detaillierten Informationen zu den PNPDeviceIDs meiner Controller, die sich oben im Gerätebaum befinden (die Antecedents der vorherigen Abfrage). Unter Verwendung des im vorherigen Schritt abgeleiteten Baums wurden seine untergeordneten Knoten (die Root-Hubs) und ihre untergeordneten Knoten (die anderen Hubs) und ihre untergeordneten Knoten (Nicht-Hub-Geräte und Verbundgeräte) und ihre untergeordneten Knoten usw. Rekursiv durchlaufen.
    • Ruft Details für jedes Gerät in meinem Baum ab, indem Sie auf die im ersten Schritt gespeicherte Karte verweisen. (Optional kann der erste Schritt übersprungen und Win32_PnPEntity Einzeln mit der PNPDeviceId abgefragt werden, um die Informationen in diesem Schritt abzurufen. 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 (außer den Controllern selbst, die die Antecedents in derselben Abfrage sind) und durch Querverweise auf diese PNPDeviceId Paare mit informationen aus der registrierung und aus den anderen genannten fragen kann ein detailliertes bild erstellt werden.

34
Daniel Widdis

Um die Geräte zu sehen, an denen ich interessiert war, musste ich Win32_USBHub durch Win32_PnPEntity in Adel Hazzahs Code ersetzen, basierend auf diesem Beitrag . Das funktioniert für mich:

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

Dies ist ein viel einfacheres Beispiel für Leute, die nur nach entfernbaren 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));
    }
}
5
Baddack

Wenn Sie den ManagementObjectSearcher folgendermaßen ändern:

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

So sieht "GetUSBDevices () 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 Ihres Systems).

3
Russell Gantman

Adel Hazzahs answer gibt Arbeitscode an, Daniel Widdis und Nedkos Kommentare erwähnen, dass Sie Win32_USBControllerDevice abfragen und die abhängige Eigenschaft verwenden müssen, und Daniels answer enthält viele Details ohne Code.

Hier eine Zusammenfassung der obigen Diskussion, um 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. Wenden Sie sich an Daniels Antwort, wenn Sie den Gerätebaum und so herausfinden möchten.

3
Tydaeus

Sie können diesen Thread nützlich finden. Und hier ist ein google Code-Projekt , das dies beispielhaft veranschaulicht (es ruft P/in setupapi.dll auf).

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