LogonUser – > CreateProcessAsUser从系统服务

我已经阅读了关于CreateProcessAsUser堆栈溢出的所有post,并且解决了很less的问题,所以我并不屏住呼吸。 但是,似乎我肯定错过了一些东西,所以这可能很容易。

目标操作系统是Windows XP。 我有一个作为“本地系统”运行的服务,我想从中创build一个以不同用户身份运行的进程。 对于那个用户,我有用户名和密码,所以LogonUser会很好,我得到一个用户的令牌(在这种情况下,一个pipe理员帐户)。然后我尝试使用该令牌调用CreateProcessAsUser,但它失败,因为该令牌不带SeAssignPrimaryTokenPrivilege – 但是,它确实有SeIncreaseQuotaPrivilege。 (我使用GetTokenInformation转储与该令牌关联的所有特权。)根据CreateProcessAsUser的MSDN页面,您需要两个特权才能成功调用CreateProcessAsUser。

它还表示,如果您传递给CreateProcessAsUser()的令牌是“调用进程的主令牌的受限制版本”,则可以使用CreateRestrictedToken()创build它,但不需要SeAssignPrimaryTokenPrivilege,但是它将与本地系统用户,而不是目标用户我试图运行的过程。

那么,我将如何创build一个login标记,它既是调用进程的主标记的受限版本,又与不同的用户相关联? 谢谢!

请注意,在这里没有用户交互的需求 – 所有这些都是无人看pipe的 – 所以不需要像WINSTA0等等。

SE_ASSIGNPRIMARYTOKEN_NAME是您可以在您的流程/线程中使用OpenProcessToken / OpenThreadToken + LookupPrivilegeValue + AdjustTokenPrivileges启用的权限(很容易将此与TOKEN_ASSIGN_PRIMARY混淆,MSDN表示您需要将主令牌附加到进程)

在这个XP:SP2的机器上,只需调用LogonUser(…,LOGON32_LOGON_INTERACTIVE,…)+ CreateProcessAsUser就可以了,不会搞乱任何权限(使用伪造的cmd.exe服务,但这应该不重要)

MSDN上的这个引用:

如果所需的特权尚未启用,则CreateProcessAsUser会在调用期间启用它们

而且你以SYSTEM的身份运行,并且应该能够启用任何特权,这使我相信这个指定的主要东西不是问题。