0

我们有一个作为 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:

有什么技巧可以让 CreateProcessWithTokenW 工作吗?

4

1 回答 1

6

当调用 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 或者什么也不做,如果这个令牌已经来自交互式会话。

于 2016-07-18T17:18:48.283 回答