【发布时间】: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 中实现。我想知道你是否解决了这个问题。
标签: windows windows-services windows-server-2008 scheduled-tasks session-0-isolation