我有一个以普通用户身份运行的应用程序,以及一个以本地系统身份运行的服务。我希望应用程序能够告诉服务再次启动应用程序,一旦服务完成了其他一些事情。 (因此,当服务正在执行“事物”时,应用程序将不会运行。)为了使服务能够以首次启动它的用户启动应用程序,它需要一个用户令牌。应用程序在退出之前将令牌发送到服务,但是当服务尝试使用它时,令牌/句柄无效。 (它首先使用DuplicateTokenEx获取主令牌。)
用户令牌是否始终仅在调用OpenProcessToken的进程中有效?
还有其他方法可以做到吗?我不希望用户必须使用logonuser“登录”应用程序。那只是愚蠢的。我想我可以将“explorer.exe”的进程句柄从应用程序移交给服务,该服务可以用来获取用户令牌,但这需要PROCESS DUP HANDLE访问权限。我对这个解决方案并不感到兴奋,但也许是这样做的?
答案 0 :(得分:3)
你在这里有多个问题,所以我会尝试单独解决这些问题,如果我误解你可以纠正我:
您似乎拥有无法同时执行某些功能的服务和用户应用程序。为了实现这一点,您可以让服务停止应用程序,执行特殊功能,然后重新启动应用程序。如果这是正确的,那么在我看来,你有一个设计缺陷。而不是停止,然后重新启动应用程序,您应该通过使用命名的互斥锁和/或使用IPC方法(如命名管道)进行互斥来协调对共享资源的访问,以传达意图。
用户令牌是否始终仅在调用OpenProcessToken的进程中有效?是的,您收到的令牌句柄是进程句柄表的索引,它不能直接转移。您需要使用DuplicateHandle,这可能是您想要的,但可能会很混乱。
您希望找到获取用户令牌以将应用程序启动到用户(交互式?)会话的最佳方法。如果是这种情况,最好的方法是检索用户的会话令牌并使用它。您可以查看this article和示例代码,它位于C#中,但应该相对容易转换为您选择的语言。
编辑:已更新以包含Windows 2000.由于您在SYSTEM帐户下运行该服务,因此可以打开流程本身的句柄(如果需要,该流程可以发送其进程ID)。然后,它可以打开附加到该进程的令牌,复制它并使用生成的令牌启动(或重新启动)目标应用程序。