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

时间:2011-03-01 20:16:35

标签: c# .net windows-7 windows-services

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

但是这个解决方案有几个问题:

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

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

3 个答案:

答案 0 :(得分:2)

您需要一个单独的客户端应用。查看此文档,第6页:http://msdn.microsoft.com/en-us/windows/hardware/gg463353.aspx

对于监视/重新启动方案,请查看文档中提到的CreateProcessAsUser。您几乎肯定需要让您的客户端应用程序与此服务协调,并且仍然将方形挂钩推入圆孔。

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

这可能是你正在尝试做的事情的正确方法吗?您可能最好将监控逻辑或具有正常运行时间要求的任何内容放入服务中,以便它可以“永远在线”。然后你会在WinForms应用程序中留下UI逻辑,它可以打开或关闭,没有任何不良影响。