Ale*_*x I 0 winapi createprocessasuser
我们有一个作为 LocalSystem 运行的服务。我们使用 CreateProcessAsUser 和 LoadUserProfile 以特定用户的身份启动工作应用程序。效果很好。但是如果我们尝试使用 CreateProcessWithTokenW 来避免显式加载和管理用户配置文件,则会失败,并且会在事件日志中记录以下内容:
Faulting application name: SomeApp.exe, version: 1.0.0.0, time stamp: 0x578a7819
Faulting module name: KERNELBASE.dll, version: 10.0.10586.494, time stamp: 0x5775e4c5
Exception code: 0xc06d007e
Fault offset: 0x0000000000071f28
Faulting process id: 0x24e4
Faulting application start time: 0x01d1df8d223316a6
Faulting application path: C:\SomePath\SomeApp.exe
Faulting module path: C:\Windows\system32\KERNELBASE.dll
Report Id: a2310c0d-7ddf-4241-92c9-de03e8de71e8
Faulting package full name:
Faulting package-relative application ID:
Run Code Online (Sandbox Code Playgroud)
有没有让 CreateProcessWithTokenW 工作的技巧?
当 CreateProcessWithTokenW 调用时 - 系统对 ncalrpc:[SECLOGON] 进行 RPC 调用,实际上主要任务是在某些 svchost 的上下文中完成的。来自 seclogon.dll 的 SeclCreateProcessWithLogonW 被调用。这里是这个函数调用的trase:

内部CreateProcessAsUserW调用,但在此之前 - 您可以查看调用 - SetTokenInformation(..TokenSessionId..) - 所以另一个 sessionid 分配给令牌(阅读 MSDN 中关于此的评论 -该进程在令牌中指定的会话中运行。默认情况下,这是调用 LogonUser 的同一个会话。要更改会话,请使用 SetTokenInformation 函数。)这是 SessionId ?这是您的服务 - 寻找呼叫ProcessIdToSessionIdStub。但我们确实需要令牌中的交互式 SessionId,而不是来自服务。所以我的结论 - CreateProcessWithTokenW 不适合从服务执行交互过程
- - - - - 编辑 - - - - - - - - - - -
CreateProcessWithTokenW - CreateProcessAsUserW 周围非常厚的外壳。CreateProcessAsUserW 需要 SE_ASSIGNPRIMARYTOKEN_PRIVILEGE,但 CreateProcessWithTokenW - 不需要。由于这个原因,CreateProcessWithTokenW 使用远程调用 seclogon 服务(具有 SE_ASSIGNPRIMARYTOKEN_PRIVILEGE)在内部调用 CreateProcessAsUserW。但如果我们有 SE_ASSIGNPRIMARYTOKEN_PRIVILEGE - 更好地直接调用 CreateProcessAsUserW 自己。CreateProcessWithTokenW 的主要限制是他在令牌中设置 SessionId,基于调用方进程 SessionId,我们无法更改这一点。但是 CreateProcessAsUserW 不会修改令牌中的 SessionId - 所以我们可以在令牌中自行设置交互式 SessionId 或者什么都不做,如果这个令牌已经来自交互式会话。