¿Cómo puedo obtener una lista de todos los dispositivos USB conectados a un ordenador con windows?

OriginalEl autor Robert | 2010-07-25

8 Comentarios

  1. 101

    Agregar una referencia a System.De gestión para el proyecto, a continuación, intente algo como esto:

    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; }
    }
    }
    Hay una manera de recuperar el dispositivo amigable nombre así? Por ejemplo, cuando yo vaya a las propiedades de mi memoria usb me vea «Kingston DataTraveler 2.0 USB Device».
    ¿Cuál es la diferencia entre el DeviceID y PNPDeviceID?
    Al ejecutar el programa anterior, tengo mis discos Duros USB, teclado y ratón, pero no tengo mi cámara USB, mi USB a/D. ¿por Qué no todos mis dispositivos USB?
    debe ser consultado «Win32_USBControllerDevice» y no «Win32_USBHub» para poder recibir la lista de todos los dispositivos usb. A continuación, utilice «Dependiente» de la propiedad para obtener la dirección del dispositivo de la cadena.
    esta búsqueda se lleva a 8seconds para mí. Hay alguna posibilidad de fijar las cosas?

    OriginalEl autor Adel Hazzah

  2. 30

    Sé que estoy contestando a una pregunta vieja, pero sólo fui a través de este mismo ejercicio y encontrar un poco más de información, que creo que va a contribuir mucho a la discusión y ayudar a cualquier otra persona que se encuentra esta pregunta y ve donde las respuestas existentes se quedan cortos.

    La aceptado respuesta está cerca, y se puede corregir mediante el uso de Nedko comentario. Una comprensión más detallada de las Clases WMI implicados ayuda a completar el cuadro.

    Win32_USBHub devuelve sólo USB Centros. Que parece obvio que, en retrospectiva, pero la discusión anterior falle. No se incluyen todos los posibles dispositivos USB, sólo en las que se puede (en teoría, al menos) actuar como centro de dispositivos adicionales. Se echa de menos algunos de los dispositivos que no son centros (especialmente las piezas de los dispositivos compuestos).

    Win32_PnPEntity de no incluir todos los dispositivos USB, y cientos más no de los dispositivos USB. Russel Gantman del consejos para utilizar una búsqueda de la cláusula where Win32_PnPEntity para un DeviceID comienzo con «USB%» para filtrar la lista es útil pero un poco incompleta; se echa de menos que los dispositivos bluetooth, algunas impresoras y servidores de impresión, y compatible con HID ratones y teclados. He visto «USB\%», «USBSTOR\%», «USBPRINT\%», «BTH\%», «SWD\%», y «HID\%». Win32_PnPEntity es, sin embargo, un buen «maestro» de referencia para buscar información una vez que usted está en posesión de la PNPDeviceID de otras fuentes.

    Lo que me encontré fue la mejor manera de enumerar los dispositivos USB fue a consulta Win32_USBControllerDevice. Mientras no dar información detallada de los dispositivos, se hace completamente enumerar sus dispositivos USB y le da un Antecedente/Dependiente par de PNPDeviceIDs para cada Dispositivo USB (incluidos los nodos, no-Hub de dispositivos, y compatible con HID dispositivos) en su sistema. Cada Dependiente que devuelve la consulta será un Dispositivo USB. El Antecedente será el Controlador es asignado a uno de los Controladores USB devuelto por la consulta de Win32_USBController.

    Como un bono, parece que bajo el capó, WMI camina por el Árbol De Dispositivos a la hora de responder a la Win32_USBControllerDevice consulta, por lo que el orden en que estas se devuelven los resultados puede ayudar a identificar las relaciones padre/hijo. (Esto no está documentado y por lo tanto es sólo una conjetura; utilizar SetupDi de la API de CM_Get_Parent (o Niño + Hermano) para los resultados definitivos.) Como una opción para el SetupDi de la API, se observa que, para todos los dispositivos en Win32_USBHub que puede ser consultado en el registro (en HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ + PNPDeviceID) y tendrá un parámetro ParentIdPrefix que será el prefijo de la última campo en el PNPDeviceID de sus hijos, así que este también podría ser utilizado en un comodín que coincide con el filtro de la Win32_PnPEntity consulta.

    Mi solicitud, me hizo el siguiente:

    • (Opcional) Consultar Win32_PnPEntity y almacena los resultados en una clave-valor en el mapa (con PNPDeviceID como la clave) para su posterior recuperación. Esto es opcional, si quieres hacer consultas individuales más tarde.
    • Consultado Win32_USBControllerDevice para una lista definitiva de los dispositivos USB en mi sistema (todos los Dependientes) y se extrajo el PNPDeviceIDs de estos. Me fue más allá, basado en el orden siguiente el árbol de dispositivos, para asignar dispositivos para el concentrador raíz (el primer dispositivo devuelto, en lugar de la controladora) y se construyó un árbol basado en el parentIdPrefix. El fin de la consulta devuelve, que coincide con dispositivo de árbol de enumeración a través de SetupDi, es cada concentrador raíz (para los cuales el Antecedente identifica el controlador), seguido por una iteración de dispositivos de bajo ella, por ejemplo, en mi sistema:
      • Concentrador raíz de primer controlador
      • Concentrador raíz de segundo controlador
        • Primer hub bajo concentrador raíz de segundo controlador (ha parentIdPrefix)
          • Primer dispositivo compuesto en primer hub bajo concentrador raíz de segundo controlador (PNPDeviceID partidos por encima del centro de ParentIdPrefix; tiene su propia ParentIdPrefix)
            • Dispositivo HID parte del dispositivo compuesto (PNPDeviceID partidos por encima de dispositivo compuesto del ParentIDPrefix)
          • Segundo dispositivo en primer hub bajo concentrador raíz de segundo controlador
            • Dispositivo HID parte del dispositivo compuesto
        • Segundo hub bajo concentrador raíz de segundo controlador
          • Primer dispositivo en segundo hub bajo concentrador raíz de segundo controlador de
        • Tercer centro bajo concentrador raíz de segundo controlador de
        • etc.
    • Consultado Win32_USBController. Esto me dio la información detallada de la PNPDeviceIDs de mis controladores que están en la parte superior del árbol de dispositivos (que fueron los Antecedentes de la consulta anterior). Utilizando el árbol de la derivada en el paso anterior, de forma recursiva iterado a sus hijos (la raíz hubs) y sus hijos (los otros hubs) y sus hijos (no-hub de dispositivos y dispositivos compuestos) y sus hijos, etc.
      • Recuperar detalles de cada dispositivo en mi árbol haciendo referencia a la mapa almacenado en el primer paso. (Opcionalmente, se podría omitir el primer paso, y consulta Win32_PnPEntity individual mediante el PNPDeviceId para obtener la información en este paso; probablemente una cpu vs memoria de compromiso de la determinación de qué orden es mejor).

    En resumen, Win32USBControllerDevice Dependientes son una lista completa de Dispositivos USB en un sistema (aparte de los propios Controladores, que son los Antecedentes en que la misma consulta), y por la referencia a estos PNPDeviceId pares con la información del registro y de las otras consultas mencionadas, una imagen detallada puede ser construido.

    Si uno tiene 4 idéntica escáneres conectados, ¿cómo podría distinguir cual era cual si fuesen utilizadas en 4 diferentes operaciones, por ejemplo?
    El PNPDeviceID es único, ya que el tiempo que está conectado. No habría manera de saber si usted desconectados y conectados a un segundo idénticos de una tarde. Este ID es también referenciada en otras áreas para poder identificar que la operación se utiliza.
    Si los dispositivos se había construido-en los números de serie, a continuación, los dispositivos podrían ser diferenciados (que es el propósito de los números de serie). El número de serie se utiliza como la PnP «ID de instancia». Si el dispositivo no contiene un número de serie, a continuación, el IDENTIFICADOR de instancia es esencialmente la ruta a través del árbol de dispositivos desde la raíz en el dispositivo (y contiene ‘&’ caracteres)

    OriginalEl autor Daniel Widdis

  3. 12

    Para ver los dispositivos me interesaba, tenía reemplazar Win32_USBHub por Win32_PnPEntity en Adel Hazzah del código, basado en este post. Esto funciona para mí:

    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; }
    }
    }

    OriginalEl autor ocroquette

  4. 4

    Esta es una forma mucho más simple ejemplo para la gente que sólo busca extraíbles, unidades usb.

    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));
    }
    }
    Devolverá un disquete así, probablemente lectores de tarjetas USB, es posible Zip, Jazz, & Orbe unidades

    OriginalEl autor Baddack

  5. 4

    Adel Hazzah del respuesta da código de trabajo, Daniel Widdis del y Nedko del comentarios mencione que usted necesita para consulta Win32_USBControllerDevice y el uso de sus Dependientes propiedad, y de Daniel respuesta da un montón de detalles, sin código.

    He aquí una síntesis de la discusión anterior para proporcionar el código de trabajo el que se enumeran los directamente accesible dispositivo PNP propiedades de todos los dispositivos USB conectados:

    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;
    }
    }
    }

    Deberá agregar el manejo de excepciones si usted lo desea. Consultar Daniel respuesta si se quiere averiguar el árbol de dispositivos y tal.

    OriginalEl autor Tydaeus

  6. 3

    Si cambia la ManagementObjectSearcher a la siguiente:

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

    Por lo que el «GetUSBDevices() se parece a esto»

    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;
    }

    }

    Sus resultados serán limitados a los dispositivos USB (como opuesto a todos los tipos en su sistema)

    La cláusula where de la búsqueda para deviceIDs comenzando con USB echa de menos algunos elementos. Es mejor para recorrer los Dependientes de «Win32_USBControllerDevice»

    OriginalEl autor Russell Gantman

  7. 2

    Usted puede encontrar este hilo útil. Y he aquí una proyecto de código de google ejemplifica esta (P/Invoca en setupapi.dll).

    ¿Tiene usted alguna idea de por qué la clase ObjectQuery no tiene una referencia incluso a pesar de que estoy usando el Sistema.La gestión?
    ha añadido la referencia al proyecto? Usted puede hacer esto de ir haga clic en Referencias en el proyecto > Agregar Referencia… > Búsqueda y verificación del Sistema.Gestión > OK.

    OriginalEl autor Darin Dimitrov

  8. 0
      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);
    }
    }
    }
    }

    OriginalEl autor JxDarkAngel

Dejar respuesta

Please enter your comment!
Please enter your name here