查询“设备和打印机”菜单中显示的设备名称

时间:2017-08-27 18:42:27

标签: c# windows-10

如何在没有admin privaledges的设置中查询“设备和打印机”菜单中显示的设备名称?

它不是我首先想到的设备的友好名称,所以WMI / ManagementObjectSearcher没有帮助,因为它根本不包含这些信息。(或者我无法找到)

只有我发现此信息在“计算机\ HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Control \ DeviceMigration \ Devices \ USB \ VID_0403& PID_6001 \ XXXX ** BusDeviceDesc **”下的注册表中,我可以然后看看哪些Comports是活动的,如果它在那里找到相同的端口,我假设它是我正在寻找的那个,但是这里的问题是它确实需要管理员特权来挖掘注册表这是我想要避免的

有没有一种方法来识别我正在寻找的USB设备而没有管理员权限,没有我从FTDI购买自定义视频/ pid,这显然会让它变得简单,但是对于业余爱好项目来说花费了不少钱。

**我无法添加图片以使其更清晰

RegistryKey key = Registry.LocalMachine;
        key = key.OpenSubKey(@"SYSTEM\ControlSet001\Control\DeviceMigration\Devices\USB\VID_0403&PID_6001", true);

ManagementObjectSearcher(@"SELECT * FROM Win32_PnPEntity where DeviceID Like ""USB%"""))

这就是我目前查找信息的方式,然后交叉检查结果以确定我想要连接的设备,但这需要管理员权限。

1 个答案:

答案 0 :(得分:0)

所以在经过一些研究之后,我确实找到了一种方法来做我想要的,我在这里发布代码,因为它可能在将来帮助某人。(可悲的是,这种实现只有在使用FTDI IC时才有用)

class Program {
    static void Main(string[] args) {

        string DeviceActualName = "Fan Control";


        FTDI usbDev = new FTDI();
        UInt32 devCount = 0;
        usbDev.GetNumberOfDevices(ref devCount);
        FTDI.FT_DEVICE_INFO_NODE[] infoNode = new FTDI.FT_DEVICE_INFO_NODE[devCount];

        string SerialNumber = null;
        usbDev.GetDeviceList(infoNode);
        foreach(FTDI.FT_DEVICE_INFO_NODE node in infoNode) {
            if(node != null && node.Description.Equals(DeviceActualName)) {
                Console.WriteLine("Found: {0} // {1}", node.Description, node.SerialNumber);
                SerialNumber = node.SerialNumber;
            }
        }

        var usbDevices = GetUSBDevices();
        foreach(var usbDevice in usbDevices) {
            if(usbDevice.Name != null)
                if(usbDevice.Name.Contains("COM") && usbDevice.PnpDeviceID.Contains(SerialNumber)) {
                    Console.WriteLine("Match Found:  {0} // {1}", usbDevice.Name, usbDevice.PnpDeviceID);
                    Console.WriteLine("ComPort: {0}", usbDevice.Name[(usbDevice.Name.IndexOf("COM") + 3)]);
                }
        }

        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("Name"),
            (string) device.GetPropertyValue("PNPDeviceID")
            ));
        }

        collection.Dispose();
        return devices;
    }
    class USBDeviceInfo {
        public USBDeviceInfo(string Name, string pnpDeviceID) {
            this.Name = Name;
            this.PnpDeviceID = pnpDeviceID;
        }
        public string Name { get; private set; }
        public string PnpDeviceID { get; private set; }
    }
}