Как добавить синхронизацию прямо в строку SDDL для CreateEvent

Моя служба Windows создает 2 события с помощью CreateEvent для связи с пользовательским приложением. Служба и пользовательское приложение не работают под одной и той же учетной записью пользователя. Пользовательское приложение открывает событие и устанавливает для него сигнал без ошибок. Но событие так и не было получено службой. Другое событие работает в противоположном направлении. Поэтому я думаю, что события пропускают правильную синхронизацию.

Обслуживание:

SECURITY_ATTRIBUTES security;
ZeroMemory(&security, sizeof(security));
security.nLength = sizeof(security);
ConvertStringSecurityDescriptorToSecurityDescriptor(L"D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GWGR;;;IU)", SDDL_REVISION_1, &security.lpSecurityDescriptor, NULL);
EvtCreateNewUserSession = CreateEventW( 
            &security,       // security attributes
            TRUE,       // manual-reset event
            FALSE,      // initial state is not signaled
            L"Global\\MyEvent"      // object name 
            );

Интерактивное приложение:

HANDLE EvtCreateNewUserSession = OpenEventW( 
EVENT_MODIFY_STATE | SYNCHRONIZE,       // default security attributes
FALSE,      // initial state is not signaled
L"Global\\MyEvent"      // object name 
;

Спасибо за вашу помощь,

Оливье


person Olivier    schedule 27.09.2013    source источник


Ответы (1)


Вместо использования «строковых прав SDDL» (например, GA) используйте формат 0xXXXXXXXXX (вы можете комбинировать флаги, а затем преобразовывать их в шестнадцатеричную строку).

Например, этот SDDL: D:(A;;0x001F0003;;;BA)(A;;0x00100002;;;AU) создает DACL для:

- BA=Administrators, 0x001F0003=EVENT_ALL_ACCESS (LocalSystem and LocalService are in Administrators group, but NetworkService is not)
- AU=Authenticated Users, 0x00100002=SYNCHRONIZE | EVENT_MODIFY_STATE

http://msdn.microsoft.com/en-us/library/windows/desktop/aa374928(v=vs.85).aspx — поле rights

A string that indicates the access rights controlled by the ACE.
This string can be a hexadecimal string representation of the access rights, 
such as "0x7800003F", or it can be a concatenation of the following strings. 
...
person Krystian Bigaj    schedule 22.10.2013
comment
Да, ты прав. Поскольку право на синхронизацию не существует в виде строки SDDL, единственным решением является использование глобальной шестнадцатеричной строки. - person Olivier; 26.10.2013