कनेक्टेड USB डिवाइसेस की सूची प्राप्त करें


92

मैं विंडोज़ कंप्यूटर पर सभी जुड़े हुए यूएसबी उपकरणों की सूची कैसे प्राप्त कर सकता हूं?

जवाबों:


119

अपने प्रोजेक्ट के लिए System.Management में एक संदर्भ जोड़ें, फिर कुछ इस तरह आज़माएँ:

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

14
क्या डिवाइस के अनुकूल नाम को भी पुनर्प्राप्त करने का एक तरीका है? उदाहरण के लिए जब मैं अपने यूएसबी स्टिक के गुणों में जाता हूं तो मुझे "किंग्स्टन डेटाट्रेवलर 2.0 यूएसबी डिवाइस" दिखाई देता है।
रॉबर्ट

1
DeviceID और PNPDeviceID में क्या अंतर है?
शिम्मी वेइटहैंडलर

1
जब मैं उपरोक्त कार्यक्रम चलाता हूं, तो मुझे मेरा USB हार्ड डिस्क, मेरा कीबोर्ड और माउस मिलता है, लेकिन मुझे मेरा USB कैमरा, मेरा USB / A / D नहीं मिलता है। मेरे सभी USB डिवाइस क्यों नहीं दिखते?
कर्ट

8
सभी "USB उपकरणों" की सूची प्राप्त करने के लिए इसे "Win32_USBControllerDevice" और "Win32_USBHub" नहीं दिखाया जाना चाहिए। फिर डिवाइस पता स्ट्रिंग प्राप्त करने के लिए "डिपेंडेंट" संपत्ति का उपयोग करें।
नेडको

1
यह खोज मेरे लिए 8 सेकंड का समय लेती है। क्या चीज़ों को व्रत रखने का कोई बंधन है?
डेनियल

45

मुझे पता है कि मैं एक पुराने प्रश्न का उत्तर दे रहा हूं, लेकिन मैं बस इसी अभ्यास के माध्यम से गया और मुझे कुछ और जानकारी मिली, जो मुझे लगता है कि चर्चा में बहुत योगदान देगा और किसी और की मदद करेगा जो इस प्रश्न को देखता है और देखता है कि कहां है मौजूदा उत्तर कम आते हैं।

स्वीकार किए जाते हैं जवाब करीब है, और का उपयोग कर ठीक किया जा सकता Nedko की टिप्पणी यह करने के लिए। WMI क्लासेस की अधिक विस्तृत समझ तस्वीर को पूरा करने में मदद करती है।

Win32_USBHubकेवल USB हब लौटाता है । यह स्पष्ट लगता है, लेकिन इस पर चर्चा याद आती है। इसमें सभी संभव USB डिवाइस शामिल नहीं हैं, केवल वे जो (सिद्धांत में, कम से कम) अतिरिक्त उपकरणों के लिए एक हब के रूप में कार्य कर सकते हैं। यह कुछ ऐसे उपकरणों को याद करता है जो हब नहीं हैं (विशेष रूप से मिश्रित उपकरणों के कुछ भाग)।

Win32_PnPEntityसभी USB उपकरणों और सैकड़ों अधिक गैर-USB उपकरणों को शामिल करता है। सूची को फ़िल्टर करने के लिए "USB%" के साथ शुरुआत करने वाले डिवाइस के लिए WHERE क्लॉज़ खोज का उपयोग करने के लिए रसेल गेंटमैन की सलाह Win32_PnPEntityसहायक है लेकिन थोड़ी अधूरी है; यह ब्लूटूथ डिवाइस, कुछ प्रिंटर / प्रिंट सर्वर और HID- अनुरूप चूहों और कीबोर्ड को याद करता है। मैंने "USB \%", "USBSTOR \%", "USBPRINT \%", "BTH \%", "SWD \%" और "HID \%" देखा है। Win32_PnPEntityहालांकि, एक बार जब आप अन्य स्रोतों से PNPDeviceID के कब्जे में हैं, तो जानकारी देखने के लिए एक अच्छा "मास्टर" संदर्भ है।

