【问题标题】:Enumerate printers for a specific Terminal Server session枚举特定终端服务器会话的打印机
【发布时间】:2009-03-24 09:11:04
【问题描述】:

我正在寻找一种方法来查看特定用户已将哪些打印机映射到他或她的 TS 会话中。

如何使用 WMI(通过 PowerShell)或 VB-Script 实现这一点?有没有我不知道的内置方式?

编辑:在我们的构造中,RDP 客户端对本地打印机的映射被禁用。用户通过 VBS 脚本在登录期间创建他们的打印机,并在注销期间删除。

因此,我们的 TS 服务器上没有直接安装打印机,查询 Win32_Printers WMI 类不会返回任何内容。打印机安装在专用的打印服务器上。查询该服务器上的打印机会返回所有打印机,而不是为单个用户映射的打印机。

【问题讨论】:

    标签: session terminal-services enumerate printers


    【解决方案1】:

    感谢 Remko 的评论,我被引导到了正确的方向,并最终制作了一个符合我需要的脚本。

    基本上,该脚本会确定用户的 SID,并在用户的注册表配置单元 (HKEY_USERS\$sid\Printers\Connections) 中查找已创建的打印机。

    这是快速而肮脏的 powershell 脚本:

    $server = 'servername'
    $userName = 'username'
    
    $regHKLM = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine", $server)
    $regProfileList = $regHKLM.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList")
    
    foreach ($sid in $regProfileList.GetSubKeyNames())
    {
        $profileImagePath = $regProfileList.OpenSubKey($sid).GetValue("ProfileImagePath")
        if ($profileImagePath.EndsWith("\$userName"))
        {
            $regHKU = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("Users", $server)
            $regUser = $regHKU.OpenSubKey("$sid\Printers\Connections")
            foreach ($printer in $regUser.GetSubKeyNames())
            {
                $printer.Replace(",", "\")  # backslashes are replaced with commas, revert that
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      我现在无法签入 TS 会话,但这通常在 powershell 中进行:

      Get-WMIObject Win32_Printer

      【讨论】:

      • 这也适用于 TS 会话。我在会话 中返回名称如“ 上的 (来自 )”的驱动程序。它们还有一个端口名称“TSxxx”。可能存在与会话关系的对象,但我找不到任何东西。
      • 这在我们的构造中不起作用,因为终端服务器上没有安装打印机。我更新了问题。
      【解决方案3】:

      从这里:http://www.microsoft.com/technet/scriptcenter/guide/sas_prn_tart.mspx?mfr=true

      strComputer = "."
      Set objWMIService = GetObject("winmgmts:" _
       & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
      Set colInstalledPrinters = objWMIService.ExecQuery _
       ("SELECT * FROM Win32_Printer")
      For Each objPrinter in colInstalledPrinters
       Wscript.Echo "Name: " & objPrinter.Name
       Wscript.Echo "Location: " & objPrinter.Location
      Next
      

      【讨论】:

      • 使用此方法将为您提供本地安装在服务器上的打印机列表 - 这是空的。用户的打印机通过 WshNetwork.AddWindowsPrinterConnection 添加到会话中,并且您的脚本看不到。
      【解决方案4】:

      您可能需要基于 CUPS 的技术吗?对于任何 unix 上的杯子来说,这都是简单的任务,但我不确定 Windows。

      【讨论】:

        【解决方案5】:

        【讨论】:

        • 这可能有助于获取实际用户的网络打印机,但我的目的是获取特定用户的打印机列表。
        【解决方案6】:

        据我了解,您可以阅读注册表中的某些字段。

        PS:我更喜欢用Linux做终端服务;)

        【讨论】:

        • 这不起作用,因为在远程桌面上,注册表 HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices 可以包含不再活动的打印机。
        • 尝试 HKEY_CURRENT_USER\Printers\Connections
        猜你喜欢
        • 2011-12-31
        • 1970-01-01
        • 2012-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-04
        • 1970-01-01
        相关资源
        最近更新 更多