小编典典

如何从Windows服务运行控制台应用程序?

c#

我有一个用C#编写的Windows服务,我需要从中运行控制台应用程序。控制台应用程序也用c#编写。

当不是从Windows服务运行控制台应用程序时,它运行正常。当它从ws中运行时,它什么也没做,它应该工作10到20秒,我在调试代码中看到立即执行。

我使用以下代码启动控制台应用程序:

proc.Start(fullPathToConsole, args);
proc.WaitForExit();

控制台的路径是正确的,当我尝试从cmd或仅在资源管理器(无args)中运行它时,它工作正常。但是使用该服务运行后,我看不到任何效果。

我已经尝试过访问服务属性,并赋予它访问桌面的权限,并且可以在系统和用户下运行(也在服务属性中指定)。一切保持不变。

另外:我知道服务没有用户界面,我也不需要。我希望服务运行控制台应用程序。无需从中获取任何数据或使用ui这样的控制台,只需运行它即可完成其工作。

更新一:发现,运行calc或任何其他Windows应用程序都很容易。但是仍然无法运行cmd或任何控制台应用程序。实际上,我需要在XP SP2和Windows
2003 Server上运行它。因此,无论如何都不需要与Vista进行交互。

如有任何评论,我们将非常高兴!


阅读 1057

收藏
2020-05-19

共1个答案

小编典典

从Windows
Vista开始,服务无法与桌面交互。您将无法看到从服务启动的任何窗口或控制台窗口。请参阅此MSDN论坛线程

在其他操作系统上,服务选项中提供了一个选项,称为“允许服务与桌面交互”。从技术上讲,即使您不在Vista上使用它,也应该为将来编程,并应遵循Vista准则。

如果您仍然想运行一个永远不会与桌面进行交互的应用程序,请尝试指定不使用外壳程序的过程。

ProcessStartInfo info = new ProcessStartInfo(@"c:\myprogram.exe");
info.UseShellExecute = false;
info.RedirectStandardError = true;
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.CreateNoWindow = true;
info.ErrorDialog = false;
info.WindowStyle = ProcessWindowStyle.Hidden;

Process process = Process.Start(info);

看看这是否有用。

首先,您通知Windows该程序将不使用外壳程序(在Vista中无法访问该外壳程序以进行服务)。

其次,将所有控制台交互重定向到内部流(请参阅process.StandardInputprocess.StandardOutput

2020-05-19