我已经阅读了Stack Overflow上有关CreateProcessAsUser的所有帖子,并且解决的问题很少,因此我不停地思考这一问题。但似乎我肯定缺少某些东西,因此可能很容易。
目标操作系统是Windows XP。我有一个作为“本地系统”运行的服务,我想从中创建一个以其他用户身份运行的进程。对于该用户,我具有用户名和密码,因此LogonUser正常运行,并且获得了该用户的 token (在本例中为Administrator帐户)。然后,我尝试使用该 token 来调用CreateProcessAsUser,但由于该 token 而失败没有附带SeAssignPrimaryTokenPrivilege-但是,它确实具有SeIncreaseQuotaPrivilege。 (我使用GetTokenInformation来转储与该 token 关联的所有特权。)根据CreateProcessAsUser的MSDN页面,为了成功调用CreateProcessAsUser,您需要两个特权。
它还说,如果您传递给CreateProcessAsUser()的 token 是“调用进程的主 token 的受限版本”(我可以使用CreateRestrictedToken()创建),则不需要SeAssignPrimaryTokenPrivilege。我试图运行该进程的本地系统用户,而不是目标用户。
那么,如何创建登录 token ,该登录 token 既是调用过程的主 token 的受限版本,又与其他用户相关联?谢谢!
请注意,这里不需要用户交互-全部都是无人值守的-因此不需要做诸如抢夺WINSTA0之类的工作。
最佳答案
SE_ASSIGNPRIMARYTOKEN_NAME是可以使用OpenProcessToken/OpenThreadToken + LookupPrivilegeValue + AdjustTokenPrivileges在进程/线程中启用的特权(很容易将此与TOKEN_ASSIGN_PRIMARY混淆,MSDN表示您需要同时将主 token 附加到进程)
在此XP:SP2机器上,只需调用LogonUser(...,LOGON32_LOGON_INTERACTIVE,...)+ CreateProcessAsUser即可正常工作,而不会弄乱任何特权(使用伪造的cmd.exe服务,但这无关紧要)
MSDN上的这句话:
而且您正在以SYSTEM身份运行并且应该能够启用任何特权这一事实使我相信,分配主要内容不是问题。
关于windows - 系统服务中的LogonUser-> CreateProcessAsUser,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2967742/