Я создаю приложение, которое прослушивает порт, и когда клиент делает запрос, он порождает новый процесс с другим пользователем, используя LogonUser, CreateProcessAsUser.
Я установил 2 события с помощью функции CreateEvent (), чтобы сообщить дочернему элементу, что WSADuplicateSocket готов передать структуру SOCKADD_STORAGEW дочернему процессу через файл отображения памяти.
OpenEvent () в дочернем процессе продолжает сбой с ошибкой 5 (доступ запрещен), когда он порождается из приложения.
Если я вручную запускаю дочерний процесс / клиент, используя (Shift + щелчок правой кнопкой мыши, запустить как), функция OpenEvent успешно удается открыть событие.
Событие создается в глобальном пространстве имен (Global \ myevent), и для целей тестирования я создал нулевой Dacl (я подтвердил разрешение на событие с winobj), переданный в функцию 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 ()
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;
}
Спасибо за ваш ответ.