如何使用 WMI 检索物理打印机列表?

Posted

技术标签:

【中文标题】如何使用 WMI 检索物理打印机列表?【英文标题】:How to retrieve a list of physical printers using WMI? 【发布时间】:2011-07-27 08:55:26 【问题描述】:

我正在尝试使用 WMI 获取连接到 Windows XP 机器的硬件打印机列表。我想要的是 与从 Win32_Printers 获取列表相同,因为我只想获取物理上以盒子形式存在的打印机,摆脱所有“打印机噪音”,如“发送到OneNote 驱动程序”、“Microsoft 共享传真驱动程序”、“Microsoft XPS 文档编写器”等...

通过使用 WMICodeCreator 工具,我发现我不能依赖本地/网络属性为真(截至目前,我的网络打印机告诉我它的网络属性为假...)所以我想知道是否有其他方法可以获取正确的信息?

奖励积分如果我可以将 USB 打印机连接到计算机:Win32_USBHub 属性在这里没有真正帮助,因为我无法获得“打印支持”的正确描述:)

【问题讨论】:

也许正在寻找 Win32_Printer.MarkingTechnology 或 Win32_Printer.PortName? 不幸的是,答案是否定的,这不能直接完成 - 只有一些好的猜测会有所帮助。见***.com/questions/2327763/… 【参考方案1】:

我知道这是一篇很老的帖子,但我遇到了同样的要求,我想我会把我的最终结果发布给下一个人。

Dim oWMI, colPrinters, oItem, oPrinter
Set oWMI = GetObject("winmgmts:impersonationLevel=impersonate!\\.\root\cimv2")
Set colPrinters = oWMI.ExecQuery("Select * From Win32_Printer where PrintProcessor <> 'winprint'")

For Each oPrinter in colPrinters
    If oPrinter.Attributes And 64 Then
        Wscript.Echo oPrinter.Name
    End If
Next

【讨论】:

如果您要远程获取此信息,这将不起作用。【参考方案2】:

我认为只有物理打印机使用unidrv.dll

string query = "select * from Win32_PrinterDriver";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection collection = searcher.Get();

foreach (ManagementObject obj in collection)

    Console.WriteLine(obj["Name"].ToString());
    Console.WriteLine(obj["DriverPath"].ToString());
    Console.WriteLine();

【讨论】:

这是不正确的。许多物理打印机使用unidrv 以外的驱动程序,许多虚拟打印机使用unidrv。您无法根据打印机使用的驱动程序判断打印机是物理的还是虚拟的。

以上是关于如何使用 WMI 检索物理打印机列表?的主要内容,如果未能解决你的问题,请参考以下文章

WMI 调用以检索 HDD 上的物理序列号

如何在没有 WMI 的情况下使用 PowerShell 获取总物理内存大小?

使用 Python 的 wmi 模块删除网络打印机?

如何在 Python 中不使用 WMI 获取 PhysicalDisk?

如何修复 Win32_Printer.Default 字段,以便在远程使用 WMI 时返回正确的值?

如何使用 delphi 提高 WMI 性能?