1

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

如何做到这一点?

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

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

4

3 回答 3

5

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

您还需要确保在启动该过程后清理所有适当的句柄、令牌等。

于 2009-08-15T01:00:03.870 回答
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?

于 2012-07-17T19:33:09.733 回答
0

由于 WTSQueryUserToken 已经返回主令牌,因此不需要延迟回复,但在上面的答案中 DuplicateToken 是不必要的。

于 2009-09-14T20:43:09.197 回答