【问题标题】:Printing by executing a process in a Windows Service通过执行 Windows 服务中的进程进行打印
【发布时间】: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


【解决方案1】:

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

转到服务 ---> 双击所需的服务 ---> 进入登录选项卡

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

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

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

请看下面的屏幕截图。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的链接,但我认为它不适用于我的情况。我没有使用 .NET Framework 打印类进行打印。我刚刚启动了一个 .exe,它接受一个参数告诉他打印文档。
    【解决方案3】:

    这里的解决方案是共享您的本地打印机并调用 Foxit

    -/t yourfile.pdf \\localhost\YourSharedPrinter

    这样您的服务就不需要 UserProfile 和 DefaultPrinter。

    【讨论】:

      猜你喜欢
      • 2011-05-09
      • 2023-01-31
      • 2012-04-12
      • 1970-01-01
      • 2013-12-21
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多