【问题标题】:On Terminal Server, how does a service start a process in a user's session?在终端服务器上,服务如何在用户会话中启动进程?
【发布时间】:2009-08-15 00:50:10
【问题描述】:

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

如何做到这一点?

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

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

【问题讨论】:

    标签: windows pinvoke process terminal-services


    【解决方案1】:

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

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

    【讨论】:

    • 请注意,这需要一些很大的权限,即 TCB 权限。
    • 可能会没问题,因为海报将通过 Windows 服务执行此操作。大多数服务都以极高的权限运行...
    • 不是这样 - 我机器上的大多数服务都作为 LocalService 而不是 LocalSystem 运行。
    • 好点。这绝对是埃文需要考虑的事情。
    【解决方案2】:

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

    您可以使用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?

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 作为对 Reed 回复的评论会更好。
      猜你喜欢
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多