在远程桌面会话上打印

我们必须从Windows XP机器连接使用远程桌面的Windows 2008服务器。 一台条形码打印机与XP机器连接,打印机作为RDC会话中的本地资源共享到服务器。

在服务器上,我们必须从打印到LPT端口或共享打印机(UNCpath)的应用程序进行打印。 为此,我使用LPT1和(terminal服务器)TSxxx端口configuration打印池。 因为我不知道通过UNCpath访问terminal会话打印机的选项。

但是我有以下问题 –

每次连接到远程会话时,本地Win XP计算机上的打印机都显示在Win 2008 Server(terminal服务器)上的“打印机和传真”中,但我不允许从terminal服务器pipe理Win XP打印机以启用共享。 在服务器上,我必须每次都更改安全权限,然后启用打印池。 我如何保持安全权限不变?

其次我创build了一个batch file来启用打印池。

rundll32 printui.dll,PrintUIEntry / Xs / n“Printer(from CLIENT)”Portname“LPT1:,TS005”

但每次terminal会话中的打印机连接到不同的terminal会话端口。 任何解决scheme,使TS端口固定?

任何人的帮助将受到高度赞赏。

由于打印机在每个会话断开/连接时被删除并重新创build,因此您无法获取要求“固定”的参数。 很明显,改变应用程序看起来像最干净的解决scheme。 如果不能改变,你显然可以做一些脚本来解决这个问题,以减轻痛苦:

  • 您可以在脚本中使用subinacl /printer语法更改打印机的权限

  • 您可以通过首先检索会话ID(例如使用quser ),构造打印机名称( "Printer (redirected <SessionID>)" )并将其提供给像cscript %WINDIR%\System32\Printing_Admin_Scripts\<Language>\prncnfg.vbs -g -p "Printer (redirected <SessionID>)" | find "Portname" cscript %WINDIR%\System32\Printing_Admin_Scripts\<Language>\prncnfg.vbs -g -p "Printer (redirected <SessionID>)" | find "Portname"

如果您的Windows XP计算机可以通过terminal服务器通过SMB访问,那么您显然可以在那里共享打印机并使用\\%clientname%\<printer>符号,但是您可能已经想到了这一点,并且由于某种原因或者其他。

需求:

  1. 从terminal服务器主机打印到通过远程桌面连接连接到TS客户端的打印机。
  2. 创build一个batch file来完成上述要求。

条件:

  • TS客户端使用静态IP连接TS主机。
  • 在TS主机上,打印只能发送到LPT端口。 运行在那里的应用程序无法打印到除SMB共享打印机或连接LPT端口的打印机以外的其他打印机。
  • 用TS客户端连接的打印机将无法使用SMB共享进行访问

考虑的步骤:

  • TS客户端上的打印机通过远程桌面连接共享为本地资源
  • TS主机上redirect的打印机,对当前login的RDC用户具有受限制的访问权限。 因此,当前TS用户必须被授予打印机pipe理权限。
  • 启用打印机池,好像打印给LPT端口将被redirect到其他端口上的打印机

参考和工具:

  • 主要由syneticon-dj 指导
  • 通过RDC共享打印机
  • 参考“SetACL”工具,而不是“SubInACL” 。 下载链接: SetACL
  • DOS命令行工具QUSER (与QUERY USER相同)
  • Prncnfg.vbs ( %WINDIR%\System32\Printing_Admin_Scripts\<Language>\prncnfg.vbs

批量:

 REM Begin of the script REM Find out Session ID of Current RDC User using QUSER QUSER CurrentTSUsername | FIND "CurrentTSUsername" > TSPrn_tmp.txt FOR /F "tokens=1-3 delims= " %%i IN ('Type TSPrn_tmp.txt') DO SET TSID=%%k REM Generate Printer name combining Printer name on Client and Terminal Session ID SET PRINTER="ClientPrinter (redirected %TSID%)" REM Grant ownership and Printer Manage Permission to current TS user using SETACL SETACL -on %PRINTER% -ot prn -actn setowner -ownr n:CurrentTSUsername SETACL -on %PRINTER% -ot prn -actn ace -ace "n:administrator;p:full" REM Find out Terminal Session TSxxx port on which the printer mapped using Prncnfg.vbs cscript %WINDIR%\System32\Printing_Admin_Scripts\en-US\prncnfg.vbs -g -p %PRINTER% | find "Port name" > TSPrn_tmp.txt FOR /F "tokens=1-3" %%i IN ('TYPE TSPrn_tmp.txt') DO SET TSPORT=%%k REM Enable Printer pooling combining LPT port and the TS Port rundll32 printui.dll,PrintUIEntry /Xs /n %PRINTER% Portname "LPT1:,%TSPORT%" REM Delete the Temp txt file del TSPrn_tmp.txt REM end of the script