查找远程桌面会话 (WMI) 上用户可用的打印机

Posted

技术标签:

【中文标题】查找远程桌面会话 (WMI) 上用户可用的打印机【英文标题】:Lookup Printers Available to User on Remote Desktop Session (WMI) 【发布时间】:2018-05-15 09:46:46 【问题描述】:

我们有一个需要很长时间才能打印的旧系统,因为 VB6 会循环遍历每台可用的打印机,直到找到合适的打印机进行打印。 For Each xx In Printers

问题在于 Printers 对象正在拉动大量打印机并显着降低程序速度。 我尝试过使用 WMI,但不知道是否可以将打印机对象传回。它在 CollectPrinters = objPrinter 行崩溃。

Public Function CollectPrinters(ByVal PrinterToUse As String) As Printer

  Dim strComputer As String
  Dim objWMIService As Object
  Dim strPrinterList As String

  strComputer = "."
  Set objWMIService = GetObject("winmgmts:" & "impersonationLevel=impersonate!\\" & strComputer & "\root\cimv2")

  Set colInstalledPrinters = objWMIService.ExecQuery("Select * from Win32_Printer WHERE Local = True AND DeviceID LIKE 'client preview%'")

  For Each objPrinter In colInstalledPrinters
    Debug.Print objPrinter.NAME
    strPrinterList = strPrinterList + objPrinter.NAME & vbCrLf
    If objPrinter.NAME = PrinterToUse Then
        'CollectPrinters = objPrinter
        Exit Function
    End If
  Next
End Function

如果我找错树了,请指出正确的方向。

【问题讨论】:

在我的会计应用程序中,我只是循环浏览系统打印机集合并将它们放在一个组合框中,并允许我的用户按用户为每个功能选择他们想要的打印机 - 发票、支票、声明等。这是您必须定期提示的内容,而不是预先选择打印机的选项吗? “它崩溃了”但具体是什么错误? 我想它会是“类型不匹配”,因为我不明白为什么 objPrinter 会是“打印机”类型。 我不得不承认我很困惑为什么遍历“打印机”会这么慢。你能给出一个代码示例来说明你是如何使用它的吗? 【参考方案1】:

感谢大家的cmets,我想出了一个解决方法。服务器有大量的用户和打印机,Printers 对象获取每台打印机,而不仅仅是当前的打印机。我们还使用了一款名为 ThinPrint 的产品,它可以向用户 PC 输出预览。如果默认打印机不是 ThinPrint,解决方法基本上只运行For Each xx In Printers。在大多数情况下,ThinPrint 是默认设置,因此性能提升很大。

【讨论】:

以上是关于查找远程桌面会话 (WMI) 上用户可用的打印机的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 WMI 远程删除 Windows 7 网络打印机驱动程序

Windows 2008 关闭远程桌面的单用户多会话模式

Win32_Printer 远程 WMI 查询真的很慢

Teamviewer11现在无法捕捉屏幕画面。这可能是由于快速的用户切换或远程桌面会话断开/最小化。

win server 2019 :2个?远程管理用户(单会话?)升级为远程桌面服务多用户(多会话)