我正在尝试使用 CreateProcessAsUser 函数从我的服务中以其他用户身份运行进程。代码示例在CreateProcessAsUser from c++ service created 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 启动它。我尝试了很多来自互联网的解决方案(添加 CREATE_BREAKAWAY_FROM_JOB,使用 DuplicateTokenEx,使用linkedToken,启用所有可能的权限等等),但没有解决方案有帮助。我不希望服务进程和子进程之间有任何区别。但看起来有些不同,我找不到它是什么。
任何人都可以建议,主服务器进程和它的子进程有什么区别?