Delphi Win32服务在2008 64位标准服务器上出现“所选打印机无效”错误。

4
我已经开发了一个简单的Delphi 7 Win 32服务,负责一些打印操作。在我们的XP机器上都很正常,但是在目标Windows 2008标准服务器上失败了。当我在打印语句周围加上try except块时,会出现“所选打印机无效”的错误。
当我检查打印机对象的打印机数量并将所有可用打印机写到文件中时,它可以正常工作。只有在我尝试执行打印操作(本地和网络打印机)时,它才会失败。
根据使用Google进行的大量研究,我发现有很多建议使用本地账户、网络账户、特定账户、LogonAsUser、ImpersonateUser、LoadUserProfile等,但没有任何有效结果。我还设置了安装的打印机的安全性以使每个人都可以访问。
这真的让我疯了。非常感谢任何帮助。
谢谢
3个回答

5

这很可能是由于Vista引入的Session 0隔离所致。服务始终在Session 0中运行,但在XP及更早版本中,第一个登录的用户也在Session 0中运行,从而允许服务访问该用户的桌面(从而允许“交互式”服务)和资源(如共享和打印机)。从Vista开始,用户不再在Session 0中运行,因此服务不再具有对用户特定资源的访问权限。服务必须模拟它想要访问的用户帐户。


感谢您的回复。我确实尝试使用LogonAsUser、ImpersonateUser和LoadUserProfile winapi调用。所有操作都成功了,我甚至获得了用户令牌。但即使如此,打印操作仍然失败。 - rohan
你有没有检查GetLastError()是否报告了它失败的原因? - Remy Lebeau

3
很难回答一个“它不工作”的问题。但我可以猜测。微软曾经警告过从服务中打印的问题。我认为问题在于打印机驱动程序很少被设计为在Windows 2008提供的这种服务环境中运行。服务在隔离会话中运行,它们不能再与桌面交互。打印机驱动程序往往太啰嗦了,做一些像提示用户纸张卡住了或是该购买新的工厂批准的碳粉盒之类的东西。那在会话0中就不起作用了,没有人能听到它的尖叫声。这种情况很难诊断,你就无法知道为什么服务停止响应。
也许他们在2008年解决了这个问题并完全禁止了打印。不确定,你可以在serverfault.com上找到知道这个问题的人。

0

我遇到了同样的错误,经过大量的谷歌搜索,找到了http://www.codenewsfast.com/cnf/article//permalink.art-ng1612q9464

看起来Delphi 2007的打印机单元:Printer.pas并不适用于Vista及以上版本。 参考文章提供了更改Printer.pas源代码的选项。 在Vista上,这解决了我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接