मैं विंडोज़ कंप्यूटर पर सभी जुड़े हुए यूएसबी उपकरणों की सूची कैसे प्राप्त कर सकता हूं?
जवाबों:
अपने प्रोजेक्ट के लिए 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; }
}
}
मुझे पता है कि मैं एक पुराने प्रश्न का उत्तर दे रहा हूं, लेकिन मैं बस इसी अभ्यास के माध्यम से गया और मुझे कुछ और जानकारी मिली, जो मुझे लगता है कि चर्चा में बहुत योगदान देगा और किसी और की मदद करेगा जो इस प्रश्न को देखता है और देखता है कि कहां है मौजूदा उत्तर कम आते हैं।
स्वीकार किए जाते हैं जवाब करीब है, और का उपयोग कर ठीक किया जा सकता 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 निकाले। डिवाइस के पेड़ के बाद रूट हब (कंट्रोलर के बजाय पहला उपकरण लौटा), और पेरेंटड्रेफिक्स के आधार पर एक ट्री बनाया। क्रम रिटर्न, जो डिवाइस ट्री एन्यूमरेशन से सेटअपडी के माध्यम से मेल खाता है, प्रत्येक रूट हब है (जिसके लिए एंटेकेडेंट कंट्रोलर की पहचान करता है), इसके बाद डिवाइस के एक पुनरावृत्ति के साथ, जैसे, मेरे सिस्टम पर:
Win32_USBController
। इसने मुझे मेरे नियंत्रकों के PNPDeviceIDs की विस्तृत जानकारी दी, जो डिवाइस ट्री के शीर्ष पर हैं (जो कि पिछले क्वेरी के एंटेकेडेंट्स थे)। पिछले चरण में प्राप्त वृक्ष का उपयोग करते हुए, अपने बच्चों (रूट हब) और उनके बच्चों (अन्य हब) और उनके बच्चों (गैर-हब उपकरणों और समग्र उपकरणों) और उनके बच्चों, इत्यादि पर पुनरावृत्ति की गई।
Win32_PnPEntity
व्यक्तिगत रूप से इस कदम की जानकारी प्राप्त करने के लिए PNPDeviceId का उपयोग करके क्वेरी कर सकता है; संभवत: एक सीपीयू बनाम मेमोरी ट्रेडऑफ यह निर्धारित करता है कि कौन सा ऑर्डर बेहतर है।)सारांश में, Win32USBControllerDevice
आश्रित एक प्रणाली पर USB उपकरणों की एक पूरी सूची है (स्वयं नियंत्रकों के अलावा, जो कि उसी क्वेरी में Antecedents हैं), और PNPDeviceId
रजिस्ट्री से जानकारी के साथ इन जोड़ियों को क्रॉस-रेफरेंस करके और उल्लिखित अन्य प्रश्नों से एक विस्तृत चित्र का निर्माण किया जा सकता है।
जिन उपकरणों में मेरी दिलचस्पी थी, उन्हें देखने के लिए, मैंने इस पोस्ट के आधार पर एडेल हज़ाह के कोड में प्रतिस्थापित 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; }
}
}
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;
}
}
}
यदि आप चाहते हैं तो आपको अपवाद हैंडलिंग को जोड़ना होगा। यदि आप डिवाइस ट्री और इस तरह का पता लगाना चाहते हैं तो डैनियल के जवाब से परामर्श करें।
यह केवल हटाने योग्य यूएसबी ड्राइव की तलाश में लोगों के लिए एक बहुत सरल उदाहरण है।
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));
}
}
यदि आप 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 उपकरणों तक सीमित रहेंगे (आपके सिस्टम पर सभी प्रकारों के विपरीत)
आपको यह धागा उपयोगी लग सकता है। और यहाँ एक Google कोड परियोजना है जो इसे (यह पी / इनवॉइस में 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
?