如何获取CreateProcessAsUser的有效用户令牌?

Bjö*_*örn 5 windows-services token createprocessasuser

我有一个以普通用户身份运行的应用程序,以及作为本地系统运行的服务.我希望应用程序能够告诉服务再次启动应用程序,一旦服务完成了其他一些事情.(因此,当服务正在执行"事物"时,应用程序将不会运行.)为了使服务能够以首次启动它的用户启动应用程序,它需要一个用户令牌.应用程序在退出之前将令牌发送到服务,但是当服务尝试使用它时,令牌/句柄无效.(它首先使用DuplicateTokenEx来获取主令牌.)

用户令牌是否始终仅在调用OpenProcessToken的进程中有效?

还有其他方法可以做到吗?我不希望用户必须使用logonuser"登录"应用程序.那只是愚蠢的.我想我可以将"explorer.exe"的进程句柄从应用程序移交给服务,该服务可以用来获取用户令牌,但这需要PROCESS DUP HANDLE访问权限.我对这个解决方案并不感到兴奋,但也许是这样做的方法呢?

Ste*_*tin 3

您这里有多个问题,所以我会尝试分别解决它们,如果我误解了,您可以纠正我:

  1. 您似乎有一个服务和一个用户应用程序无法同时执行某些功能。为了实现此目的,您需要服务停止应用程序,执行特殊功能,然后重新启动应用程序。如果这是正确的,那么在我看来,你就有设计缺陷。您应该使用命名互斥体和/或使用 IPC 方法(例如命名管道)进行互斥来协调对共享资源的访问,而不是停止然后重新启动应用程序来传达意图。

  2. 用户令牌是否始终仅在调用 OpenProcessToken 的进程中有效?是的,您收到的令牌句柄是进程句柄表的索引,它不能直接传输。您需要使用 DuplicateHandle,这可能是您想要的,但可能会很混乱。

  3. 您希望找到获取用户令牌的最佳方法,以将应用程序启动到用户的(交互式?)会话中。如果是这种情况,最好的方法是检索用户的会话令牌并使用它。您可以查看本文和示例代码,它是用 C# 编写的,但应该相对容易转移到您选择的语言。

编辑:更新为包括 Windows 2000。由于您在 SYSTEM 帐户下运行该服务,因此它可以打开进程本身的句柄(如果需要,进程可以发送其进程 ID)。然后,它可以打开附加到该进程的令牌,复制它并使用生成的令牌来启动(或重新启动)目标应用程序。