Winapi CreateProcessAsUser工作,CreateProcessWithTokenW不工作

Winapi CreateProcessAsUser工作,CreateProcessWithTokenW不工作,winapi,createprocessasuser,Winapi,Createprocessasuser,我们有一个作为LocalSystem运行的服务。我们使用CreateProcessAsUser和LoadUserProfile作为特定用户启动一个工作应用程序。很好用。但是,如果我们尝试使用CreateProcessWithTokenW来避免显式加载和管理用户配置文件,则会失败,并在事件日志中记录以下内容: Faulting application name: SomeApp.exe, version: 1.0.0.0, time stamp: 0x578a7819 Faulting modul

我们有一个作为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时-系统对ncalrpc:[SECLOGON]进行RPC调用,并在某个svchost的上下文中实际完成主任务。调用seclogon.dll中的SeclCreateProcessWithLogonW。下面是此函数调用的过程:

内部调用,但在此之前-您可以查看call-SetTokenInformation(…TokenSessionId…)-因此为令牌分配了另一个sessionid(请阅读MSDN中对此的注释-进程在令牌中指定的会话中运行。默认情况下,这与调用LogonUser的会话相同。要更改会话,请使用SetTokenInformation函数。)这是哪一个会话ID?这是您的服务-查找呼叫。但我们确实需要令牌中的交互式会话ID,而不是来自服务。因此,我的结论是-CreateProcessWithTokenW不适用于execinteractive来自服务的进程

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


CreateProcessWithTokenW-CreateProcessAsUserW周围的外壳非常厚。CreateProcessAsUserW需要SE_ASSIGNPRIMARYTOKEN_权限,但CreateProcessWithTokenW-不需要。因此CreateProcessWithTokenW使用远程调用seclogon服务(具有SE_ASSIGNPRIMARYTOKEN_权限)用于在内部调用CreateProcessAsUserW。但是如果我们拥有SE_ASSIGNPRIMARYTOKEN_特权-最好直接调用CreateProcessAsUserW。CreateProcessWithTokenW的主要限制是,他基于调用方进程SessionId在token中设置SessionId,我们无法更改。但是CreateProcessAsUserW没有修改token中的SessionId-因此我们可以n通过在令牌中自行设置交互式会话ID或不执行任何操作,前提是此令牌已来自交互式会话。如果我们从服务中调用CreateProcessWithTokenW,则启动的应用程序将在nointeractive窗口站(属于会话0)上运行。

调用CreateProcessWithTokenW时,系统将RPC调用ncalrpc:[SECLOGON]实际上,主任务是在从seclogon.dll调用的某个svchost.seclCreateProcessWithLogonNW的上下文中完成的。下面是此函数调用的过程:

内部调用,但在此之前-您可以查看call-SetTokenInformation(…TokenSessionId…)-因此为令牌分配了另一个sessionid(请阅读MSDN中对此的注释-进程在令牌中指定的会话中运行。默认情况下,这与调用LogonUser的会话相同。要更改会话,请使用SetTokenInformation函数。)这是哪一个会话ID?这是您的服务-查找呼叫。但我们确实需要令牌中的交互式会话ID,而不是来自服务。因此,我的结论是-CreateProcessWithTokenW不适用于execinteractive来自服务的进程

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


CreateProcessWithTokenW-CreateProcessAsUserW周围的外壳非常厚。CreateProcessAsUserW需要SE_ASSIGNPRIMARYTOKEN_权限,但CreateProcessWithTokenW-不需要。因此CreateProcessWithTokenW使用远程调用seclogon服务(具有SE_ASSIGNPRIMARYTOKEN_权限)用于在内部调用CreateProcessAsUserW。但是如果我们拥有SE_ASSIGNPRIMARYTOKEN_特权-最好直接调用CreateProcessAsUserW。CreateProcessWithTokenW的主要限制是,他基于调用方进程SessionId在token中设置SessionId,我们无法更改。但是CreateProcessAsUserW没有修改token中的SessionId-因此我们可以n通过在令牌中自行设置交互式会话ID或不执行任何操作,如果此令牌已来自交互式会话。如果我们从服务调用CreateProcessWithTokenW,则启动的应用程序将在非交互式窗口站(属于会话0)上运行

您想要什么?根据您的信息,不可能给出答案。您需要粘贴一些代码或使用调试器查看错误所在的位置我希望CreateProcessWithTokenW在CreateProcessAsUser所在的位置成功。当我们看不到您的代码时,无法告诉您为什么您的代码不起作用。请参阅,然后回答您的问题,以包括最可能的原因:根据文档,CreateProcessAsUser(默认情况下)将基于用户令牌创建具有适当权限的新窗口站和桌面。CreateProcessWithTokenW的文档没有提到这一点,因此您可能需要自己创建。(假设这就是问题所在,使用CreateProcessAsUser可能会更容易。)@Harry Jonston,这也许可以解释。你想要什么?根据你的信息,不可能给出答案。你需要粘贴一些代码或使用调试器查看错误的位置。我希望CreateProcessWithTokenW在CreateProcessAsUser的位置成功。当我们看不到你的代码时,无法告诉你为什么你的代码不工作。请参阅,然后回答你的问题to包括一个。最可能的原因:根据文档,CreateProcessAsUser(默认情况下)将基于用户令牌以适当的权限创建一个新的窗口站和桌面。CreateProcessWithTokenW的文档没有提到这一点,因此您可能需要自己来做。(假设这就是问题所在,使用CreateProcessAsUser可能会更容易。)@Harry Jonston,这也许可以解释。你的trace没有提到CreateProcessWithTokenW。而是关于CreateProcessWithLogonW。@AlexI没有,CreateProcessWithTokenW和CreateProcessWithLogonW都调用CreateProcessWithLogonCommonW-我没有mistake@AlexI-look-BOOL WINAPI CreateProcessWithLogonCommonW(uuu在句柄hToken中,uuu在LPCWSTR lpUsername中,uuu在LPCWSTR lpDomain中,uu在LPCWSTR lpPassword中,uu在DWORD dwLogonFlags中,uuu在LPCWSTR lpApplicationName中,u在LPCWSTR inout中,u opt LPWST