【问题标题】:How do you program a windows service in C# to start an application for a user?如何在 C# 中编写 Windows 服务来为用户启动应用程序?
【发布时间】:2010-03-24 04:10:19
【问题描述】:

是否可以启动一个程序以供具有 Windows 服务的用户使用?我一直在使用 C# 中的 Process.Start()。我可以让服务启动某种进程,该进程出现在进程下的任务管理器列表中。但是,该程序永远不会出现在屏幕上。默认情况下,它在用户名“SYSTEM”下运行。我已调整服务管理器中的“登录”选项以匹配登录计算机的人,但这也不会导致出现窗口。

我觉得我要么缺少一个简单的设置,要么需要为此采取不同的方向。下面是我用来启动 Firefox 作为测试应用程序的代码。

    private void startRunDap()
    {
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName = "Firefox";
        startInfo.WindowStyle = ProcessWindowStyle.Normal;
        startInfo.UseShellExecute = true;
        Process.Start(startInfo);

        //Process.Start("Firefox");

    }

【问题讨论】:

  • 想知道为什么在启动菜单中添加了一项服务而不仅仅是一个快捷方式?
  • 我们有一个第 3 方应用程序,我们希望将其作为“服务器”类型的应用程序运行。由于某些未知原因,程序将意外退出。我们正在尝试整合一个 Windows 服务来检查应用程序是否正在运行,如果它关闭则重新启动作为此问题的临时解决方案。
  • 这个第 3 方应用程序是如何启动的?为什么不直接创建一个程序来启动这个应用程序,等待它意外退出,然后再次启动它?
  • @gabe,既然我已经克服了这个障碍,我想我应该为此使用标准的 Windows 应用程序而不是服务。至少这是一次很好的学习经历。

标签: c# .net windows-services


【解决方案1】:

在 Vista 和 Win7 上,服务在它们自己的会话中与专用桌面运行。您将启动 Firefox,但它永远不可见。账户名其实就是这么来的,LocalSystem 是一个高权限账户,一个巨大的安全漏洞。

您将需要用户会话中的“代理”来启动该过程。一个不可见的程序,您使用 Run 键或 Startup 文件夹启动,它通过命名管道或套接字与服务通信。它可以启动程序。

【讨论】:

    【解决方案2】:

    在服务的服务属性中勾选“允许服务与用户交互”

    【讨论】:

    • 安德烈,这就像一个魅力。 Giorgi,为什么不鼓励这样做?
    • 据我了解,这不适用于 Windows Vista 及更高版本。
    • 不仅不鼓励,而且一旦您离开 XP 安全天堂,它就会停止工作。 Vista 和 Windows 7 bot 主动禁止此操作,请参阅 msdn.microsoft.com/en-us/library/ms683502%28VS.85%29.aspx
    • 有点意思,有多少开发者从未看过 Vista/Win7。听起来 XP 的存在时间会更长……
    • 我怀疑我的公司很快就会从 XP 迁移过来。我们仍然有需要 IE6 的应用程序,它仍然是公司的标准浏览器。 :( 我家里有 Windows 7 并且喜欢它。
    【解决方案3】:

    这里是一篇博客文章的链接,该文章描述了如何在 Windows Vista 及更高版本中执行此操作。不过,您应该注意,文章中的第一句话是:

    你应该做的第一件事是;不要这样做。涉及许多限制和不良影响和限制。

    如果您处于无法避免从 Windows 服务启动交互式进程的状态,那么您可能需要阅读这篇文章。

    Windows SDK blog

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      相关资源
      最近更新 更多