从Windows服务终端服务器(在全球空间)上运行,我们希望能够启动运行在特定用户的终端服务器会话一个Windows应用程序的过程。
如何去这样做呢?
将之情况:Windows服务在引导时启动。 用户登录到终端服务器用户会话后,根据已知的只有Windows服务的一些标准,窗口服务要启动一个进程在用户的会话中运行Windows应用程序。
举个例子:我们希望“在5分钟内关机”的警告给用户显示。 Windows服务将检测到这种情况,并启动在启动显示警告的窗口应用程序的每个用户会话的过程。 而且,是的,我知道有显示警告对话框的其他方式,这是本例中,我们想要做的是更侵入。
您可以使用CreateProcessAsUser做到这一点 - 但它需要一点努力。 我相信下面的步骤是基本要求的程序:
- 获取该用户的会话( WTSQuerySessionInformation )。
- 获取该用户(令牌WTSQueryUserToken )。
- 为您创建(副本令牌DuplicateTokenEx )。
- 使用令牌创建一个环境块( CreateEnvironmentBlock )。
- 启动与所述应用程序CreateProcessAsUser ,使用上述块。
您还需要确保清理所有合适的手柄,令牌等,你启动的进程后。
真的晚了答复,但也许有人会发现这是很有帮助的。
您可以使用PSEXEC通过使用以下命令远程(或本地)服务器上启动指定的会话中的应用程序:
PSEXEC \\计算机-i SESSION_ID APPLICATION_NAME
凡SESSION_ID表示会话ID在其中启动应用程序。
你需要知道什么是会话服务器和会话ID映射到该用户登录的活跃。 下面的线程提供了这种确切的问题一个很好的代码示例: 你如何检索.NET登录/连接用户的列表?
晚答复,但在上述DuplicateToken答案是没有必要的,因为WTSQueryUserToken已经返回主令牌。
文章来源: On Terminal Server, how does a service start a process in a user's session?