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

Yar*_*lev 29 c# windows-services console-application

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

控制台应用程序运行时不是从Windows服务运行.当它从ws运行它没有做它应该做的任何事情,因为它应该工作10-20秒我在调试代码中看到立即执行.

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

proc.Start(fullPathToConsole, args);
proc.WaitForExit();
Run Code Online (Sandbox Code Playgroud)

控制台的路径是正确的,当我试图从cmd或只是在资源管理器(没有args)运行它时,它工作正常.但在运行该服务后,我认为没有效果.

我已经尝试转到服务属性并授予它访问桌面的权限,并在系统和我的用户下运行(也在服务属性中指定).一切都保持不变.

附加:我知道服务没有ui,我不想要.我希望服务运行控制台应用程序.无需从中获取任何数据或像ui一样使用此控制台,只需运行它就可以完成它的工作.

更新我发现,运行计算或任何其他Windows应用程序很容易.但仍然无法运行cmd或任何控制台应用程序.实际上我需要在XP SP2和Windows 2003 Server上运行它.所以无论如何都不需要与Vista交互.

任何评论都会很高兴!

Pie*_*ant 25

从Windows Vista开始,服务无法与桌面交互.您将无法看到从服务启动的任何窗口或控制台窗口.看到这个MSDN论坛帖子.

在其他操作系统上,服务选项中有一个选项,名为"允许服务与桌面交互".从技术上讲,您应该为未来编程,即使您不在Vista上使用它,也应遵循Vista准则.

如果您仍希望运行从不与桌面交互的应用程序,请尝试指定不使用shell的过程.

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);
Run Code Online (Sandbox Code Playgroud)

看看这是否成功.

首先,您通知Windows该程序将不使用shell(在Vista中无法访问该服务).

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


Jes*_*cer 8

我成功之前就完成了这个 - 我家里有一些代码.当我今晚回到家时,我将使用启动控制台应用程序的服务的工作代码更新此答案.

我以为我会从头开始尝试这个.这是我编写的一些启动控制台应用程序的代码.我将其作为服务安装并运行并且它正常工作:cmd.exe启动(如任务管理器中所示)并持续10秒,直到我发送退出命令.我希望这可以帮助你的情况,因为它在这里按预期正常工作.

    using (System.Diagnostics.Process process = new System.Diagnostics.Process())
    {
        process.StartInfo = new System.Diagnostics.ProcessStartInfo(@"c:\windows\system32\cmd.exe");
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.ErrorDialog = false;
        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.RedirectStandardInput = true;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        process.Start();
        //// do some other things while you wait...
        System.Threading.Thread.Sleep(10000); // simulate doing other things...
        process.StandardInput.WriteLine("exit"); // tell console to exit
        if (!process.HasExited)
        {
            process.WaitForExit(120000); // give 2 minutes for process to finish
            if (!process.HasExited)
            {
                process.Kill(); // took too long, kill it off
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)


Dou*_*rch 5

Windows服务没有UI。您可以使用此问题中显示的代码将控制台应用程序的输出重定向到您的服务。

  • 我不需要用户界面或重定向输出。我需要启动一个控制台应用程序并让它完成工作。我不需要任何用户界面,所以这不是出路。 (2认同)