Windows Server 2019打印服务器上设置虚拟打印机拦截打印作业的技术咨询
Windows Server 2019打印服务器上设置虚拟打印机拦截打印作业的技术咨询
我来聊聊你遇到的这个虚拟打印机拦截打印作业的问题,不少管理员都会碰到类似需求,咱们一步步梳理清楚:
一、基础配置的关键要点
- 驱动选择:你提到的HP通用打印驱动(HP Universal Print Driver)确实是个非常合适的选择,它支持PDF、PCL等多种主流打印格式,兼容性拉满,能确保打印任务被正确解析成可存储的文件格式,完全适配虚拟打印机的场景。
- 服务器角色要求:作为打印服务器,你需要先安装Print and Document Services角色,其中的Print Server组件是核心基础;另外要确保开启了文件共享和打印共享服务,这些在角色安装向导里就能完成配置,不需要额外的特殊角色。
二、拦截打印作业的几种实现方式
1. 端口级脚本拦截(推荐用于早阶段拦截)
你提到的TCP/IP端口配置窗口里的脚本选项,其实就是官方提供的早期拦截入口——可以在这里绑定VBScript或PowerShell脚本,一旦有打印请求到达端口就触发执行。
- 操作思路:写一个脚本,当新作业进来时,直接抓取打印输出文件(通常是SPL或EMF格式),保存到指定目录;如果需要转成PDF这类通用格式,可以搭配Ghostscript这类工具做格式转换。
- 注意事项:一定要给脚本设置正确的权限,确保打印服务账户(一般是
NT AUTHORITY\SYSTEM或Print Spooler账户)有执行脚本和写入目标存储目录的权限,不然会触发权限报错。
2. PowerShell监控打印队列(灵活度高)
如果端口脚本的灵活性不够,你可以用PowerShell监听打印队列的事件,比如定时轮询或者监控PrintService日志:
这里给你一个简单的示例脚本片段,用来捕获新打印作业并导出假脱机文件:
# 替换成你的虚拟打印机名称 $printerName = "你的虚拟打印机名称" # 目标存储目录,提前创建好 $savePath = "D:\PrintCaptures\" while($true){ # 筛选出正在打印或假脱机中的新作业 $newJobs = Get-PrinterJob -PrinterName $printerName | Where-Object {$_.JobStatus -match "Printing|Spooling"} foreach($job in $newJobs){ Write-Host "捕获到新打印作业:$($job.DocumentName),作业ID:$($job.Id)" # 复制SPL假脱机文件到目标目录 $splFilePath = "C:\Windows\System32\spool\PRINTERS\$($job.Id).spl" if(Test-Path $splFilePath){ Copy-Item $splFilePath "$savePath$($job.Id)_$($job.DocumentName).spl" # 可选:转换SPL为PDF(需要提前安装Ghostscript) # & "C:\Program Files\gs\gs10.02.0\bin\gswin64c.exe" -sDEVICE=pdfwrite -o "$savePath$($job.Id)_$($job.DocumentName).pdf" $splFilePath } } # 每5秒轮询一次 Start-Sleep -Seconds 5 }
- 提示:SPL是Windows的原生打印假脱机文件,要是需要转换成可直接使用的PDF,Ghostscript是个免费好用的工具,安装后就能通过命令行完成转换。
3. 第三方工具快速部署
如果不想自己折腾脚本,也可以用专门的打印捕获工具,比如PaperCut NG、Print Conductor这类,它们自带打印作业拦截、文件存储甚至格式转换的功能,适合快速落地需求。
三、关于“在打印请求开始时拦截”的需求
端口级的脚本触发是比较早的拦截阶段,在作业进入打印假脱机之前就会执行;而监控打印队列是在作业已经进入队列之后。如果要尽可能早地拦截请求,优先考虑端口绑定脚本的方式;要是需要更底层的拦截,就得用Windows的打印过滤器(Print Filter Pipeline),但这个需要编写C++插件,技术门槛比较高,一般不推荐普通场景使用。
备注:内容来源于stack exchange,提问作者Obalony Pivvot
相关产品推荐
相关产品推荐