मैंने पाया कि USB डिवाइसों की गणना करने का सबसे अच्छा तरीका क्या था Win32_USBControllerDevice। हालांकि यह उपकरणों के लिए विस्तृत जानकारी नहीं देता है, यह आपके USB उपकरणों को पूरी तरह से एन्यूमरेट करता है और आपको PNPDeviceIDहर USB डिवाइस (हब, नॉन-हब डिवाइस और HID- कंप्लायंट डिवाइस सहित) के लिए एक Antecedent / Dependent जोड़ी देता है। प्रणाली। क्वेरी से लौटाया गया प्रत्येक डिपेंडेंट एक USB डिवाइस होगा। Antecedent वह नियंत्रक होगा जिसे इसे सौंपा गया है, USB कंट्रोलर में से एक क्वेरी करके लौटा दिया गया है Win32_USBController

एक बोनस के रूप में, ऐसा प्रतीत होता है कि हुड के तहत, WMI क्वेरी का जवाब देते समय डिवाइस ट्री पर चलता है Win32_USBControllerDevice, इसलिए जिस क्रम में ये परिणाम दिए गए हैं, वह माता-पिता / बच्चे के रिश्तों की पहचान करने में मदद कर सकता है। (यह प्रलेखित नहीं है और इस प्रकार केवल एक अनुमान है। निश्चित परिणामों के लिए SetupDi API के CM_Get_Parent (या बाल + सिबलिंग ) का उपयोग करें ।) SetupDi API के विकल्प के रूप में, ऐसा प्रतीत होता है कि Win32_USBHubउनके तहत सूचीबद्ध सभी उपकरणों पर नज़र रखी जा सकती है। रजिस्ट्री में (पर HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ + PNPDeviceID) और एक पैरामीटर ParentIdPrefixहोगा जो अपने बच्चों के PNPDeviceID में अंतिम क्षेत्र का उपसर्ग होगा, इसलिए Win32_PnPEntityक्वेरी को फ़िल्टर करने के लिए वाइल्डकार्ड मैच में भी इसका उपयोग किया जा सकता है ।

