我们有一个以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有效吗?
答案 0 :(得分:3)
当CreateProcessWithTokenW被调用时 - 系统对ncalrpc进行RPC调用:[SECLOGON]并且实际上在一些svchost的上下文中完成了主要任务。来自seclogon.dll的SeclCreateProcessWithLogonW调用。这里有函数调用:
内部CreateProcessAsUserW被调用,但在此之前 - 你可以查看调用 - SetTokenInformation(.. TokenSessionId ..) - 所以另一个sessionid分配给令牌(在MSDN中读取关于此的评论 - 该过程运行在令牌中指定的会话中。默认情况下,这是与LogonUser相同的会话。要更改会话,请使用SetTokenInformation函数。)这是SessionId吗?这是您的服务 - 寻找电话ProcessIdToSessionIdStub。但我们确实需要在令牌中使用交互式SessionId,而不是来自服务。所以我的结论 - CreateProcessWithTokenW不适合来自服务的exec 交互式流程
----------编辑----------------------
CreateProcessWithTokenW - CreateProcessAsUserW周围非常厚的shell。 CreateProcessAsUserW需要SE_ASSIGNPRIMARYTOKEN_PRIVILEGE,但CreateProcessWithTokenW - 不需要。因此,CreateProcessWithTokenW使用seclogon服务(具有SE_ASSIGNPRIMARYTOKEN_PRIVILEGE)远程调用内部调用CreateProcessAsUserW。但如果我们有SE_ASSIGNPRIMARYTOKEN_PRIVILEGE - 更好的直接调用CreateProcessAsUserW by self。 CreateProcessWithTokenW的主要限制是他在令牌中设置了SessionId,基于调用者进程SessionId而我们无法改变这一点。但是CreateProcessAsUserW不会在令牌中修改SessionId - 所以我们可以通过在令牌中自行设置交互式SessionId或者什么也不做,如果此令牌已经来自交互式会话。如果我们从服务调用CreateProcessWithTokenW - 启动应用程序将在nointeractive窗口站上运行(属于会话0)