我需要从C#应用程序中跟踪USB插入和拔出事件,因此我根据SO上的其他问题提出了以下想法。
我无法使用这种方法。
var drives = DriveInfo.GetDrives()
.Where(drive => drive.IsReady && drive.DriveType == DriveType.Removable).ToList();
由于连接和断开的设备可能具有相同的驱动器字母和名称(新的设备可能与之前缓存的设备相同),因此在区分连接和断开的设备时可能会引起许多麻烦。
因此,我决定使用 WMI 来解决这个问题,但我发现通过 Win32_USBHub
类无法获取指定 USB 设备的驱动器字母。然后我想执行另一个类似于以下查询的查询:
foreach (ManagementObject device in new ManagementObjectSearcher(@"SELECT * FROM Win32_USBHub").Get())
{
string deviceID = (string)device.GetPropertyValue("DeviceID");
Console.WriteLine("{0}", deviceID);
string query = string.Format("SELECT * FROM Win32_LogicalDisk WHERE DeviceID='{0}'", deviceID);
foreach (ManagementObject o in new ManagementObjectSearcher(query).Get())
{
string name = (string)o.GetPropertyValue("Name");
Console.WriteLine("{0}", name);
}
Console.WriteLine("==================================");
}
但它根本不起作用——每次我尝试执行与Win32_LogicalDisk
表一起使用的查询时,都会出现异常"无效查询"。
为什么?我做错了什么?该怎么解决?也许有更好的方法来解决这个问题?
提前感谢您。
string query = string.Format("ASSOCIATORS OF {{Win32_USBHub.DeviceID = '{0}'}} WHERE AssocClass = Win32_LogicalDisk", deviceID); foreach (var o in new ManagementObjectSearcher(query).Get()) { string name = (string)o.GetPropertyValue("Name"); Console.WriteLine("{0}", name); }
给我抛出了一个“无效的对象路径”异常。 - FrozenHeart