我试图理解标题中指定的 2 个 API 调用之间的“差异”。
当我试图搞乱自己的函数时,我注意到的唯一明显的区别是 CreateProcessWithTokenW()
函数将进程添加到一个孤立的作业中,其中
CreateProcessAsUserA()
的进程加入了一个由他的 parnet 进程组成的大组,由 CreateProcessWithTokenW()
和其他人创建的过程。此外,与无需额外权限即可运行的 CreateProcessAsUserA()
功能相比,CreateProcessWithTokenW()
需要额外的权限才能成功,根据 MSDN 文档,https://learn.microsoft.com/en-us/ 中指定了所需的权限windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessasusera是:
CreateProcessWithToken 可以加载用户配置文件并为您处理 winsta0 窗口站和桌面。我相信 CreateProcessWithToken 需要运行辅助登录服务。
它们需要不同的令牌权限,因此如果第一个函数失败,您可能应该回退到另一个函数......
CreateProcessAsUser
和
CreateProcessWithTokenW
时,需要记住两个主要区别:所需权限:
CreateProcessAsUser
: 此功能需要
SeAssignPrimaryTokenPrivilege
(通常称为“替换进程级别令牌”权限)才能在不同的用户帐户下成功创建新进程。默认情况下,此权限不会授予标准用户甚至许多管理用户。通常,服务帐户(例如 LocalService、NetworkService 或 SYSTEM)可以随时使用它。要从普通用户上下文使用此 API,您必须显式授予并启用此权限,然后注销并重新登录,以便该权限可以在您的令牌中生效。CreateProcessWithTokenW
: 该函数不需要您拥有AssignPrimaryToken权限。相反,它依赖辅助登录 (seclogon) 服务来处理必要的操作。如果该服务正在运行,API 可以使用提供的令牌创建新进程,而无需
CreateProcessAsUser
所需的特殊权限。环境和进程隔离详情:
CreateProcessAsUser
: 该函数与内核级调用更直接地交互,并且本质上不会将新进程隔离到其自己的工作中。新流程通常被视为父“组”的一部分,除非您手动将其分配给作业或修改其他属性。虽然它提供了更直接的控制,但您还承担更多责任来确保正确设置环境变量、用户配置文件和其他详细信息。
CreateProcessWithTokenW
: 在内部,CreateProcessWithTokenW 使用辅助登录服务来创建进程,并且在某些情况下观察到,这可能会导致进程被放置到隔离的作业中。它通常在幕后执行更多的“繁重工作”,处理用户配置文件加载和环境设置等方面。因此,以这种方式启动的进程可能会出现在单独的作业或分组中,从而使其运行时环境与
CreateProcessAsUser
创建的进程相比更加“独立”。总结:
CreateProcessAsUser
SeAssignPrimaryTokenPrivilege
),没有固有的服务依赖性。提供更直接、低级的控制,但也更复杂。CreateProcessWithTokenW