* 서비스 프로그램과 사용자 프로그램의 IPC
-> 서비스프로그램은 메모리에 write가능하다. 그런데 사용자는 접근을 못한다. -> 서비스가 일시적으로 권한을 떨어뜨려서 작성하자. -> 이걸 SD(Security Descriptor)를 수정해서 권한을 떨궈. 단 이것은 Admin그룹만 가능하게 해야한다. 그런데 만약 EVERYONE으로하면 뚫릴수 있다.
-> 이거는 소켓이 편한데 소켓을 못써먹을경우 천상 공유메모리를 사용하여야하는데...
-> 이벤트 누가받을수있어?를 고려해야한다.
*권한먹기용 SD예제
SetSampleServiceStatus(SERVICE_START_PENDING, NO_ERROR, 0);
SECURITY_ATTRIBUTES SA = {0};
SA.bInheritHandle = FALSE;
SA.lpSecurityDescriptor = NULL;
SA.nLength = sizeof(SA);
//시스템 그룹에 속한 객체를 인증된 사용자들이 접근할 수 있는 SD를 생성
::ConvertStringSecurityDescriptorToSecurityDescriptor(
_T("O:SYG:AUD:(A;OICI;GA;;;WD)(A;OICI;GA;;;AU)"),
SDDL_REVISION_1,
&SA.lpSecurityDescriptor,
NULL);
//SERVICE_START_PENDING : 서비스 시작 중임.
//종료이벤트 설정 - 이건 에러가 나면 안된다.
g_hEventExit = ::CreateEvent(&SA,FALSE,FALSE,EXIT_EVENT);
if(g_hEventExit == NULL){ //문제생김
LogPrint( _T("Failed to create Exit event"),EVENTLOG_ERROR_TYPE);
::LocalFree((HLOCAL)SA.lpSecurityDescriptor);
return;
}
::LocalFree((HLOCAL)SA.lpSecurityDescriptor);
*엔지니어는 실력으로 이야기한다. 그리고 원하는것을 제대로 만들어야한다. 내가 가는길을 잘 선택해야한다. 원칙과 소신대로 가야한다.
*만약 업데이트를 해야한다. -> 서비스프로세스에서 시작하자. 실행을 Admin그룹으로 떨어트려 시작하자. (세션을 고려하자).
*세션아이디를 알아냈다 -> 해당 세션으로 메시지를 띄울 수 있다. 근데 서비스랑 통신하기에는 골치아프다.
댓글