我有一个 Windows 服务应用程序,它不时需要打印一些文档。据我所知,要打印这些文档,我的服务必须使用除本地服务或网络服务之外的用户帐户运行。因此,我创建了一个用户帐户并将其添加到管理员组并使用该帐户运行该服务。
使用本地安装的打印机,我不会遇到任何问题,因为这些打印机会自动安装在所有帐户中。为了能够使用网络打印机进行打印,我创建了另一个应用程序,该应用程序使用 rundll32.exe printui.dll,PrintUIEntry 命令将当前登录用户的已安装打印机与我的服务使用的用户帐户同步。
在 Vista 和 Windows7 中,我没有遇到任何打印机同步问题,因为每次需要安装打印机时,都会打开身份验证窗口,并要求输入相应的用户帐户来安装该打印机(服务用户帐户未在网络打印机计算机上创建)但在 XP 中,会出现一个带有“连接到 {printername}”标题的查找对话框并停止响应,或者有时它会安装打印机,但每次服务尝试打印时,都会抛出一个带有“未发出 StartDocPrinter 调用”消息的 Win32Exception,并且在运行同步应用程序的用户帐户中将显示重复的打印机,除非强制(使用注册表),否则我无法删除这些打印机。
我使用 Windows 服务打印文档的做法是否正确?如果正确,我该如何解决上述问题?如果不正确,我该怎么办?
谢谢。
答案1
您可以以服务用户帐户登录计算机并手动添加/配置/测试网络打印机。
答案2
为什么不为所有打印机设置本地队列,这样它们就始终是本地打印机,并且您不会遇到问题?
您可以通过创建具有打印机相关 IP 地址的本地端口,将本地队列指向网络打印机。(通过添加打印机向导,添加本地打印机(不要让它搜索即插即用),创建新端口,使用标准 TCP/IP 端口。
答案3
我已经通过首先向服务器请求网络身份验证然后安装打印机解决了该问题。
谢谢你们的帮助。
答案4
我认为您可能在这里做了不必要的工作。如果您使用所谓的“每台机器连接”安装打印机,则该打印机将可供该机器上的所有用户和服务使用。我知道我们以这种方式从作为服务运行的 Tomcat 进行打印。警告:我不能 100% 确定这是否适用于本地服务帐户。
听起来你已经知道 PrintUI.dll PrintUI.DLL 用户指南和参考
主要部分:
rundll32 printui.dll PrintUIEntry /in /n\machine\printer
-or-
rundll32 printui.dll PrintUIEntry /if /f %windir%\inf\ntprint.inf /r "lpt1:" /m "HP PSC 500"
按照您描述的方式操作可能会不必要地削弱您的安全性。服务应以完成其工作所需的最低权限运行。当您在用户帐户中运行它们时,您很容易无意中赋予您的服务不应拥有的权限。