4

在 delphi 7 中开发了一个简单的 win 32 服务,它执行一些打印操作。在我们的 XP 机器上一切正常,但在目标Windows 2008 标准服务器上失败。当我在 print 语句周围放置一个 try except 块时,会导致“所选打印机无效”错误。

当我检查打印机对象的打印机数量并将打印机对象中可用的所有打印机写入文件时,它工作正常。只有当我尝试执行打印(在本地和网络的任何打印机上)时,它才会失败。

基于使用谷歌的大量研究,我发现了很多使用本地账户、网络账户、特定账户、LogonAsUser、ImpersonateUser、LoadUserProfile 等的建议,但没有任何效果。我还在已安装的打印机上设置了安全性,以便所有人都可以访问。

这件事真让我发疯。非常感谢任何帮助。

谢谢

4

3 回答 3

5

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

于 2011-01-06T20:55:20.143 回答
3

总是很难回答“它不起作用”的问题。但我可以推测。微软过去曾警告过通过服务进行打印。我认为问题在于打印机驱动程序很少设计为在 Windows 2008 提供的那种服务环境中运行。服务在隔离会话中运行,它们不能再与桌面交互。打印机驱动程序往往过于健谈,会做诸如提示用户卡纸之类的事情。或者是时候购买新的工厂认可的碳粉盒了。这在会话 0 中效果不佳,没有人能听到它的尖叫声。完全无法诊断,您只是无法说出服务停止的原因。

也许他们在 2008 年确定了这一点并完全阻止了它。不知道,您会在 serverfault.com 上找到知道这一点的人

于 2011-01-06T20:57:50.073 回答
0

我得到了同样的错误,很多谷歌工作都在http://www.codenewsfast.com/cnf/article//permalink.art-ng1612q9464

似乎 delphi 2007 打印机单元:Printer.pas 不是为 Vista 及更高版本设计的。引用的条目提供了更改 Printer.pas 源的选项。在vista上它解决了我的问题。

于 2013-03-13T20:40:10.307 回答