Вводная: ОС - WinXP. Есть 2 учетные записи с правами админа S1 и S2 .
User S1 запускает свою прогу ,которая создает Еvent "ReadyS2" и ждет сброса этого Еventa:
...
// создаем объект синхронизации "событие готовности userа S2"
hEvtReadyS2 = CreateEvent(&sa, FALSE, FALSE,"ReadyS2");
// Ждем сигнала готовности от S2
WaitForSingleObject(hEvtReadyS2, INFINITE);
...
Затем User S1 прерывает сеанс (используя быстрое переключение пользователей ,т.е. S1.EXE продолжает выполняться,ожидая сброса Eventa "ReadyS2") .
Далее логиниться user S2 . S2 запускает свою прогу S2.EXE ,которая должна открыть Еvent "ReadyS2" и установить его:
...
// открываем объект синхронизации "событие готовности S2"
hEvtReadyS2 = OpenEvent(MAXIMUM_ALLOWED, FALSE,"ReadyS2");
PulseEvent(hEvtReadyS2);
...
Проблема: S2.exe не может открыть Event "ReadyS2". Возвращает ошибку INVALID_FUNCTION(errorcode 2) , хотя в крайнем
случае должна вернуть ошибку о том,что доступ запрещен,- т.е. S2.exe вообще не видит этого Eventa, хотя
объекты ядра на локальной машине однозначно идентифицируются именем.
Вопрос: атрибуты защиты для Eventa "ReadyS2" в S1.exe формируются след. образом:
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.bInheritHandle = FALSE;
sa.lpSecurityDescriptor = malloc(sizeof(SECURITY_DESCRIPTOR));
InitializeSecurityDescriptor(sa.lpSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(sa.lpSecurityDescriptor,
TRUE, // Мы хотим установить параметры доступа
NULL, // NULL означает, что доступно для всех
FALSE // FALSE означает, что это не дефолтное значение));
Может я неправильно формирую SecurityDescriptor или дело в другом?Подскажите пожалуйста ,как правильно
сформировать SecurityDescriptor с полным доступом для всех(Everyone) для объекта ядра,чтобы заработало? Пробовал
много вариантов инициализации SecurityDescriptora --- не работает!