我正在尝试编写一个打印 PDF 的非交互式进程,我需要有关如何在 Windows Server 2008(和 Vista/7)上构建它的建议。
以前,我们有一个计划任务(无论用户帐户是否登录都设置为运行),它将打印目录内的所有 PDF。(一个单独的进程会将 PDF 移动到目录中。)在运行时,这将启动另一个进程(Adobe Reader 或 Foxit Reader)来打印 PDF。Adobe Reader 和 Foxit Reader 都具有静默打印功能,因此所有内容都将发送到运行计划任务的用户的默认打印机。从未生成任何 UI,所有文件都可以顺利打印。这适用于 Server 2003。
该过程不再适用于 Server 2008。我不完全确定,但我相信这与会话 0 隔离有关。我无法证明这一点。但是,我可以说,当设置为“仅在用户登录时运行”时,该进程作为计划任务工作。现在,虽然这可行,但它会强制用户登录机器,因此不能满足我的要求。(我的第一个线索是在上一个问题中。)
我无法确定如何继续前进。有什么方法可以满足我的要求吗?
几点注意事项:
我见过的每个解决方案似乎都在使用登录用户的凭据。请参阅我上面链接的问题 - 列出的解决方案似乎是获取登录用户的令牌并使用它来运行程序。(查看 GetCurrentUserToken() 过程 - 返回值稍后在 API 调用 CreateProcessAsUser() 中使用。)
据我所知,我当前的流程没有生成 UI。我已经使用 ProcMon 验证了阅读器进程(Adobe 或 Foxit)似乎可以正确打印,并且打印驱动程序本身似乎有问题。这可以通过尝试使用打印到文件驱动程序来支持 - 打印到文件驱动程序以三个可见步骤运行,并且清楚地完成所有文件的第一个步骤,而无需启动第二个步骤。那么 Session 0 Isolation 如何影响打印机驱动程序呢?这对我来说不清楚。(我能找到的关于该主题的最佳文档只提到打印机驱动程序可能会受到影响,即使打印后台处理程序在会话 0 中运行。)
作为 Windows 服务的打印永远不会起作用,即使该进程已选中“允许服务与桌面交互”。
添加了粗体文本以抵消导致模糊的文本墙效果。