在终端服务器上,服务如何在用户的会话中启动进程?

时间:2009-08-15 00:50:10

标签: windows pinvoke process terminal-services

从终端服务器上运行的Windows服务(在全球空间中),我们希望能够在特定用户的终端服务器会话中启动运行Windows应用程序的进程。

如何做到这一点?

Scenerio:Windows服务在启动时启动。用户登录终端服务器用户会话后,根据Windows服务只知道的一些标准,Windows服务希望在运行Windows应用程序的用户会话中启动进程。

示例:我们希望向用户显示“5分钟内关机”警告。 Windows服务将检测到这种情况,并在每个用户会话中启动一个进程,启动显示警告的Windows应用程序。而且,是的,我知道还有其他方法可以显示警告对话框,这就是示例,我们想要做的更具侵略性。

3 个答案:

答案 0 :(得分:5)

您可以使用CreateProcessAsUser执行此操作 - 但需要一些努力。我认为以下步骤是基本的必需程序:

在启动流程后,您还需要确保清理所有相应的句柄,令牌等。

答案 1 :(得分:1)

回复很晚,但也许有人会觉得这很有帮助。

您可以使用PsExec使用以下命令在指定会话内的远程(或本地)服务器上启动应用程序:

  

psexec \\ COMPUTER_NAME -i SESSION_ID APPLICATION_NAME

其中 SESSION_ID 表示启动应用程序的会话ID。

您需要知道服务器上哪些会话处于活动状态以及哪个会话ID映射到哪个用户登录。以下线程为这个确切的问题提供了一个很好的代码示例:How do you retrieve a list of logged-in/connected users in .NET?

答案 2 :(得分:0)

延迟回复但在上面的回答中没有必要使用DuplicateToken,因为WTSQueryUserToken已经返回主令牌。