You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过VID\PID获取USB打印机的设备名称?

通过VID/PID获取USB打印机子设备名称的解决方案

我之前也碰到过一模一样的情况——带VID/PID的WMI设备实例名称不对,有正确名称的实例又没VID/PID信息。核心是要利用WMI的设备关联关系,从父设备追溯到子设备,下面是具体的解决方法:

核心思路

目标打印机是带VID/PID设备的子设备,所以我们需要先定位到父设备,再通过WMI的关联查询找到它的子设备,最后筛选出正确的USBPRINT设备名称。

具体步骤

  1. 定位父设备:用VID/PID作为关键词,查询Win32_PnPEntity找到对应的父设备,获取它的PNPDeviceID(设备唯一标识)。
  2. 查询子设备:通过WMI的ASSOCIATORS OF关联语句,基于父设备的PNPDeviceID查找所有关联的子设备(依赖Win32_DeviceParent关联类)。
  3. 筛选目标设备:在子设备中找出PNPDeviceID包含USBPRINT的实例,它的Name属性就是你要的真实打印机名称。

C#代码实现

首先确保项目引用了System.Management(.NET Core/.NET 5+需要安装NuGet包System.Management,.NET Framework直接添加引用即可):

using System;
using System.Management;

public class UsbPrinterLocator
{
    public static string GetPrinterNameFromVidPid(string targetVid, string targetPid)
    {
        // 构造VID/PID的匹配模式,WMI里的PNPDeviceID通常是大写格式
        string pnpIdFilter = $"VID_{targetVid.ToUpper()}&PID_{targetPid.ToUpper()}";
        string foundPrinterName = null;

        try
        {
            // 第一步:找到带VID/PID的父设备
            var parentDeviceSearch = new ManagementObjectSearcher(
                "root\\CIMV2",
                $"SELECT PNPDeviceID FROM Win32_PnPEntity WHERE PNPDeviceID LIKE '%{pnpIdFilter}%'");

            foreach (var parentDevice in parentDeviceSearch.Get())
            {
                string parentPnpId = parentDevice["PNPDeviceID"].ToString();

                // 第二步:查询该父设备的所有子设备
                var childDeviceSearch = new ManagementObjectSearcher(
                    "root\\CIMV2",
                    $"ASSOCIATORS OF {{Win32_PnPEntity.PNPDeviceID='{parentPnpId}'}} WHERE AssocClass=Win32_DeviceParent");

                foreach (var childDevice in childDeviceSearch.Get())
                {
                    string childPnpId = childDevice["PNPDeviceID"].ToString();
                    // 第三步:筛选出USBPRINT类型的子设备
                    if (childPnpId.Contains("USBPRINT"))
                    {
                        foundPrinterName = childDevice["Name"].ToString();
                        break;
                    }
                }

                if (!string.IsNullOrEmpty(foundPrinterName))
                    break;
            }
        }
        catch (ManagementException ex)
        {
            Console.WriteLine($"WMI查询出错: {ex.Message}");
        }

        return foundPrinterName;
    }

    // 测试调用示例
    static void Main(string[] args)
    {
        // 替换成你的打印机实际VID和PID
        string vid = "0DDA";
        string pid = "0020";

        string printerName = GetPrinterNameFromVidPid(vid, pid);
        if (printerName != null)
            Console.WriteLine($"找到目标打印机: {printerName}");
        else
            Console.WriteLine("未找到匹配的打印机");
    }
}

关键细节说明

  • 权限要求:运行程序需要管理员权限,否则可能无法正常读取WMI设备信息。
  • 匹配逻辑:父设备的PNPDeviceID会包含VID_xxxx&PID_xxxx的片段,用LIKE模糊匹配就能精准定位。
  • 关联查询:ASSOCIATORS OF是WMI专门用来查询关联对象的语法,指定Win32_DeviceParent关联类可以确保只获取父设备的子设备。
  • 子设备筛选:USB打印机的子设备PNPDeviceID必然包含USBPRINT标识,用这个作为筛选条件可以直接定位到目标设备。

内容的提问来源于stack exchange,提问作者Heavyrro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:04:02