Làm cách nào để có được danh sách tất cả các thiết bị USB được kết nối trên máy tính windows?
Câu trả lời:
Thêm một tham chiếu đến System.Management cho dự án của bạn, sau đó thử một cái gì đó như sau:
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; }
}
}
Tôi biết tôi đang trả lời một câu hỏi cũ, nhưng tôi vừa mới xem qua bài tập tương tự này và tìm ra thêm một chút thông tin, mà tôi nghĩ sẽ đóng góp rất nhiều cho cuộc thảo luận và giúp đỡ bất kỳ ai khác tìm thấy câu hỏi này và xem ở đâu các câu trả lời hiện có còn thiếu.
Các câu trả lời được chấp nhận gần, và có thể được sửa chữa bằng comment Nedko của nó. Hiểu biết chi tiết hơn về các Lớp WMI liên quan sẽ giúp hoàn thiện bức tranh.
Win32_USBHub
chỉ trả về các Hub USB . Điều đó có vẻ hiển nhiên trong nhận thức muộn màng nhưng cuộc thảo luận ở trên bỏ sót nó. Nó không bao gồm tất cả các thiết bị USB có thể có, chỉ những thiết bị có thể (về lý thuyết, ít nhất) hoạt động như một trung tâm cho các thiết bị bổ sung. Nó bỏ sót một số thiết bị không phải là trung tâm (đặc biệt là các bộ phận của thiết bị hỗn hợp).
Win32_PnPEntity
bao gồm tất cả các thiết bị USB và hàng trăm thiết bị không phải USB khác. Lời khuyên của Russel Gantman sử dụng tìm kiếm mệnh đề WHERE Win32_PnPEntity
cho DeviceID bắt đầu bằng "USB%" để lọc danh sách là hữu ích nhưng hơi không đầy đủ; nó bỏ sót các thiết bị bluetooth, một số máy in / máy chủ in, chuột và bàn phím tương thích với HID. Tôi đã thấy "USB \%", "USBSTOR \%", "USBPRINT \%", "BTH \%", "SWD \%" và "HID \%". Win32_PnPEntity
tuy nhiên, là một tham chiếu "chính" tốt để tra cứu thông tin khi bạn sở hữu PNPDeviceID từ các nguồn khác.
Những gì tôi tìm thấy là cách tốt nhất để liệt kê các thiết bị USB là truy vấn Win32_USBControllerDevice
. Mặc dù nó không cung cấp thông tin chi tiết cho các thiết bị, nó hoàn toàn liệt kê các thiết bị USB của bạn và cung cấp cho bạn một cặp Antecedent / Dependent PNPDeviceID
cho mọi Thiết bị USB (bao gồm Hub, thiết bị không phải Hub và thiết bị tương thích với HID) trên hệ thống. Mỗi Người phụ thuộc được trả về từ truy vấn sẽ là một Thiết bị USB. Antecedent sẽ là Bộ điều khiển mà nó được chỉ định, một trong những Bộ điều khiển USB được trả về bằng cách truy vấnWin32_USBController
.
Như một phần thưởng, có vẻ như bên dưới, WMI đi qua Cây thiết bị khi phản hồi Win32_USBControllerDevice
truy vấn, vì vậy thứ tự mà các kết quả này được trả về có thể giúp xác định các mối quan hệ cha / con. (Điều này không được ghi lại và do đó chỉ là phỏng đoán; sử dụng CM_Get_Parent (hoặc Child + Sibling ) của API SetupDi để có kết quả chính xác.) Là một tùy chọn đối với API SetupDi, có vẻ như đối với tất cả các thiết bị được liệt kê trong Win32_USBHub
chúng có thể được tra cứu trong sổ đăng ký (at HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ + PNPDeviceID
) và sẽ có một tham số ParentIdPrefix
sẽ là tiền tố của trường cuối cùng trong PNPDeviceID của trường con của nó, vì vậy, điều này cũng có thể được sử dụng trong một đối sánh ký tự đại diện để lọcWin32_PnPEntity
truy vấn.
Trong ứng dụng của tôi, tôi đã làm như sau:
Win32_PnPEntity
và lưu trữ kết quả trong bản đồ khóa-giá trị (với PNPDeviceID làm khóa) để truy xuất sau này. Đây là tùy chọn nếu bạn muốn thực hiện các truy vấn riêng lẻ sau này.Win32_USBControllerDevice
danh sách chính xác các thiết bị USB trên hệ thống của tôi (tất cả các Thiết bị phụ thuộc) và trích xuất PNPDeviceID của những thiết bị này. Tôi đã đi xa hơn, dựa trên thứ tự theo sau cây thiết bị, để gán các thiết bị cho trung tâm gốc (thiết bị đầu tiên được trả về, chứ không phải bộ điều khiển) và xây dựng một cây dựa trên parentIdPrefix. Thứ tự mà truy vấn trả về, khớp với kiểu liệt kê cây thiết bị qua SetupDi, là mỗi trung tâm gốc (mà Antecedent xác định bộ điều khiển), theo sau là một lần lặp lại các thiết bị dưới nó, ví dụ: trên hệ thống của tôi:
Win32_USBController
. Điều này đã cung cấp cho tôi thông tin chi tiết về PNPDeviceIDs của bộ điều khiển của tôi nằm ở đầu cây thiết bị (là Antecedents của truy vấn trước đó). Sử dụng cây có nguồn gốc ở bước trước, lặp lại đệ quy trên các cây con của nó (các trung tâm gốc) và các con của chúng (các trung tâm khác) và các con của chúng (thiết bị không phải trung tâm và thiết bị hỗn hợp) và con của chúng, v.v.
Win32_PnPEntity
riêng lẻ bằng PNPDeviceId để lấy thông tin ở bước này; có thể là sự cân bằng giữa cpu so với bộ nhớ để xác định thứ tự nào tốt hơn.)Tóm lại, Win32USBControllerDevice
Người phụ thuộc là một danh sách đầy đủ các Thiết bị USB trên một hệ thống (không phải chính Bộ điều khiển, là Bộ điều khiển trong cùng một truy vấn) và bằng cách tham chiếu chéo các PNPDeviceId
cặp này với thông tin từ sổ đăng ký và từ các truy vấn khác được đề cập, một hình ảnh chi tiết có thể được xây dựng.
Để xem các thiết bị tôi quan tâm, tôi đã thay thế Win32_USBHub
bằng Win32_PnPEntity
mã của Adel Hazzah, dựa trên bài đăng này . Điều này phù hợp với tôi:
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; }
}
}
Câu trả lời của Adel Hazzah đưa ra mã hoạt động, nhận xét của Daniel Widdis và Nedko đề cập rằng bạn cần truy vấn Win32_USBControllerDevice và sử dụng thuộc tính Dependent của nó, và câu trả lời của Daniel cung cấp rất nhiều chi tiết mà không cần mã.
Dưới đây là tổng hợp cuộc thảo luận ở trên để cung cấp mã làm việc liệt kê các thuộc tính thiết bị PNP có thể truy cập trực tiếp của tất cả các thiết bị USB được kết nối:
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;
}
}
}
Bạn sẽ cần thêm xử lý ngoại lệ nếu muốn. Tham khảo câu trả lời của Daniel nếu bạn muốn tìm ra cây thiết bị và những thứ tương tự.
Đây là một ví dụ đơn giản hơn nhiều cho những người chỉ tìm kiếm ổ USB di động.
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));
}
}
Nếu bạn thay đổi ManagementObjectSearcher thành như sau:
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2",
@"SELECT * FROM Win32_PnPEntity where DeviceID Like ""USB%""");
Vì vậy, "GetUSBDevices () trông giống như thế này"
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;
}
}
Kết quả của bạn sẽ bị giới hạn ở các thiết bị USB (trái ngược với tất cả các loại trên hệ thống của bạn)
Bạn có thể thấy chủ đề này hữu ích. Và đây là một dự án mã của google minh chứng cho điều này (nó P / Gọi vào 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
làm gì