LogonUser - >来自系统服务的CreateProcessAsUser

jos*_*hk0 5 windows winapi windows-services createprocessasuser

我已经阅读了有关CreateProcessAsUser的Stack Overflow上的所有帖子,并且解决的问题很少,所以我不会屏住呼吸.但似乎我肯定错过了一些东西,所以它可能很容易.

目标操作系统是Windows XP.我有一个运行为"本地系统"的服务,我想从中创建一个以不同用户身份运行的进程.对于该用户,我有用户名和密码,因此LogonUser正常,我获得了用户的令牌(在这种情况下,是管理员帐户.)然后我尝试使用该令牌调用CreateProcessAsUser,但它失败,因为该令牌没有SeAssignPrimaryTokenPrivilege - 但是,它确实有SeIncreaseQuotaPrivilege.(我使用GetTokenInformation转储与该令牌关联的所有权限.)根据CreateProcessAsUser的MSDN页面,您需要两个权限才能成功调用CreateProcessAsUser.

它还说你不需要SeAssignPrimaryTokenPrivilege,如果传入CreateProcessAsUser()的令牌是"调用进程'主要令牌的受限版本",我可以用CreateRestrictedToken()创建它,但是它会与之关联本地系统用户而不是我正在尝试运行该进程的目标用户.

那么我如何创建一个登录令牌,它既是调用进程的主要令牌的受限版本,又与另一个用户相关联?谢谢!

请注意,这里不需要用户交互 - 它都是无人值守的 - 所以不需要像抓取WINSTA0等那样做.

And*_*ers 5

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

在这台 XP:SP2 机器上,只需调用 LogonUser(...,LOGON32_LOGON_INTERACTIVE,...)+CreateProcessAsUser 就可以正常工作,不会影响任何权限(使用假的 cmd.exe 服务,但这应该不重要)

MSDN 上的这段引用:

如果尚未启用必要的权限,CreateProcessAsUser 会在调用期间启用它们

事实上,您以 SYSTEM 身份运行并且应该能够启用任何权限,这让我相信这个分配主要内容不是问题。