通过在Windows服务中执行进程进行打印

时间:2012-02-28 20:01:57

标签: c# .net printing windows-services

我有一个需要启动进程才能将文件发送到打印机的Windows服务(我在那里找到了解决方案https://stackoverflow.com/a/4875755/1228738)。我使用Process.Start()来做到这一点。 我的问题是没有任何反应。

该服务实际安装在我的开发人员计算机上(win7,x64)。我尝试将其作为LOCAL SYSTEM,NETWORK SERVICE,LOCAL SERVICE安装,每次都有相同的结果。

我试过这种方式开始我的过程:

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,这解释了为什么我不会看到用户界面,这很好我无论如何都没有任何用户界面。但正如评论部分所述,没有用户输入的过程应该没问题。我开始的过程不需要任何用户输入。

我现在唯一能想到的是,由于会话隔离(https://stackoverflow.com/a/5063750/1228738),服务无法找到任何已安装的打印机......可以这样吗?如果是这样,任何建议如何解决?如果没有,任何错误的想法?

谢谢!

编辑#1

我尝试使用我的用户帐户运行该服务,它正在运行,所以我猜我的担心得到了确认......用户LOCAL SYSTEM和NETWORK SERVICE没有安装打印机。

所以我会稍微改进一下我的问题。这些帐户有没有办法访问计算机上安装的打印机?

编辑#2

我们最终决定创建一个用户来运行该服务,在该用户帐户中我们将安装要打印的打印机。

我想这个问题现在可以关闭了。 谢谢大家的帮助。

3 个答案:

答案 0 :(得分:3)

我也有这个问题,这个技巧解决了它

转到服务--->双击所需的服务--->继续登录标签

提供安装打印机的登录凭据。

运行您的服务,然后检查打印机队列。

原因:本地系统帐户没有安装这些打印机!

请参阅下面的屏幕截图。enter image description here

答案 1 :(得分:0)

查看此MSDN页面:http://support.microsoft.com/kb/324565

根据此页面,您无法使用.NET从ASP.NET页面或Windows服务进行打印。

答案 2 :(得分:0)

此处的解决方案是共享您的本地打印机并使用

调用Foxit

-/t yourfile.pdf \\localhost\YourSharedPrinter

这样,您的服务不需要UserProfile,也不需要DefaultPrinter。