LogonUser - >来自系统服务的CreateProcessAsUser

时间:2010-06-03 16:07:42

标签: windows winapi windows-services createprocessasuser

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

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

它还表示如果传入CreateProcessAsUser()的令牌是“调用进程'主要令牌的受限版本”,则不需要SeAssignPrimaryTokenPrivilege,我可以使用CreateRestrictedToken()创建它,但是它会与本地系统用户关联,而不是我正在尝试以该方式运行该过程的目标用户。

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

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

1 个答案:

答案 0 :(得分:4)

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

在这台XP:SP2机器上,只需调用LogonUser(...,LOGON32_LOGON_INTERACTIVE,...)+ CreateProcessAsUser就可以正常运行而不会弄乱任何权限(使用假的cmd.exe服务,但这不重要)< / p>

MSDN上的这句话:

  

如果没有必要的特权   已启用,CreateProcessAsUser   使他们在持续时间内   调用

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