5

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

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

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

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

请注意,这里不需要用户交互 - 都是无人值守的 - 所以不需要做诸如抓取 WINSTA0 之类的事情。

4

1 回答 1

4

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

在这台 XP:SP2 机器上,只需调用 LogonUser(...,LOGON32_LOGON_INTERACTIVE,...)+CreateProcessAsUser 就可以正常工作,而不会弄乱任何特权(使用假的 cmd.exe 服务,但这无关紧要)

MSDN 上的这句话:

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

并且您以 SYSTEM 身份运行并且应该能够启用任何特权的事实使我相信这个分配主要的东西不是问题。

于 2010-06-03T18:40:24.493 回答