5

我有一个以普通用户身份运行的应用程序和一个作为本地系统运行的服务。我希望应用程序能够告诉服务再次启动应用程序,一旦服务完成了其他一些事情。(所以应用程序不会在服务执行它的“事情”时运行。)为了让服务能够以第一次启动它的用户身份启动应用程序,它需要一个用户令牌。应用程序在退出之前将令牌发送到服务,但在服务尝试使用它时令牌/句柄无效。(它用它做的第一件事是 DuplicateTokenEx 获取主令牌。)

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

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

4

1 回答 1

3

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

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

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

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

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

于 2009-04-07T13:32:46.517 回答