Windows bilgisayarına bağlı tüm USB cihazlarının listesini nasıl alabilirim?
Yanıtlar:
Projeniz için System.Management'a bir referans ekleyin, ardından şuna benzer bir şey deneyin:
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
yalnızca USB Hub'ları içerir, tüm cihazları değil, bu nedenle bazı cihazları kaçırıyorsunuz. @nedko, Win32_USBControllerDevice
tüm cihazları almak için Bağımlı özelliğini almanız gerektiği konusunda doğru .
Eski bir soruyu yanıtladığımı biliyorum, ancak aynı alıştırmadan geçtim ve biraz daha fazla bilgi edindim, tartışmaya çok katkıda bulunacağını ve bu soruyu bulan ve nerede olduğunu gören herkese yardımcı olacağını düşündüğüm mevcut cevaplar yetersiz kalır.
Kabul edilen cevap yakındır ve Nedko'nun yorumu kullanılarak düzeltilebilir . İlgili WMI Sınıflarının daha ayrıntılı bir şekilde anlaşılması, resmin tamamlanmasına yardımcı olur.
Win32_USBHub
yalnızca USB Hub'larını döndürür . Geriye dönüp bakıldığında bu açık görünüyor ancak yukarıdaki tartışma bunu kaçırıyor. Olası tüm USB aygıtlarını içermez, yalnızca (en azından teorik olarak) ek aygıtlar için bir hub işlevi görebilenler. Hub olmayan bazı cihazları (özellikle bileşik cihazların parçaları) gözden kaçırır.
Win32_PnPEntity
tüm USB aygıtlarını ve yüzlerce USB olmayan aygıtı içerir. Russel Gantman'ınWin32_PnPEntity
, listeyi filtrelemek için "USB%" ile başlayan bir DeviceID için bir WHERE deyimi aramasını kullanma tavsiyesi yararlıdır, ancak biraz eksiktir; bluetooth aygıtlarını, bazı yazıcıları / yazıcı sunucularını ve HID uyumlu fareleri ve klavyeleri özlüyor. "USB \%", "USBSTOR \%", "USBPRINT \%", "BTH \%", "SWD \%" ve "HID \%" gördüm. Win32_PnPEntity
ancak, diğer kaynaklardan PNPDeviceID'ye sahip olduğunuzda bilgi aramak için iyi bir "ana" referanstır.
Bulduğum şey, USB cihazlarını numaralandırmanın en iyi yolu sorgulamaktı Win32_USBControllerDevice
. Cihazlar için ayrıntılı bilgi vermezken, USB cihazlarınızı tam olarak numaralandırır ve cihazınızdaki PNPDeviceID
her USB Cihazı (Hub'lar, Hub olmayan cihazlar ve HID uyumlu cihazlar dahil) için size bir Antecedent / Dependent çifti verir . sistemi. Sorgudan döndürülen her Bağımlı, bir USB Aygıtı olacaktır. Öncü, sorgulama ile döndürülen USB Denetleyicilerinden biri olan atandığı Denetleyici olacaktır Win32_USBController
.
Bir bonus olarak, WMI'nin sorguya yanıt verirken Aygıt Ağacını gezdiği ve Win32_USBControllerDevice
bu sonuçların döndürülme sırasının üst / alt ilişkilerinin belirlenmesine yardımcı olabileceği görülüyor . (Bu belgelenmiş ve böylece sadece bir tahmin olduğunu değildir; SetupDi API kullanmak CM_Get_Parent (veya Çocuk + Kardeş . Kesin sonuç için)) SetupDi API için bir seçenek olarak, tüm cihazlar listelenmiş için altında görünür Win32_USBHub
onlar aranabilir kayıt defterinde (at HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ + PNPDeviceID
) ve ParentIdPrefix
alt öğelerinin PNPDeviceID'sindeki son alanın öneki olacak bir parametreye sahip olacaktır, bu nedenle bu, Win32_PnPEntity
sorguyu filtrelemek için joker karakter eşleşmesinde de kullanılabilir .
Başvurumda şunları yaptım:
Win32_PnPEntity
Sonuçları, daha sonra alınmak üzere bir anahtar-değer eşlemesinde (anahtar olarak PNPDeviceID ile) sorguladı ve depoladı. Daha sonra tek tek sorgular yapmak istiyorsanız bu isteğe bağlıdır.Win32_USBControllerDevice
Sistemimdeki (tüm Bağımlılar) USB cihazlarının kesin bir listesi için sorgulandım ve bunların PNPDeviceID'lerini çıkardım. Aygıt ağacını izleyen sıraya göre, aygıtları kök hub'a atamak için daha da ileri gittim (denetleyici yerine döndürülen ilk aygıt) ve parentIdPrefix'e dayalı bir ağaç oluşturdum. SetupDi aracılığıyla cihaz ağacı numaralandırmasıyla eşleşen sorgunun döndürdüğü sıra, her bir kök merkezdir (bunun için Öncü, denetleyiciyi tanımlar), ardından bunun altındaki aygıtların bir yinelemesi, örneğin sistemimde:
Win32_USBController
. Bu bana, aygıt ağacının en üstünde bulunan denetleyicilerimin PNPDeviceID'leri hakkında ayrıntılı bilgi verdi (bunlar önceki sorgunun Öncelleriydi). Önceki adımda türetilen ağacı kullanarak, alt öğeleri (kök hub'lar) ve alt öğeleri (diğer hub'lar) ve alt öğeleri (hub olmayan aygıtlar ve bileşik aygıtlar) ve bunların alt öğeleri vb. Üzerinde yinelemeli olarak yinelendi.
Win32_PnPEntity
bu adımda bilgileri almak için ilk adımı atlayabilir ve PNPDeviceId'yi kullanarak tek tek sorgulayabilir ; muhtemelen hangi sıranın daha iyi olduğunu belirleyen bir cpu-bellek değiş tokuşu.)Özetle, Win32USBControllerDevice
Bağımlılar, bir sistemdeki USB Cihazlarının tam bir listesidir (aynı sorguda Önde gelenler olan Denetleyicilerin kendileri hariç) ve bu PNPDeviceId
çiftleri kayıt defterinden ve belirtilen diğer sorgulardan gelen bilgilerle çapraz referans vererek, detaylı bir resim oluşturulabilir.
Ben ilgi cihazları görmek için, ben yerine vardı Win32_USBHub
tarafından Win32_PnPEntity
dayanarak, Adel Hazzah kodunda bu yazı . Bu benim için çalışıyor:
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 en cevabı , çalışan kod verir, Daniel Widdis en ve Nedko en yorumlarınız Win32_USBControllerDevice sorgulamak ve onun Bağımlı özelliğini kullanmak gerekir ve Daniel'in söz cevabı kodu olmadan ayrıntılı bir sürü verir.
Bağlı tüm USB cihazlarının doğrudan erişilebilen PNP cihaz özelliklerini listeleyen çalışma kodunu sağlamak için yukarıdaki tartışmanın bir sentezi:
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;
}
}
}
İsterseniz istisna işleme eklemeniz gerekir. Aygıt ağacını ve benzerlerini anlamak istiyorsanız Daniel'in cevabına başvurun.
Bu, yalnızca çıkarılabilir USB sürücüleri arayan kişiler için çok daha basit bir örnektir.
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'ı şu şekilde değiştirirseniz:
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2",
@"SELECT * FROM Win32_PnPEntity where DeviceID Like ""USB%""");
Yani "GetUSBDevices () şuna benzer"
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;
}
}
Sonuçlarınız USB cihazlarla sınırlı olacaktır (sisteminizdeki tüm türlerin aksine)
Bu konuyu faydalı bulabilirsiniz . Ve işte bunu örnekleyen bir google kod projesi (P / Invokes into 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
?