【发布时间】:2012-03-18 07:58:32
【问题描述】:
我有一个 Windows 服务需要启动一个进程来将文件发送到打印机(我在 https://stackoverflow.com/a/4875755/1228738 找到了该解决方案)。我使用 Process.Start() 来执行此操作。 我的问题是什么都没有发生。
该服务实际上安装在我的开发人员机器(win7、x64)上。我尝试将其安装为本地系统、网络服务、本地服务,每次都具有相同的结果。
我尝试了那些开始我的过程的方式:
Process p = new Process();
p.StartInfo.FileName = "C:\\Program Files (x86)\\Foxit Software\\Foxit Reader\\Foxit Reader.exe";
p.StartInfo.Arguments = "-p myFile.pdf";
p.Start();
和
Process.Start("C:\\Program Files (x86)\\Foxit Software\\Foxit Reader\\Foxit Reader.exe", "-p myFile.pdf");
还有
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "C:\\Program Files (x86)\\Foxit Software\\Foxit Reader\\Foxit Reader.exe";
startInfo.Arguments = "-p myFile.pdf";
Process.Start(startInfo);
当我在 winform 应用程序中执行相同的代码时,一切正常,文件被发送到打印机。但在 Windows 服务中,什么也没有发生。
我看到了那个帖子https://stackoverflow.com/a/6271309/1228738,这解释了为什么我看不到 UI,这很好,反正我没有任何 UI。但正如评论部分所说,没有用户输入的过程应该是可以的。我开始的过程不需要任何用户输入。
我现在唯一能想到的是,由于会话隔离(https://stackoverflow.com/a/5063750/1228738),该服务找不到任何已安装的打印机...可以这样吗?如果是这样,有什么建议可以解决这个问题吗?如果没有,有什么想法吗?
谢谢!
编辑#1
我尝试使用我的用户帐户运行该服务,它正在运行,所以我想我的担心得到了证实……用户 LOCAL SYSTEM 和 NETWORK SERVICE 没有安装打印机。
所以我会稍微完善一下我的问题。这些帐户有没有办法访问计算机上安装的打印机?
编辑#2
我们最终决定创建一个用户来运行该服务,并在该用户帐户中安装用于打印的打印机。
我想这个问题现在可以结束了。 谢谢大家的帮助。
【问题讨论】:
-
这可能是因为应用程序正在尝试显示打印对话框但会话是非交互式的(检查应用程序事件日志),或者可能是如您所建议的那样,因为服务运行的用户因为没有配置打印机。您可以以服务运行的用户身份登录(如果可能)并配置打印机。
-
当我在 winform 应用程序中执行完全相同的代码时,文件会在没有打印对话框的情况下发送到打印机,因此我希望服务具有相同的行为。我将尝试类似于您建议的方法,并使用我的用户帐户运行该服务,看看它是否以这种方式工作。谢谢
-
另外,myFile.pdf 位于何处?该服务是否有权访问该路径?
-
是的,我刚刚在文件所在的文件夹上使用账户网络服务的完全控制权限进行了测试,没有成功。感谢您的建议。
-
没有。这不能通过 Windows 服务完成。
标签: c# .net printing windows-services