【问题标题】:CreateProcessAsUser works, CreateProcessWithTokenW does notCreateProcessAsUser 有效, CreateProcessWithTokenW 无效
【发布时间】:2016-07-18 00:07:33
【问题描述】:

我们有一个作为 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 工作吗?

【问题讨论】:

  • 你想要什么?根据您的信息不可能给出答案。您需要粘贴一些代码或使用调试器查看错误的位置
  • 我希望 CreateProcessWithTokenW 在 CreateProcessAsUser 所做的工作中取得成功。
  • 当我们看不到您的代码时,无法告诉您为什么您的代码不起作用。请参阅 How to Ask 然后 edit 您的问题以包含 minimal reproducible example
  • 最可能的原因:根据文档,CreateProcessAsUser 将(默认情况下)根据用户令牌创建具有适当权限的新窗口站和桌面。 CreateProcessWithTokenW 的文档没有提到这一点,所以想必你需要自己做。 (假设这是问题所在,坚持使用 CreateProcessAsUser 可能会更容易。)
  • @Harry Jonston,这可以解释它。

标签: winapi createprocessasuser


【解决方案1】:

当调用 CreateProcessWithTokenW 时 - 系统对 ncalrpc:[SECLOGON] 进行 RPC 调用,实际上主要任务是在某些 svchost 的上下文中完成的。从 seclogon.dll 调用 SeclCreateProcessWithLogonW。这里函数调用的trase:

在内部调用了CreateProcessAsUserW,但在此之前-您可以查看调用-SetTokenInformation(..TokenSessionId..)-因此分配给令牌的另一个会话ID(在MSDN中阅读有关此的评论-该过程在令牌中指定的会话。默认情况下,这与调用 LogonUser 的会话相同。要更改会话,请使用 SetTokenInformation 函数。) 这个 SessionId 是什么?这是您的服务 - 寻找电话ProcessIdToSessionIdStub。但我们确实需要在令牌中拥有交互式 SessionId,而不是来自服务。所以我的结论 - CreateProcessWithTokenW 不适合从服务执行 interactive 进程

--------- 编辑 ----------

CreateProcessWithTokenW - CreateProcessAsUserW 周围的外壳非常厚。 CreateProcessAsUserW 需要 SE_ASSIGNPRIMARYTOKEN_PRIVILEGE,但 CreateProcessWithTokenW - 不需要。因此,CreateProcessWithTokenW 使用远程调用 seclogon 服务(具有 SE_ASSIGNPRIMARYTOKEN_PRIVILEGE)在内部调用 CreateProcessAsUserW。但是如果我们有 SE_ASSIGNPRIMARYTOKEN_PRIVILEGE - 最好自己直接调用 CreateProcessAsUserW。 CreateProcessWithTokenW 的主要限制是他在令牌中设置 SessionId,基于调用者进程 SessionId,我们无法更改这一点。但是 CreateProcessAsUserW 不会修改令牌中的 SessionId - 因此我们可以通过自己在令牌中设置交互式 SessionId 或什么也不做,如果此令牌已经来自交互式会话。如果我们从服务调用 CreateProcessWithTokenW - 启动的应用程序将在非交互式窗口站上运行(属于会话 0)

【讨论】:

  • 您的跟踪没有提及 CreateProcessWithTokenW。相反,它是关于 CreateProcessWithLogonW。
  • @AlexI 不,CreateProcessWithTokenW 和 CreateProcessWithLogonW 都调用 CreateProcessWithLogonCommonW - 我没记错
  • @AlexI - 看看 - i.imgur.com/V51b0vx.png BOOL WINAPI CreateProcessWithLogonCommonW( __in HANDLE hToken, __in LPCWSTR lpUsername, __in_opt LPCWSTR lpDomain, __in LPCWSTR lpPassword, __in DWORD dwLogonFlags, __in_opt LPCWSTR lpApplicationName, __inout_ dwCreationFlags, __in_opt LPVOID lpEnvironment, __in_opt LPCWSTR lpCurrentDirectory, __in LPSTARTUPINFOW lpStartupInfo, __out LPPROCESS_INFORMATION lpProcessInfo);
  • 我不认为 OP 试图让新进程对交互式用户可见。此外,CreateProcessWithTokenW 的文档非常清楚,新进程在提供的令牌指定的会话中结束,您确定这不是真的吗?你真的见过它把一个进程放入错误的会话中吗?
  • @HarryJohnston 1) 如果我们不需要可见进程 - CreateProcessWithTokenW 通常会正常工作 - 进程已启动并运行(在记事本上测试)。但是 - 最好直接使用 CreateProcessAsUserW 2) “你确定这不是真的吗?” - 是的 !!这适用于 CreateProcessAsUserW 但不适用于 CreateProcessWithTokenW - 不知道这是文档还是 Windows 错误
猜你喜欢
  • 2021-12-07
  • 2010-10-18
  • 2021-02-27
  • 2014-07-14
  • 2020-02-02
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多