从服务子进程调用时,为什么CreateProcessAsUser失败并显示“访问被拒绝”

时间:2019-08-22 15:10:22

标签: windows-services createprocessasuser

我正在尝试使用CreateProcessAsUser函数从我的服务中以其他用户身份运行进程。在CreateProcessAsUser from c++ service creates process but no console处找到了代码示例。 操作系统-Windows 10

当我在主要服务流程中运行代码时,我的代码运行正常。但是我需要在子服务流程中运行相同的代码。在这种情况下,CreateProcessAsUser返回0,GetLastError = 5(拒绝访问)。

下一个呼叫创建了子服务流程

CreateProcess(NULL, "d:\\child.exe", NULL, NULL, FALSE, 0u, NULL, NULL, &si.StartupInfo, &pi)

我的代码正在“ child.exe”二进制文件中工作,应该再创建一个进程,以这种方式启动“ d:\ test.exe”二进制文件

CreateProcessAsUser(hUserTokenDup,
        NULL,
        "d:\\test.exe",
        NULL,
        NULL,
        FALSE,
        CREATE_NEW_CONSOLE | /*CREATE_BREAKAWAY_FROM_JOB |*/ NORMAL_PRIORITY_CLASS,
        NULL,
        NULL,
        &si,
        &pi);

为了进行测试,我将代码启动“ test.exe”启动到“ child.exe”正在启动(服务主进程)和“ test.exe”启动正常的地方。为了进行测试,我用相同的参数(用户令牌除外)替换了CreateProcess上的CreateProcessAsUser,并且test.exe也可以正常启动。

但是我需要从服务子进程(从“ child.exe”)启动“ test.exe”,并由CreateProcessAsUser启动它。我尝试了很多来自Internet的解决方案(添加CREATE_BREAKAWAY_FROM_JOB,使用DuplicateTokenEx,使用linkedToken,启用所有可能的特权等等),但是没有解决方案有帮助。我预计服务流程和子流程之间不会有任何区别。但是看起来有些不同,我找不到它。

有人可以提出建议,主服务器进程与其子进程之间有什么区别?

1 个答案:

答案 0 :(得分:0)

我的同事找到了解决方案。

我在这里公开了

在创建服务子进程之前,将标志JOB_OBJECT_LIMIT_BREAKAWAY_OK | JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK传递给服务器进程中的SetInformationJobObject函数之后,服务子进程可以启动子进程。在那之后

  

WTSGetActiveConsoleSessionId(..

     

WTSQueryUserToken(...

     

CreateProcessAsUser(... CREATE_BREAKAWAY_FROM_JOB

工作正常,无需创建重复句柄