【问题标题】:How do I get a valid user token for CreateProcessAsUser?如何获取 CreateProcessAsUser 的有效用户令牌?
【发布时间】:2010-10-18 00:41:24
【问题描述】:

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

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

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

【问题讨论】:

    标签: windows-services token createprocessasuser


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 1.可能看起来像一个设计缺陷。问题是,服务可能想要升级应用程序:它甚至可能不是应该启动的同一个应用程序。 2.同意,是的。我将尝试创建一个新令牌。 3.必须在2000年工作,忘了说...
    • 为什么服务不只是调用 OpenProcessToken 和 DuplicateTokenEx 本身,而不是让进程向服务发送一些东西?
    • 在这种情况下,创建的进程不会作为本地系统运行吗?如果我这样做,我可能会调用 CreateProcess 而根本不用理会用户令牌。
    • 刚刚看到编辑。这似乎是个好主意。一旦我从头开始创建令牌失败,我会尝试:)
    猜你喜欢
    • 2018-03-05
    • 2018-01-14
    • 2020-07-25
    • 2014-05-05
    • 2019-04-07
    • 1970-01-01
    • 2012-11-13
    • 2011-12-12
    • 2020-07-12
    相关资源
    最近更新 更多