【发布时间】:2020-01-11 16:31:57
【问题描述】:
我正在创建一个侦听端口的应用程序,当客户端发出请求时,它会使用 LogonUser,CreateProcessAsUser 与不同的用户生成一个新进程。
我已经使用 CreateEvent() 函数设置了 2 个事件,以向子进程发出 WSADuplicateSocket 已准备好通过内存映射文件将 SOCKADD_STORAGEW 结构传递给子进程的信号。
子进程中的 OpenEvent() 在从应用程序生成时不断失败,并出现错误 5(拒绝访问)。
如果我使用(shift + 右键单击,运行方式)手动运行子/客户端,则 OpenEvent 函数成功地设法打开事件。
该事件是在全局命名空间 (Global\myevent) 中创建的,出于测试目的,我创建了一个 null Dacl(我已使用 winobj 验证了该事件的权限)传递给 CreateEvent() 函数。
我看不出我缺少什么。
这里是相关代码sn-p:
服务器:
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() 生成的客户端
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;
}
感谢您的回复。
【问题讨论】:
-
minimal reproducible example 将有助于澄清您的要求。