मेरे आवेदन में, मैंने निम्नलिखित कार्य किया:

  • (वैकल्पिक) Win32_PnPEntityबाद में पुनः प्राप्ति के लिए एक कुंजी-मूल्य मानचित्र (PNPDeviceID कुंजी के रूप में) के साथ परिणाम को संग्रहीत और संग्रहीत किया। यदि आप बाद में व्यक्तिगत प्रश्न करना चाहते हैं तो यह वैकल्पिक है।
  • पूछे Win32_USBControllerDeviceएक निश्चित (सभी आश्रितों) अपने सिस्टम पर यूएसबी उपकरणों की सूची के लिए और इनमें से PNPDeviceIDs निकाले। डिवाइस के पेड़ के बाद रूट हब (कंट्रोलर के बजाय पहला उपकरण लौटा), और पेरेंटड्रेफिक्स के आधार पर एक ट्री बनाया। क्रम रिटर्न, जो डिवाइस ट्री एन्यूमरेशन से सेटअपडी के माध्यम से मेल खाता है, प्रत्येक रूट हब है (जिसके लिए एंटेकेडेंट कंट्रोलर की पहचान करता है), इसके बाद डिवाइस के एक पुनरावृत्ति के साथ, जैसे, मेरे सिस्टम पर:
    • पहले कंट्रोलर का रूट हब
    • दूसरे कंट्रोलर का रूट हब
      • दूसरे कंट्रोलर के रूट हब के तहत पहला हब (पेरेंटडायरफिक्स है)
        • दूसरे नियंत्रक के रूट हब के तहत पहले हब के तहत पहला समग्र डिवाइस (हब के ParentIdPrefix के ऊपर PNPDeviceID से मेल खाता है; अपने स्वयं के ParentIdPrefix है)
          • समग्र डिवाइस का छिपा डिवाइस हिस्सा (PNPDeviceID समग्र डिवाइस के ParentIDPrefix से ऊपर से मेल खाता है)
        • दूसरे नियंत्रक के रूट हब के तहत पहले हब के तहत दूसरा उपकरण
          • समग्र डिवाइस का छिपा डिवाइस हिस्सा
      • दूसरे नियंत्रक के रूट हब के तहत दूसरा हब
        • दूसरे नियंत्रक के रूट हब के तहत दूसरे हब के तहत पहला उपकरण
      • दूसरे नियंत्रक के रूट हब के तहत तीसरा हब
      • आदि।
  • विचित्र Win32_USBController। इसने मुझे मेरे नियंत्रकों के PNPDeviceIDs की विस्तृत जानकारी दी, जो डिवाइस ट्री के शीर्ष पर हैं (जो कि पिछले क्वेरी के एंटेकेडेंट्स थे)। पिछले चरण में प्राप्त वृक्ष का उपयोग करते हुए, अपने बच्चों (रूट हब) और उनके बच्चों (अन्य हब) और उनके बच्चों (गैर-हब उपकरणों और समग्र उपकरणों) और उनके बच्चों, इत्यादि पर पुनरावृत्ति की गई।
    • पहले चरण में संग्रहीत मानचित्र को संदर्भित करके मेरे पेड़ के प्रत्येक उपकरण के लिए प्राप्त विवरण। (वैकल्पिक रूप से, कोई भी पहला कदम छोड़ सकता है, और Win32_PnPEntityव्यक्तिगत रूप से इस कदम की जानकारी प्राप्त करने के लिए PNPDeviceId का उपयोग करके क्वेरी कर सकता है; संभवत: एक सीपीयू बनाम मेमोरी ट्रेडऑफ यह निर्धारित करता है कि कौन सा ऑर्डर बेहतर है।)

सारांश में, Win32USBControllerDeviceआश्रित एक प्रणाली पर USB उपकरणों की एक पूरी सूची है (स्वयं नियंत्रकों के अलावा, जो कि उसी क्वेरी में Antecedents हैं), और PNPDeviceIdरजिस्ट्री से जानकारी के साथ इन जोड़ियों को क्रॉस-रेफरेंस करके और उल्लिखित अन्य प्रश्नों से एक विस्तृत चित्र का निर्माण किया जा सकता है।


यदि किसी में 4 समान स्कैनर जुड़े होते हैं, तो आप कैसे भेद करेंगे, जो कि अगर वे 4 अलग-अलग ऑपरेशन में उपयोग किए जाते हैं, उदाहरण के लिए?
टॉपशॉट

2
जब तक यह जुड़ा रहता है @topshot PNPDeviceID अद्वितीय है। यह बताने का कोई तरीका नहीं होगा कि क्या आपने एक को डिस्कनेक्ट किया है और बाद में एक दूसरे समान कनेक्ट किया है। यह आईडी अन्य क्षेत्रों में भी क्रॉस-रेफ़र की गई है ताकि उम्मीद की जा सके कि कौन सा ऑपरेशन इस्तेमाल किया गया है।
डैनियल विडिस

3
यदि उपकरणों में अंतर्निहित सीरियल नंबर थे, तो उपकरणों को विभेदित किया जा सकता है (यह सीरियल नंबर का उद्देश्य है)। सीरियल नंबर का उपयोग PnP "उदाहरण ID" के रूप में किया जाता है। यदि डिवाइस में सीरियल नंबर नहीं है, तो इंस्टेंस आईडी मूल रूप से डिवाइस ट्री से रूट से डिवाइस तक का रास्ता है (और इसमें '&' अक्षर हैं)
ब्रायन

एक गिरावट के रूप में, हमेशा उपकरणों की सूची का अवलोकन करना और बदलावों को देखते हुए अनप्लगिंग और फिर से प्लग करना है।
technophile

