为什么我的Windows服务无法执行外部应用程序?

3
我创建了一个打印PDF文件的服务。当我通过System.Process对象调用FoxitReader,并向其发送控制台命令时,该服务不起作用。我已经了解了Session 0隔离的相关知识,但是我的服务并没有调用GUI应用程序,它只是在可执行文件中执行命令。
以下是我的代码:
System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.StartInfo.FileName = "FoxitReader.exe";
            proc.StartInfo.Arguments = " /t " + '"' + nombreArchivo + '"' + " " + '"' + nombreImpresora + '"';
            EventLog.WriteEntry("InboundServicioImpresion", "Comando impresion:" + proc.StartInfo.FileName + proc.StartInfo.Arguments);
            proc.StartInfo.RedirectStandardError = true;
            proc.StartInfo.RedirectStandardOutput = true;
            proc.StartInfo.UseShellExecute = false;
            proc.Start();
            proc.WaitForExit();

注意:FoxitReader.exe已包含在服务包中;它安装在与服务相同的文件夹中。

当代码需要时,服务启动并写入事件日志,并且不会崩溃或抛出任何异常(每种方法都由try-catch控制)。此外,它能够将文件从一个文件夹移动到另一个文件夹。唯一不能正常工作的是使用foxit、adobe reader 或sumatraPDF进行打印。

有任何关于为什么不能正常工作的想法吗?

谢谢您提前的帮助,Esteban。


1
你的服务正在以哪个用户身份运行?打印机是本地连接到该服务所在的计算机上,还是网络打印机? - user957902
你正在重定向输出但没有读取它。这足以导致程序死锁,等待某人解除其输出。只需不进行重定向即可。 - Hans Passant
双击服务 -> 登录选项卡 -> 选中复选框“允许服务与桌面交互”。 - hipokito
2个回答

4
您需要的是文件的完整限定名,而不仅仅是文件名。服务的默认路径设置为 C:\Windows\System32(或适用于您的操作系统)。
更改此行:
proc.StartInfo.FileName = "FoxitReader.exe";

将此路径(如果它始终是固定的路径,则可以硬编码)转换为以下内容:
proc.StartInfo.FileName = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "FoxitReader.exe");

谢谢你的回答,Russell。我已经修改了我的代码,但它仍然没有打印任何东西。 - t3b4n
如果你确信正在执行正确的可执行文件,那么你应该捕获标准输出和错误,并查看它们的内容。 - Russell McClure

2
你是否在使用默认的LocalSystem账户运行服务?也许它没有打印机的访问权限。
尝试将服务更改为使用一个通常可以使用FoxitReader打印的账户,并查看是否有效。在从Windows服务控制面板应用程序配置您的服务时,在“登录”选项卡上进行更改: http://www.powershellinside.com/kb/articles/powershellssh-useraccounts-1.jpg

你好,CoreTech。是的,我的服务已配置为在LocalSystem帐户下运行。 - t3b4n
你可以尝试将其设置为用户帐户,看看是否有效?(当然,是一个可以访问打印机的帐户。) - CoreTech
谢谢!这是一个与用户相关的问题。当我将用户帐户更改为我的用户时,进程就可以开始了。 - t3b4n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接