উইন্ডোজ কম্পিউটারে সংযুক্ত সমস্ত ইউএসবি ডিভাইসের একটি তালিকা আমি কীভাবে পেতে পারি?
উত্তর:
আপনার প্রকল্পের ব্যবস্থাপনার জন্য একটি রেফারেন্স যুক্ত করুন then
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; }
}
}
Win32_USBHub
কেবল ইউএসবি হাবগুলি অন্তর্ভুক্ত রয়েছে, সমস্ত ডিভাইস নয়, তাই আপনি কিছু ডিভাইস মিস করছেন। @nedko ঠিক আছে যে আপনাকে Win32_USBControllerDevice
সমস্ত ডিভাইস পাওয়ার জন্য নির্ভরশীল সম্পত্তি পেতে হবে।
আমি জানি আমি একটি পুরানো প্রশ্নের জবাব দিচ্ছি, তবে আমি কেবল এই একই অনুশীলনের মধ্য দিয়ে গিয়েছিলাম এবং আরও কিছু তথ্য সন্ধান করেছি, যা আমার মনে হয় যে আলোচনায় অনেক অবদান রাখবে এবং এই প্রশ্নটি খুঁজে পেয়ে অন্য যে কেউ এই প্রশ্নটি খুঁজে বের করবে এবং কোথায় দেখবে বিদ্যমান উত্তরগুলি কম পড়ে fall
গৃহীত উত্তর পাসে, এবং ব্যবহার সংশোধন করা যায় Nedko এর মন্তব্য এটি। জড়িত ডাব্লুএমআই ক্লাসগুলির আরও বিশদ বোঝার ফলে ছবিটি সম্পূর্ণ করতে সহায়তা করে।
Win32_USBHub
কেবল ইউএসবি হাব ফেরত দেয় । এটি অন্ধকারে সুস্পষ্ট বলে মনে হয় তবে উপরের আলোচনাটি এটি মিস করে। এটিতে সমস্ত সম্ভাব্য ইউএসবি ডিভাইস অন্তর্ভুক্ত নয়, কেবলমাত্র সেগুলি (তাত্ত্বিকভাবে, কমপক্ষে) অতিরিক্ত ডিভাইসের হাব হিসাবে কাজ করতে পারে। এটি এমন কিছু ডিভাইস মিস করে যা হাব নয় (বিশেষত যৌগিক ডিভাইসের অংশ)।
Win32_PnPEntity
এতে সমস্ত ইউএসবি ডিভাইস এবং আরও কয়েক'শ নন- ইউএসবি ডিভাইস অন্তর্ভুক্ত রয়েছে। তালিকাটি ফিল্টার করতে "ইউএসবি%" দিয়ে কোনও ডিভাইসআইডি অনুসন্ধানের জন্য যেখানে একটি ডিভাইসআইডি অনুসন্ধানের জন্য রসেল গ্যান্টম্যানের পরামর্শটি Win32_PnPEntity
সহায়ক তবে কিছুটা অসম্পূর্ণ; এটি ব্লুটুথ ডিভাইস, কিছু মুদ্রক / মুদ্রণ সার্ভার এবং এইচআইডি-সম্মতিযুক্ত ইঁদুর এবং কিবোর্ডকে মিস করে। আমি "ইউএসবি \%", "ইউএসবিএসটিআর%" "," ইউএসবিপিআরিন্ট \% "," বিটিএইচ \% "," এসডাব্লুডি \% ", এবং" লুকানো \% "দেখেছি। Win32_PnPEntity
তবে, আপনি অন্য উত্স থেকে পিএনপি ডিভাইসআইডি-র অধিকারে থাকলে তথ্য সন্ধান করার জন্য একটি ভাল "মাস্টার" রেফারেন্স।
আমি যা খুঁজে পেয়েছি তা হল ইউএসবি ডিভাইসগুলি গণনার সর্বোত্তম উপায় ছিল কোয়েরি Win32_USBControllerDevice
। যদিও এটি ডিভাইসগুলির জন্য বিশদ তথ্য দেয় না, এটি আপনার ইউএসবি ডিভাইসগুলিকে সম্পূর্ণরূপে গণনা করে এবং আপনার PNPDeviceID
প্রতিটি ইউএসবি ডিভাইসের (হাবস, নন-হাব ডিভাইস এবং এইচআইডি-কমপ্লায়েন্ট ডিভাইস সহ) আপনাকে একটি পূর্বসূরি / নির্ভরশীল জুড়ি দেয় your পদ্ধতি. ক্যোয়ারী থেকে ফিরে আসা প্রতিটি নির্ভরশীল একটি ইউএসবি ডিভাইস হবে। পূর্ববর্তীটি যে কন্ট্রোলারকে অর্পণ করা হবে সেটিকে ইউএসবি কন্ট্রোলারের মধ্যে কেউ জিজ্ঞাসাবাদ করে ফিরে আসবে Win32_USBController
।
বোনাস হিসাবে, এটি প্রদর্শিত হয় যে ডাবের অধীনে ডাব্লুএমআই কোয়েরিটির প্রতিক্রিয়া জানাতে ডিভাইস ট্রিটি নিয়ে চলেছে Win32_USBControllerDevice
, সুতরাং এই ফলাফলগুলি যে ক্রমতে ফিরে আসে তা পিতামাতার / সন্তানের সম্পর্কগুলি সনাক্ত করতে সহায়তা করতে পারে। (এই নথিভুক্ত করা না এবং এর ফলে শুধুমাত্র একটি অনুমান করা হয়; SetupDi এপিআই এর ব্যবহার CM_Get_Parent (অথবা শিশু + + সমরূপ । নির্ধারক ফলাফলের জন্য)) SetupDi এপিআই করার জন্য একটি বিকল্প হিসেবে, এটা মনে হয় যে তালিকাভুক্ত সকল ডিভাইসের জন্য অধীনে Win32_USBHub
তারা তাকিয়ে যাবে রেজিস্ট্রিতে (এ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ + PNPDeviceID
) এবং এতে একটি প্যারামিটার থাকবে ParentIdPrefix
যা তার বাচ্চাদের পিএনপি ডেভিসআইআইডি-তে সর্বশেষ ক্ষেত্রের উপসর্গ হবে, সুতরাং Win32_PnPEntity
কোয়েরি ফিল্টার করার জন্য এটি একটি ওয়াইল্ডকার্ড ম্যাচেও ব্যবহার করা যেতে পারে ।
আমার আবেদনে, আমি নিম্নলিখিতগুলি করেছি:
Win32_PnPEntity
চ্ছিক) পরবর্তী পুনরুদ্ধারের জন্য ফলাফলগুলি কী-মানচিত্রে (পিএনপি ডেভিসিসিড সহ) কী-মানচিত্রে সংরক্ষণ করা হয়েছে। আপনি যদি পরে ব্যক্তিগত জিজ্ঞাসা করতে চান তবে এটি alচ্ছিক।Win32_USBControllerDevice
আমার সিস্টেমে (সমস্ত নির্ভরশীল) ইউএসবি ডিভাইসের একটি সুনির্দিষ্ট তালিকার জন্য জিজ্ঞাসা করা হয়েছে এবং এরগুলির পিএনপি ডেভিসিসআইডিগুলি বের করা হয়েছে। ডিভাইস ট্রি অনুসরণ করার আদেশের ভিত্তিতে আমি আরও এগিয়ে গিয়েছিলাম, ডিভাইসগুলি রুট হাবের জন্য নির্ধারিত করতে (প্রথম ডিভাইসটি নিয়ন্ত্রকের পরিবর্তে ফিরে আসে) এবং প্যারেন্টআইডপ্রিফিক্সের ভিত্তিতে একটি গাছ তৈরি করেছি built ক্রমটি যে ক্রমটি ফিরে আসে, সেটি সেটআপডির মাধ্যমে ডিভাইস ট্রি গণনার সাথে মিলে যায়, এটি প্রতিটি রুট হাব (যার জন্য পূর্ববর্তী নিয়ন্ত্রক চিহ্নিত করে), তারপরে এটির অধীনে ডিভাইসগুলির পুনরাবৃত্তি ঘটে, যেমন: আমার সিস্টেমে:
Win32_USBController
। এটি আমাকে আমার নিয়ন্ত্রকদের পিএনপি ডিভাইসআইডিগুলির বিশদ তথ্য দেয় যা ডিভাইস গাছের শীর্ষে রয়েছে (যা পূর্ববর্তী ক্যোয়ারীর পূর্ববর্তী ছিল)। পূর্ববর্তী পদক্ষেপে উত্পন্ন গাছটি ব্যবহার করে, তার বাচ্চাদের (মূল কেন্দ্রগুলি) এবং তাদের শিশুদের (অন্যান্য হাবগুলি) এবং তাদের শিশুদের (নন-হাব ডিভাইস এবং সংমিশ্রিত ডিভাইস) এবং তাদের শিশু ইত্যাদির উপর পুনরাবৃত্তভাবে পুনরাবৃত্তি করা
Win32_PnPEntity
Ptionচ্ছিকভাবে , কেউ প্রথম পদক্ষেপটি এড়িয়ে যেতে পারে এবং এই পদক্ষেপে তথ্য পেতে পিএনপি ডিভাইসআইডি ব্যবহার করে স্বতন্ত্রভাবে জিজ্ঞাসা করতে পারে ; সম্ভবত কোন সিপিইউ বনাম মেমরি ট্রেডঅফ কোন আদেশটি আরও ভাল তা নির্ধারণ করে))সংক্ষেপে, Win32USBControllerDevice
নির্ভরশীলরা হ'ল একটি সিস্টেমে ইউএসবি ডিভাইসগুলির একটি সম্পূর্ণ তালিকা (নিজেরাই নিয়ন্ত্রণকারীরা, যা একই ক্যোয়ারির পূর্বসূরী), এবং PNPDeviceId
রেজিস্ট্রি এবং উল্লিখিত অন্যান্য প্রশ্নগুলির তথ্য সহ এই জোড়গুলিকে ক্রস-রেফারেন্স করে , একটি বিস্তারিত ছবি নির্মিত যেতে পারে।
ডিভাইসের আমি আগ্রহী ছিলেন দেখার জন্য, আমি প্রতিস্থাপন ছিল Win32_USBHub
দ্বারা Win32_PnPEntity
আদেল Hazzah এর কোড মধ্যে উপর ভিত্তি করে এই পোস্টে । এটি আমার পক্ষে কাজ করে:
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; }
}
}
আদেল Hazzah এর উত্তর কাজ কোড দেয়, ড্যানিয়েল Widdis এর এবং Nedko এর সব মন্তব্য করছেন যা Win32_USBControllerDevice অনুসন্ধান এবং তার নির্ভরশীল সম্পত্তি ব্যবহার করতে হবে, এবং ড্যানিয়েল এর উল্লেখ উত্তর কোড ছাড়া বিস্তারিত অনেক দেয়।
ওয়ার্কিং কোড সরবরাহ করার জন্য উপরোক্ত আলোচনার সংশ্লেষণ এখানে দেওয়া যা সমস্ত সংযুক্ত ইউএসবি ডিভাইসের সরাসরি অ্যাক্সেসযোগ্য পিএনপি ডিভাইস বৈশিষ্ট্যগুলি তালিকাভুক্ত করে:
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 searcher =
new ManagementObjectSearcher("root\\CIMV2",
@"SELECT * FROM Win32_PnPEntity where DeviceID Like ""USB%""");
সুতরাং "গেট ইউএস ডিভাইসগুলি (দেখতে) এর মতো দেখাচ্ছে"
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;
}
}
আপনার ফলাফলগুলি ইউএসবি ডিভাইসে সীমাবদ্ধ থাকবে (আপনার সিস্টেমে সমস্ত ধরণের বিপরীতে)
আপনি এই থ্রেড দরকারী মনে হতে পারে । এবং এখানে একটি গুগল কোড প্রকল্প এটির উদাহরণ দিয়ে দেখায় (এটি পি / ইনভোকেসেস 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
?