【问题标题】:Spawn Process from a C# Windows Service从 C# Windows 服务生成进程
【发布时间】:2011-11-17 23:13:15
【问题描述】:

嗯,我试图从 Windows 服务产生的线程内部产生一个进程。目标是读取输出并打印到焦点窗口 - 光标所在的位置。可能是个坏主意,我不知道我不是 C# 程序员

当我调用函数本身时,生成进程的任何人都可以工作,但在正在运行的服务中调用它时则不行。是否可以在服务内启动进程?

Process proc = new Process();
                proc.StartInfo.FileName = @"C:\file.bat";
                proc.StartInfo.RedirectStandardError = true;
                proc.StartInfo.RedirectStandardOutput = true;
                proc.StartInfo.UseShellExecute = false;

                proc.Start();

                String outputMessage = proc.StandardOutput.ReadToEnd();
                proc.WaitForExit();

【问题讨论】:

  • 这可能与运行该服务的用户的权限有关。这段代码在服务中运行会发生什么你得到任何类型的错误
  • 没有错误,它开始正常。什么都没有发生。
  • 进程在服务中运行后的 outputMessage 变量中的内容。
  • @stefan,该设置在 Windows Vista 及更高版本上不再存在。服务现在在自己的桌面上运行,无法访问用户桌面。
  • 是的,我现在看到了。这一切都进入了XP!谢谢

标签: c# windows service


【解决方案1】:

从服务启动进程当然是可能的。但是,服务在会话 0 内运行并且没有桌面。交互式用户在不同的会话中运行他们的桌面。因此,从服务启动时,在交互式会话中启动并运行进程是非常具有挑战性的。

有关所涉及问题的说明以及正确处理的难度,请阅读以下内容:Launching an interactive process from Windows Service in Windows Vista and later

最简单的方法是将您的服务分成两个不同的部分。一部分作为服务运行,另一部分作为交互式会话中的无窗口进程运行。这两个进程可以通过您喜欢的任何 IPC 机制进行通信。当服务想要启动一个进程时,它只需向交互式会话中的另一半发送一条消息,请求启动新进程。

【讨论】:

  • 啊酷,我看到了“允许服务与桌面交互”框。检查它,我现在可以看到东西正在生成。甜
  • 您必须使用 XP。该设置对 Vista 及更高版本没有帮助。
【解决方案2】:

如果您需要在 GUI 之间进行交互并向用户显示某种反馈,为什么不在命名管道上实现 WCF 接口。将其托管在您的服务中,并在需要时提供“状态”API 甚至函数。这样您就可以向系统上的任何用户提供 gui,并且服务保持干净。

但正如@David Heffernan 所提到的,实际上并不建议从 Windows 服务创建 gui,从 Vista 开始,它们在 Session 0 上下文中创建。

【讨论】:

    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    相关资源
    最近更新 更多