C# 从.NET WinService在交互式登录用户下启动程序

C# 从.NET WinService在交互式登录用户下启动程序,c#,.net,windows-7,windows-services,C#,.net,Windows 7,Windows Services,目前,我们已经在windows开始时在LocalService用户下启动了.NET WinService。该服务使用Process.Start()启动另一个WinForms应用程序 但这种解决方案存在几个问题: 我们不会等待交互式用户登录,应用程序会因为尝试初始化DirectX设备而失败 在LocalService下启动的应用程序与Windows XP中的用户桌面完美交互。但它在Windows7中不起作用,因为在win7中,每个用户都有不同的图形工作站 有时,我们需要使用当前交互式登录用户权限运

目前,我们已经在windows开始时在LocalService用户下启动了.NET WinService。该服务使用Process.Start()启动另一个WinForms应用程序

但这种解决方案存在几个问题:

  • 我们不会等待交互式用户登录,应用程序会因为尝试初始化DirectX设备而失败
  • 在LocalService下启动的应用程序与Windows XP中的用户桌面完美交互。但它在Windows7中不起作用,因为在win7中,每个用户都有不同的图形工作站
  • 有时,我们需要使用当前交互式登录用户权限运行应用程序
  • 有人知道如何在服务中等待用户交互式登录并使用这些用户权限启动WinForms应用程序吗


    我认为这有助于解决所有问题。

    您需要一个单独的客户端应用程序。查看此文档,第6页:


    对于监视/重启场景,请查看文档中提到的CreateProcessAsUser。你几乎肯定需要让你的客户端应用程序与这项服务相协调,而它仍然在把一个方形的钉子推入一个圆形的洞。

    我会尝试使用上述答案的组合

    解决#1 在用户登录时,使用注册表或启动文件夹中的autostart启动Winforms应用程序。使其通知服务已成功启动

    要确保在用户登录后成功启动Winform应用程序,请执行以下操作: 让您的服务检查应用程序是否像现在一样开始在后台运行,但不要让它进行初始启动。 相反,只要让它在用户登录时注册,就可以通过监听OnSessionChange来实现。 将延迟设置为X秒,以允许登录/启动过程在开始检查正在运行的应用程序之前完成(ok可能不是最佳解决方案)


    如果服务发现应用程序未启动或崩溃,请使用Mark指出的CreateProcessAsUser方法从服务中重新启动它

    这可能不是你想要做的事情的正确方法吗?似乎您最好将监控逻辑或任何有正常运行时间要求的东西放到服务中,这样可以说它“始终处于打开状态”。然后,您将在WinForms应用程序中保留UI逻辑,该逻辑可以打开或关闭,不会产生任何不良影响。

    好的,我会阅读它,但我认为它可能只解决了第二个问题。最有可能的是,因为其他两个问题并不是服务真正要解决的问题。为什么不呢?my WinService的主要目标是监控关键应用程序的运行状况,并为计算机提供远程控制。服务并非真正用于与桌面交互,而在Vista+中,它基本上是不可能启动的(您确定您的XP one在用户注销和重新登录后工作正常吗?因为这样他们很可能位于与服务不同的桌面上)。如果您想在用户登录时以用户的权限启动应用程序,标准自动运行选项(注册表项或启动文件夹)有什么问题?@Zooba,winservice的任务之一是在应用程序启动后照看它,并在它崩溃时重新启动它。@Acoolam Windows本身提供了一些这方面的功能(),这可能是一个选项,或者应用程序可以在服务启动时通知服务以达到相同的效果吗?您可以使用Windows API代码包在重新启动管理器中注册它。@Zoomba,这篇文章不错,但所有软件都必须在远程机器上运行,并且必须对其应用高可靠性要求。因此,我不能使用应用程序重启rt due“如果应用程序在终止前执行时间少于60秒,WER将不会重新启动该应用程序”。