我们必须使用 Windows XP 计算机的远程桌面连接 Windows 2008 服务器。条码打印机与 XP 计算机相连,并且打印机在 RDC 会话中作为本地资源共享到服务器。
在服务器上,我们必须从打印到 LPT 端口或共享打印机(UNC 路径)的应用程序进行打印。为此,我使用结合 LPT1 和(终端服务器)TSxxx 端口的打印池进行配置。因为我不知道通过 UNC 路径访问终端会话打印机的选项。
但我有以下问题 -
每次我连接到远程会话时,我本地 Win XP 计算机上的打印机都会显示在 Win 2008 Server(终端服务器)上的“打印机和传真”中,但我无法从终端服务器管理 Win XP 打印机以启用池。每次在服务器上,我都必须更改安全权限,然后启用打印池。我如何才能保持安全权限不变?
其次,我创建了一个批处理文件来启用打印池。
rundll32 printui.dll,PrintUIEntry /Xs /n "打印机(来自客户端)" 端口名称 "LPT1:,TS005"
但每次终端会话中的打印机都连接到不同的终端会话端口。有什么解决方案可以修复 TS 端口吗?
任何人的帮助都将受到高度赞赏。
答案1
您无法“修复”您要求的参数,因为每次会话断开/连接时都会删除并重新创建打印机。因此,显然,更改应用程序似乎是最干净的解决方案。如果无法更改,您显然可以针对该问题编写一些脚本来缓解痛苦:
您可以使用以下方式更改打印机的权限
subinacl /printer
脚本中的语法您可以通过首先检索会话 ID(例如使用
quser
)、构造打印机名称("Printer (redirected <SessionID>)"
)并将其喂给类似cscript %WINDIR%\System32\Printing_Admin_Scripts\<Language>\prncnfg.vbs -g -p "Printer (redirected <SessionID>)" | find "Portname"
如果您的 Windows XP 计算机可以通过 SMB 从终端服务器访问,那么您显然可以在那里共享打印机并使用该\\%clientname%\<printer>
符号,但您可能已经想到了这一点并因为某种原因而放弃了它。
答案2
要求:
- 通过远程桌面连接从终端服务器主机打印到连接到 TS 客户端的打印机。
- 创建一个批处理文件来完成上述要求。
状况:
- TS 客户端使用静态 IP 连接 TS 主机。
- 在 TS Host 上,打印只能发送到 LPT 端口。在那里运行的应用程序不能打印到除 SMB 共享打印机或连接到 LPT 端口的打印机以外的其他打印机。
- 无法使用 SMB 共享访问与 TS 客户端连接的打印机
考虑的步骤:
- TS 客户端上的打印机通过远程桌面连接作为本地资源共享
- TS 主机上可用的打印机从 TS 客户端重定向,对当前登录的 RDC 用户具有受限访问权限。因此,必须向当前 TS 用户授予打印机管理权限。
- 启用打印机池,就好像 LPT 端口的打印将被重定向到其他端口上的打印机
参考文献和工具:
- 主要指导经过syneticon-dj
- 通过 RDC 共享打印机
- 参考“SetACL”工具,而不是“SubInACL”。 下载链接:设置ACL
- DOS命令行工具快取使用者(与查询用户相同)
- 程序配置工具(
%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