【发布时间】:2013-04-11 23:09:46
【问题描述】:
我如何才能唯一且可靠地识别给定服务器上的 Windows 打印队列,包括跨打印队列重命名?
我想处理如下情况:
- Jdoe 创建打印机 A
- 我的程序有时会收集有关打印机 A 的信息
- Jdoe 将打印机 A 重命名为打印机 AA
- 我的程序有时会再次收集有关打印机 AA 的信息
如何判断打印机 A 和打印机 AA 是同一台打印机(更改了名称)?
我想在支持 Windows XP/2003 及更高版本的 C# 中执行此操作。
我尝试过的事情:
在 Windows 8/Server 2012 上,我似乎可以通过 WMI 查看 CIM_LogicalDevice->DeviceID 来执行此操作,这似乎在重命名时保持一致,但在早期版本的操作系统中,此属性仅包含队列名称并在队列已重命名。
我还查看了 Win32_PnPEntity 类(不包含 Windows 8 之前的打印机)和 Win32_Printer 类(不包含名称以外的任何类型的 ID)。
在注册表中 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers[打印机名称] 有一个包含 GUID 的 QueueInstanceId 字段,但仅在 Windows 8/Server 2012 中。它在早期的操作系统中不存在。
打印后台处理程序 API 和 GDI 打印 API 似乎都通过名称来识别队列,所以我没有发现任何有用的东西。
【问题讨论】:
-
发生这种情况时您是想接收某种事件通知,还是只是查询它并获取最新的队列?
-
另外,请原谅我的无知,但是当您说“打印队列名称”时,这与设备和打印机下的打印设备名称相同,对吧?
-
@AdamPlocher 不需要通知。我希望能够定期查询并识别打印机 AA 实际上是更改名称的打印机 A,并且能够执行诸如识别打印到打印机 A 的文档 1 被发送到与发送的文档 2 相同的打印机到打印机 AA(重命名后)。另外,要回答您第二条评论中的问题,是的,我们在谈论同一件事。
-
哦,明白了。我有一些列出打印机名称和驱动程序名称的代码。匹配驱动程序名称(不应更改)是否足以确定它们是相同的设备?如果您愿意,我可以将其发布在答案中...