CreateProcessAsUser() 与 CreateProcessWithTokenW() 之间的区别

问题描述 投票:0回答:2

我试图理解标题中指定的 2 个 API 调用之间的“差异”。 当我试图搞乱自己的函数时,我注意到的唯一明显的区别是 CreateProcessWithTokenW() 函数将进程添加到一个孤立的作业中,其中

CreateProcessAsUserA()
的进程加入了一个由他的 parnet 进程组成的大组,由
CreateProcessWithTokenW()
和其他人创建的过程。此外,与无需额外权限即可运行的
CreateProcessAsUserA()
功能相比,
CreateProcessWithTokenW()
需要额外的权限才能成功,根据 MSDN 文档,
https://learn.microsoft.com/en-us/ 中指定了所需的权限windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessasusera
是:

MSDN CreateProcessAsUserA()

c++ windows api winapi process
2个回答
0
投票

CreateProcessWithToken 可以加载用户配置文件并为您处理 winsta0 窗口站和桌面。我相信 CreateProcessWithToken 需要运行辅助登录服务。

它们需要不同的令牌权限,因此如果第一个函数失败,您可能应该回退到另一个函数......


0
投票
CreateProcessAsUser

CreateProcessWithTokenW
时,需要记住两个主要区别:
所需权限:

CreateProcessAsUser

: 此功能需要

SeAssignPrimaryTokenPrivilege
(通常称为“替换进程级别令牌”权限)才能在不同的用户帐户下成功创建新进程。默认情况下,此权限不会授予标准用户甚至许多管理用户。通常,服务帐户(例如 LocalService、NetworkService 或 SYSTEM)可以随时使用它。要从普通用户上下文使用此 API,您必须显式授予并启用此权限,然后注销并重新登录,以便该权限可以在您的令牌中生效。

CreateProcessWithTokenW

: 该函数不需要您拥有AssignPrimaryToken权限。相反,它依赖辅助登录 (seclogon) 服务来处理必要的操作。如果该服务正在运行,API 可以使用提供的令牌创建新进程,而无需

CreateProcessAsUser
所需的特殊权限。
环境和进程隔离详情:

CreateProcessAsUser

: 该函数与内核级调用更直接地交互,并且本质上不会将新进程隔离到其自己的工作中。新流程通常被视为父“组”的一部分,除非您手动将其分配给作业或修改其他属性。虽然它提供了更直接的控制,但您还承担更多责任来确保正确设置环境变量、用户配置文件和其他详细信息。

CreateProcessWithTokenW

: 在内部,CreateProcessWithTokenW 使用辅助登录服务来创建进程,并且在某些情况下观察到,这可能会导致进程被放置到隔离的作业中。它通常在幕后执行更多的“繁重工作”,处理用户配置文件加载和环境设置等方面。因此,以这种方式启动的进程可能会出现在单独的作业或分组中,从而使其运行时环境与

CreateProcessAsUser
创建的进程相比更加“独立”。
总结:

    CreateProcessAsUser
  • :直接内核调用,需要特殊权限(
    SeAssignPrimaryTokenPrivilege
    ),没有固有的服务依赖性。提供更直接、低级的控制,但也更复杂。
  • CreateProcessWithTokenW
  • :利用辅助登录服务,无需特殊权限。倾向于在稍微更受控制和隔离的环境中创建流程。更易于使用,但取决于该服务是否可用并正在运行。
    
    
  • 来源:
https://trainsec.net/library/understanding-the-differences- Between-createprocessasuser-and-createprocesswithtokenw-in-windows/

© www.soinside.com 2019 - 2024. All rights reserved.