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

标签 c# windows-services console-application

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

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

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

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

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

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

补充:我知道服务没有用户界面,我也不想要。我想让服务运行控制台应用程序。无需从中获取任何数据或使用此控制台(如 ui),只需运行它即可完成工作。

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

很高兴收到任何评论!

最佳答案

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

在其他操作系统上,服务选项中有一个选项可用,名为“允许服务与桌面交互”。从技术上讲,您应该为 future 编程并且应该遵循 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);

看看这是否有效。

首先,您通知 Windows 该程序不会使用 shell(在 Vista 中无法访问以提供服务)。

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

关于c# - 如何从 Windows 服务运行控制台应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1369236/

相关文章:

c# - 如何在 C# 的控制台窗口中显示列表项

c# - 类型转换对象长

c# - 特定条目的 LINQ 索引

c# - 我在控制台应用程序的 App.Config 中设置 elmah 时遇到问题

c# - 当 WCF 服务运行批处理文件时,XCopy 或 MOVE 不起作用。为什么?

c# - ASP.NET Core .NET 6 Preview 7 Windows 服务

C++ 控制台应用程序总是在最前面?

c# - 删除对局部变量 c# 的无用赋值

c# - 如何在 .Net 应用程序中使用 IE 代理服务器设置及其凭据

c# - 如何使用 Related ObjectQuery 访问远程 Windows 服务