如何使用C#编写Windows服务以启动用户应用程序?

3
有没有可能启动一个程序,以便用户可以通过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");

    }

为什么要添加一个服务而不只是在启动菜单中添加一个快捷方式? - Paolo
我们有一个第三方应用程序,希望将其作为“服务器”类型的应用程序运行。由于某种未知原因,该程序会意外退出。我们正在尝试编写一个Windows服务来检查应用程序是否正在运行,并在其关闭时重新启动,以暂时解决此问题。 - Swoop
2
这个第三方应用是如何启动的?为什么不创建一个程序来启动这个应用,等待它意外退出,然后再次启动它呢? - Gabe
@gabe,现在我已经越过了这个障碍,我想我应该使用标准的Windows应用程序而不是服务。至少这是一个很好的学习经验。 - Swoop
3个回答

5
在Vista和Win7中,服务在其自己的会话中运行,并拥有私有桌面。你可以启动Firefox,但它永远不会可见。实际上,账户名称就是这样产生的,LocalSystem是一个高度特权的账户,是一个巨大的安全漏洞。
您需要在用户会话中使用一个“代理”来启动该进程。通过Run键或Startup文件夹启动的一个无形程序,通过命名管道或套接字与服务通信。它可以启动该程序。

4
在“服务”中,将服务的属性中的“允许服务与用户交互”打上勾即可。

安德烈,这个方法非常有效。乔治,为什么这是不鼓励的? - Swoop
1
据我所知,这在Windows Vista及更高版本中无法正常工作。 - jwismar
2
不仅被反对,一旦你离开XP安全区域,它就会停止工作。Vista和Windows 7积极禁止此操作,请参见http://msdn.microsoft.com/en-us/library/ms683502%28VS.85%29.aspx。 - Remus Rusanu
有趣的是,有多少开发人员甚至从未看过Vista/Win7。听起来XP还会存在很长一段时间... - Hans Passant
我怀疑我的公司不会很快从XP升级。我们仍然有一些应用程序需要IE6,这仍然是公司标准浏览器。:( 我在家使用的是Windows 7,非常喜欢它。 - Swoop

3
这里有一篇博客文章,介绍如何在Windows Vista及更高版本中完成此操作。但是需要注意的是,文章的第一句话是:“首先,你应该做的是:不要这样做。因为涉及到许多限制、坏影响和限制。”如果你无法避免从Windows服务启动交互式进程,那么你可能需要阅读这篇文章。 Windows SDK blog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接