2013-09-27 10 views
3

내 Windows 서비스는 사용자 앱과의 통신을 위해 CreateEvent로 2 개의 이벤트를 만듭니다. 서비스와 사용자 응용 프로그램이 동일한 사용자 계정으로 실행되고 있지 않습니다. 사용자 앱은 이벤트를 열고 오류없이 신호를 보내도록 설정합니다. 그러나 이벤트는 결코 서비스에 의해 수신되지 않습니다. 다른 이벤트는 반대 방향으로 작동합니다. 그래서 나는 이벤트가 동기화를 놓친다 고 생각합니다.CreateEvent에 대한 SDDL 문자열에 동기화 권한을 추가하는 방법

서비스 :

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 
; 

감사합니다,

(GA 등) 올리비에

답변

3

대신 '문자열 SDDL 권리'를 사용하여 사용 0xXXXXXXXX 형식 (플래그를 결합한 다음 16 진수 문자열로 변환 할 수 있음)

예를 들어이 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. 
... 
+0

예, 당신 말이 맞아. syncronization 권한이 SDDL 문자열로 존재하지 않으므로 유일한 해결책은 전역 16 진 문자열을 사용하는 것입니다. – Olivier