2011-07-27 35 views
3

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

通过使用WMICodeCreator工具,我发现我不能依靠本地/网络属性是真实的(截至目前,我的网络打印机告诉我,它的网络属性是错误的...),所以我想知道是否有另一种方式获得正确的信息?

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

+0

也许正在寻找Win32_Printer.MarkingTechnology或Win32_Printer.PortName? – Bijan

+0

不幸的是,答案是否定的,这不能直接完成 - 只有一些很好的猜测在这里会有所帮助。请参阅http://stackoverflow.com/questions/2327763/is-there-a-possibility-to-differ-virtual-printer-from-physical-one – Lizz

回答

0

我认为仅仅物理打印机使用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(); 
} 
+0

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

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 
+0

如果您正在远程获取此信息,这将不起作用。 –