Get List of connected USB Devices

前端 未结 8 1642
再見小時候
再見小時候 2020-11-22 08:27

How can I get a list of all the connected USB devices on a windows computer?

8条回答
  •  忘了有多久
    2020-11-22 09:03

    Adel Hazzah's answer gives working code, Daniel Widdis's and Nedko's comments mention that you need to query Win32_USBControllerDevice and use its Dependent property, and Daniel's answer gives a lot of detail without code.

    Here's a synthesis of the above discussion to provide working code that lists the directly accessible PNP device properties of all connected USB devices:

    using System;
    using System.Collections.Generic;
    using System.Management; // reference required
    
    namespace cSharpUtilities
    {
        class UsbBrowser
        {
    
            public static void PrintUsbDevices()
            {
                IList 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 GetUsbDevices()
            {
                IList usbDeviceAddresses = LookUpUsbDeviceAddresses();
    
                List usbDevices = new List();
    
                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 LookUpUsbDeviceAddresses()
            {
                // this query gets the addressing information for connected USB devices
                ManagementObjectCollection usbDeviceAddressInfo = QueryMi(@"Select * from Win32_USBControllerDevice");
    
                List usbDeviceAddresses = new List();
    
                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;
            }
    
        }
    
    }
    

    You'll need to add exception handling if you want it. Consult Daniel's answer if you want to figure out the device tree and such.

提交回复
热议问题