为什么从服务子进程调用 CreateProcessAsUser 时失败并显示"Access denied"



我正在尝试使用CreateProcessAsUser函数以我的服务中的其他用户身份运行进程。代码示例可在此处找到 CreateProcessAsUser 来自 c++ 服务创建进程但没有控制台。 操作系统 - 视窗 10

当我在主服务进程中运行它时,我的代码工作正常。但是我需要从子服务进程运行相同的代码。在本例中,CreateProcessAsUser 返回 0 且 GetLastError = 5(Access Dennied(。

子服务进程由下一次调用创建

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,并且测试.exe也开始正常。

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

任何人都可以建议,主服务器进程和它的子进程有什么区别?

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

我在这里发布它:

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

WTSGetActiveConsoleSessionId(..

WTSQueryUserToken(...

CreateProcessAsUser(...CREATE_BREAKAWAY_FROM_JOB

在不创建重复句柄的情况下正常工作事件

相关内容

  • 没有找到相关文章

最新更新