从终端服务器上运行的Windows服务(在全球空间中),我们希望能够在特定用户的终端服务器会话中启动运行Windows应用程序的进程。
如何做到这一点?
Scenerio:Windows服务在启动时启动。用户登录终端服务器用户会话后,根据Windows服务只知道的一些标准,Windows服务希望在运行Windows应用程序的用户会话中启动进程。
示例:我们希望向用户显示“5分钟内关机”警告。 Windows服务将检测到这种情况,并在每个用户会话中启动一个进程,启动显示警告的Windows应用程序。而且,是的,我知道还有其他方法可以显示警告对话框,这就是示例,我们想要做的更具侵略性。
答案 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已经返回主令牌。