2008 64位标准服务器上的Delphi Win32服务“打印机选择无效”错误

Posted

技术标签:

【中文标题】2008 64位标准服务器上的Delphi Win32服务“打印机选择无效”错误【英文标题】:Delphi Win32 Service "Printer Selected is not valid" error on 2008 64bit standard server 【发布时间】:2011-01-06 19:17:17 【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢您的回复。我确实尝试过使用 LogonAsUser、ImpersonateUser 和 LoadUserProfile winapi 调用。一切都成功了,我什至得到了用户令牌。但即便如此,打印操作也会失败。 您是否检查了 GetLastError() 是否报告了失败的原因?【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于2008 64位标准服务器上的Delphi Win32服务“打印机选择无效”错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在WIN2008或WIN2012 64位系统安装32位SQL2000

安装win server 2008 R2服务器配置需要占用多大硬盘

如何在WIN2008或WIN2012 64位系统安装32位SQL2000

Delphi:如何确定应用程序是不是在 Win32 / Win64 下运行并在 64 位上自动启动 64 位版本?

64位win7安装了64位的Oracle11g,用delphi7配置BDE出现下面的问题。

64位 win7 下如何用delphi连接oracle数据库?一直提示没有驱动,但是驱动又安装不上去!