14

जिन उपकरणों में मेरी दिलचस्पी थी, उन्हें देखने के लिए, मैंने इस पोस्ट के आधार पर एडेल हज़ाह के कोड में प्रतिस्थापित Win32_USBHubकिया था । यह मेरे लिए काम करता है:Win32_PnPEntity

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

इसने बहुत अच्छा काम किया। चीजों को निर्धारित करने के लिए आसान बनाने के लिए कि आपने किस डिवाइस को अभी प्लग किया है, इसे अंतराल पर चलाने के लिए लिखें, प्रविष्टियों को एक शब्दकोश में लिखें, और आखिरी बार जब आप इसे चलाते हैं, तो किसी भी अतिरिक्त की रिपोर्ट करें।
निक्कुरोई

7

Adel Hazzah का जवाब वर्किंग कोड देता है, डैनियल विडिस और नेडको की टिप्पणियों का उल्लेख है कि आपको Win32_USBControllerDevice को क्वेरी करने और इसकी निर्भर संपत्ति का उपयोग करने की आवश्यकता है, और डैनियल का जवाब कोड के बिना बहुत अधिक विवरण देता है।

यहाँ कार्य कोड प्रदान करने के लिए उपरोक्त चर्चा का एक संश्लेषण है जो सभी जुड़े हुए USB उपकरणों के सीधे सुलभ PNP उपकरण गुणों को सूचीबद्ध करता है:

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

    }

}

यदि आप चाहते हैं तो आपको अपवाद हैंडलिंग को जोड़ना होगा। यदि आप डिवाइस ट्री और इस तरह का पता लगाना चाहते हैं तो डैनियल के जवाब से परामर्श करें।


5

यह केवल हटाने योग्य यूएसबी ड्राइव की तलाश में लोगों के लिए एक बहुत सरल उदाहरण है।

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

2
एक फ्लॉपी के रूप में अच्छी तरह से, शायद USB कार्ड रीडर, संभव ज़िप, जैज, और ओर्ब ड्राइव
मैड माचे

यह उन लोगों के लिए आदर्श समाधान है जो केवल USB के अनुकूल नाम से मेल खाना चाहते हैं। मैं डेटा बैकअप के लिए इस उदाहरण का उपयोग करता हूं और चूंकि ड्राइव पत्र में बदलाव के लिए मुझे नाम देखने की जरूरत है (यहां drive.VolumeLabel)
Bio42

3

यदि आप ManagementObjectSearcher को निम्न में बदलते हैं:

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

तो "GetUSBDevices () इस तरह दिखता है"

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

}

आपके परिणाम USB उपकरणों तक सीमित रहेंगे (आपके सिस्टम पर सभी प्रकारों के विपरीत)


1
जहां USB के साथ शुरू होने वाले डिवाइसआईडी के लिए खोज करने वाला क्लॉज कुछ वस्तुओं को याद करता है। "Win32_USBControllerDevice" के आश्रितों को पुनरावृति करना बेहतर है
डैनियल विडिस

2

आपको यह धागा उपयोगी लग सकता है। और यहाँ एक Google कोड परियोजना है जो इसे (यह पी / इनवॉइस में setupapi.dll) उदाहरण देता है ।


क्या आपके पास कोई विचार है कि क्यों ObjectQuery वर्ग का संदर्भ नहीं है, भले ही मैं System.Management का उपयोग कर रहा हूं?
राबर्ट

@Robert क्या आपने प्रोजेक्ट का संदर्भ जोड़ा है? आप अपनी परियोजना में राइट क्लिक करके> संदर्भ जोड़ें ...> खोज करें और System.Management> ठीक जांचें पर जाकर ऐसा कर सकते हैं।
अर्नेस्ट

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

वह क्या करता है object value?
नौसिखिया

डिस्क पर अन्य उपलब्ध संपत्तियों का दौरा करें, और ऑब्जेक्ट वैल्यू में इसके मूल्य को
बचाएं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.