C# windows(C)的管理对象查询以查找usb设备

C# windows(C)的管理对象查询以查找usb设备,c#,windows,usb-drive,C#,Windows,Usb Drive,我正在尝试查找连接到我的计算机的特定USB设备1或更多,并检索到已安装驱动器的相关路径。理想情况下,这将是通过查找USB设备的VID/PID,但我还不知道如何做到这一点。下面的方法可行,但必须有某种方法在单个查询中获取数据 我在这里做的是寻找一个物理驱动器,它有一个匹配HS SD卡桥接USB设备的型号,并找到相关的物理驱动器,然后使用它来找到已安装的分区 foreach (ManagementObject disk in disks.Get()) { //

我正在尝试查找连接到我的计算机的特定USB设备1或更多,并检索到已安装驱动器的相关路径。理想情况下,这将是通过查找USB设备的VID/PID,但我还不知道如何做到这一点。下面的方法可行,但必须有某种方法在单个查询中获取数据

我在这里做的是寻找一个物理驱动器,它有一个匹配HS SD卡桥接USB设备的型号,并找到相关的物理驱动器,然后使用它来找到已安装的分区

        foreach (ManagementObject disk in disks.Get()) {
            //look for drives that match our string
            Match m = Regex.Match(disk["model"].ToString(), "HS SD Card Bridge USB Device");
            if (m.Success) {
                m = Regex.Match(disk["DeviceID"].ToString(), @"PHYSICALDRIVE(\d+)");
                if (m.Success) {
                    int driveNumber = Int32.Parse(m.Groups[1].ToString());
                    ManagementObjectSearcher mapping = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDiskToPartition");
                    foreach (ManagementObject map in mapping.Get()) {
                        m = Regex.Match(map["Antecedent"].ToString(), @"Disk #" + driveNumber + ",");
                        if (m.Success) {
                            string drive = map["Dependent"].ToString();
                            m = Regex.Match(drive, @"([A-Z]):");
                            if (m.Success) {
                                drive = m.Groups[1].ToString(); //< -- **FOUND**
                            }
                        }

                    }
                    //USBDevice dev = new USBDevice("", "");
                    //  list.Items.Add();
                    Console.WriteLine("");
                }
            }
}

有没有一种方法可以从VID/PID实现这一点,有没有一种方法可以构造搜索查询以便只需要一个查询?

这就是我前面使用的方法。这不是答案。但这会帮助你

public int GetAvailableDisks()
        {
            int  deviceFound = 0;
            try
            {
                // browse all USB WMI physical disks
                foreach (ManagementObject drive in
                    new ManagementObjectSearcher(
                        "select DeviceID, Model from Win32_DiskDrive where InterfaceType='USB'").Get())
                {
                    ManagementObject partition = new ManagementObjectSearcher(String.Format(
                        "associators of {{Win32_DiskDrive.DeviceID='{0}'}} where AssocClass = Win32_DiskDriveToDiskPartition",
                        drive["DeviceID"])).First();
                    if (partition == null) continue;
                    // associate partitions with logical disks (drive letter volumes)
                    ManagementObject logical = new ManagementObjectSearcher(String.Format(
                        "associators of {{Win32_DiskPartition.DeviceID='{0}'}} where AssocClass = Win32_LogicalDiskToPartition",
                        partition["DeviceID"])).First();
                    if (logical != null)
                    {
                        // finally find the logical disk entry to determine the volume name - Not necesssary 
                        //ManagementObject volume = new ManagementObjectSearcher(String.Format(
                        //    "select FreeSpace, Size, VolumeName from Win32_LogicalDisk where Name='{0}'",
                        //    logical["Name"])).First();

                        string temp = logical["Name"].ToString() + "\\";
                        // +" " + volume["VolumeName"].ToString(); Future purpose if Device Name required

                        deviceFound++;
                        if (deviceFound > 1)
                        {
                            MessageBox.Show(@"Multiple Removeable media found. Please remove the another device");
                            deviceFound--;

                        }
                        else
                        {
                            driveName = temp;
                        }

                    }
                }
            }
            catch (Exception diskEnumerateException)
            {

            }
            return deviceFound;
        }