【问题标题】:Start a program in an active user session from a service? [duplicate]在服务的活动用户会话中启动程序? [复制]
【发布时间】:2009-11-13 16:08:58
【问题描述】:

如何从正在运行的 .NET 后台进程在活动用户会话中启动程序。基本上我有一个作为服务运行的 .NET 应用程序,我希望该应用程序在某些事件发生时在用户桌面上启动一个特定的窗口应用程序。

我该怎么做?

这个问题和这个有关:Start a program in active user session with PowerShell remoting

更新
单独使用Process.Start 在这里不起作用,因为它会在当前应用程序会话中启动应用程序。它不会在特定用户的活动桌面会话中启动应用程序。

【问题讨论】:

  • 我不是 100% 确定它会起作用,而且几乎没有发布答案。
  • 别担心,克里斯,感谢您的宝贵时间。
  • 1) 如果有多人登录系统会发生什么?终端服务或快速用户切换可能会发生这种情况。 2) 您希望窗口应用程序在用户的安全上下文中启动还是在服务的安全上下文中启动?
  • 我希望能够将它定位到特定机器上的特定用户,并且我希望能够检测会话的状态。如果用户不活跃或没有立即看到它,只要他们下次连接到服务器时对话框已经启动,这并不是什么大不了的事。如果他们被注销或他们的会话被终止,那么如果他们下次登录时没有出现该消息,那也没关系。
  • 我猜你现在已经找到了解决方案(因为问题已经超过 2 年了),如果你还没有,那么我有一个我可以发布的解决方案作为答案...

标签: c# .net service desktop


【解决方案1】:

您是否可以构建某种轻量级的侦听器应用程序以供用户在后台运行?假设您的服务可以与侦听器通信并让侦听器实例化窗口应用程序,因为它在用户的上下文中运行。

【讨论】:

  • 绝对是一种可能的方法。不过对我来说不是很有趣。我只是在寻找一种快速的方法来在我自己的会话中使用 Windows Remoting (.NET) 在多台机器上回收应用程序。如果我不能轻松做到这一点,最好的办法就是让应用程序作为服务运行,我可以重新启动服务,而不必担心它会在特定会话桌面上运行。
【解决方案2】:

CreateProcessWithLogonW 函数将允许您传入您希望应用程序运行的用户的凭据。

另外,请注意,如果您沿着这条路线走,您确实需要传入 STARTUPINFO 结构,以便它在正确的桌面上启动,而不仅仅是让它为空。

【讨论】:

  • “运行方式”与我在这里尝试做的不同。它只是使用特定用户凭据在当前会话中运行应用程序。
  • 对不起,我没有先检查您的相关问题。我相信可以通过使用 WTSQueryUserToken 在单个机器上实现以在特定会话中启动,但我没有意识到涉及到远程处理。
【解决方案3】:

查看 Windows 服务的登录上下文 shown here。这允许 Windows 服务与桌面会话进行交互。

【讨论】:

  • 我相信这仅适用于 /CONSOLE 会话,并且不允许您定位特定的活动用户会话。
  • 我相信你是不正确的,因为我之前看到过一个 Windows 服务与用户的桌面交互。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多