在 WinServer 2008 中从非交互式进程(Windows 服务、计划任务等)打印 PDF

Posted

技术标签:

【中文标题】在 WinServer 2008 中从非交互式进程(Windows 服务、计划任务等)打印 PDF【英文标题】:Printing PDFs in WinServer 2008 from a non-interactive process (Windows service, scheduled task, etc.) 【发布时间】:2011-11-06 09:26:38 【问题描述】:

我正在尝试编写一个打印 PDF 的非交互式进程,我需要有关如何在 Windows Server 2008(和 Vista/7)上构建它的建议。

以前,我们有一个计划任务(无论用户帐户是否登录都设置为运行),它会打印目录中的所有 PDF。 (一个单独的进程会将 PDF 移动到目录中。)在运行时,这将启动另一个进程(Adobe Reader 或 Foxit Reader)来打印 PDF。 Adobe Reader 和 Foxit Reader 都具有静默打印功能,因此所有内容都将发送到运行计划任务的用户的默认打印机。从未生成任何 UI,所有文件都可以顺利打印。 这适用于 Server 2003。

该过程不再适用于 Server 2008。我不完全确定,但我相信这与会话 0 隔离有关。我无法证明这一点。但是,我可以说当设置为“仅在用户登录时运行”时,该进程作为计划任务运行。现在,虽然这可行,但它会强制用户登录机器,因此不能满足我的要求。 (我的第一个线索是this previous question。)

我无法确定如何继续前进。有什么方法可以满足我的要求吗?

一些注意事项:

我看到的每个解决方案似乎都在使用登录用户的凭据。 请参阅我上面链接的问题 - 列出的解决方案似乎正在获取登录用户的令牌用户并使用它来运行程序。 (查看 GetCurrentUserToken() 过程 - 返回值稍后在 API 调用 CreateProcessAsUser() 中使用。)

据我所知,我当前的进程几乎没有生成 UI。我已经使用 ProcMon 验证了读取器进程(Adobe 或 Foxit)似乎可以正确打印并且打印驱动程序本身似乎有问题。这可以通过尝试使用打印到文件驱动程序来支持 - 打印到文件驱动程序以三个可见步骤运行,并且清楚地完成所有文件的第一个步骤,而无需启动第二个步骤。那么 Session 0 Isolation 如何影响打印机驱动程序呢?这对我来说不清楚。 (The best documentation I can find on the subject 只提到打印机驱动程序可能会受到影响,即使打印后台处理程序在会话 0 中运行。)

打印作为 Windows 服务永远不会起作用,即使进程已选中“允许服务与桌面交互”。

添加了粗体文字以抵消导致模糊的文字墙效果。

【问题讨论】:

在 Win2k8 中,对 Windows 服务禁用 GDI+。我会假设任何基于 Windows 的 PDF 阅读器都会在某些时候使用 GDI+,所以我认为这不可能在 win2k8 中实现。我想知道你是否解决了这个问题。 【参考方案1】:

尝试使用 Foxit Reader 而不是 Acrobat-Reader。 福昕阅读器正确支持无 GUI/命令行执行,在 Windows 2008 及更高版本中也是如此!

也可以打印,但每次运行打印作业时都必须在 session0 中添加(或检查)打印机。

如果您需要更多帮助,请再次询问。我已经构建了一个 powershell 脚本,它在任务调度程序中运行,在 Foxit Reader 的帮助下打印 pdf 文件。

【讨论】:

以上是关于在 WinServer 2008 中从非交互式进程(Windows 服务、计划任务等)打印 PDF的主要内容,如果未能解决你的问题,请参考以下文章

Win10,Win7,WinServer2012,WinServer2008内存最大支持

WinServer2008配置任务计划

winserver2008r2安装node

winserver2008如何搭建FTP服务器

Winserver2008搭建SVN服务器

winserver 2008 R2服务器安装IIS