CreateProcessAsUser和createevent权限

und3ath

我正在创建一个侦听端口的应用程序,当客户端发出请求时,它将使用LogonUser,CreateProcessAsUser与其他用户生成一个新进程。

我已经使用CreateEvent()函数设置了2个事件,以向子进程发出信号,通知WSADuplicateSocket准备通过内存映射文件将SOCKADD_STORAGEW结构传递给子进程。

从应用程序派生时,子进程中的OpenEvent()继续失败,错误5(访问被拒绝)。

如果我使用(Shift +右键单击,运行方式)手动运行子项/客户端,则OpenEvent函数将成功管理打开事件。

该事件是在全局名称空间(Global \ myevent)中创建的,并且出于测试目的,我创建了一个空的Dacl(我已使用winobj验证了对Event的权限)并传递给CreateEvent()函数。

我看不到我想念的东西。

这里是相关的代码片段:

服务器:

SECURITY_ATTRIBUTES sa;
CreateNullDacl(&sa);


if ((ghParentFileMappingEvent = CreateEvent(&sa, TRUE, FALSE, szParentEventName)) == NULL) {
    fprintf(stderr, "CreateEvent() failed: %d\n", GetLastError());
    return false;
}

if ((ghChildFileMappingEvent = CreateEvent(&sa, TRUE, FALSE, szChildEventName)) == NULL) {
    fprintf(stderr, "CreateEvent() failed: %d\n", GetLastError());
    CloseHandle(ghParentFileMappingEvent);
    return false;
}





PROCESS_INFORMATION pi = { 0 };
STARTUPINFO si = { 0 };
SECURITY_ATTRIBUTES procSa;
CreateNullDacl(&procSa);

HANDLE htok;
if (!LogonUser(chall->user, ".", chall->pass, LOGON32_LOGON_BATCH, LOGON32_PROVIDER_DEFAULT, &htok)) {
    fprintf(stderr, "LogonUser() failed: %d\n", GetLastError());
    return false;

}


if(CreateProcessAsUser(htok, 0, szChildComandLineBuf, &procSa, 0, FALSE, NULL, NULL, "C:\\Users\\ch99", &si, &pi)) {
 //... 
}

从CreateProcessAsUser()产生的CLient

 if ((ghParentFileMappingEvent = OpenEventA(SYNCHRONIZE, FALSE, szParentEventName)) == 0)  // return 5 , access denied
{
    fprintf(fp, "OpenParentEvent failed: %d\n", GetLastError());
    return INVALID_SOCKET;
}

if ((ghChildFileMappingEvent = OpenEventA(SYNCHRONIZE, FALSE, szChildEventName)) == 0) { // return 5 access denied
    fprintf(fp, "OpenChildEvent failed: %d\n", GetLastError());
    CloseHandle(ghParentFileMappingEvent);
    ghParentFileMappingEvent = NULL;
    return INVALID_SOCKET;
}

感谢您的回复。

und3ath

在尝试了很多不同的事情之后,CreateEvent()继续拒绝访问。

我发现了一个丑陋的解决方法:在传递给CreateEvent()的SECURITY_ATTRIBUTES中,我将bInheritHandle设置为TRUE,并将handle值传递给arguments中的子进程。

现在,我可以在handle上使用WaitForSingleObject()了。

我真的很想知道为什么它不如我的第一个问题中所述...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章