我正在创建一个侦听端口的应用程序,当客户端发出请求时,它将使用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,szChildEventName)) == NULL) {
fprintf(stderr,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,szChildComandLineBuf,&procSa,NULL,"C:\\Users\\ch99",&si,&pi)) {
//...
}
从CreateProcessAsUser()产生的客户端
if ((ghParentFileMappingEvent = OpenEventA(SYNCHRONIZE,szParentEventName)) == 0) // return 5,access denied
{
fprintf(fp,"OpenParentEvent failed: %d\n",GetLastError());
return INVALID_SOCKET;
}
if ((ghChildFileMappingEvent = OpenEventA(SYNCHRONIZE,szChildEventName)) == 0) { // return 5 access denied
fprintf(fp,"OpenChildEvent failed: %d\n",GetLastError());
CloseHandle(ghParentFileMappingEvent);
ghParentFileMappingEvent = NULL;
return INVALID_SOCKET;
}
感谢您的回复。