본문 바로가기
Programming/Tips(C++,C#)

0123 - 서비스 프로그래밍(3) and 사용자 세션관리

by 곰네Zip 2009. 1. 23.

* 서비스 프로그램과 사용자 프로그램의 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그룹으로 떨어트려 시작하자. (세션을 고려하자).
 
*세션아이디를 알아냈다 -> 해당 세션으로 메시지를 띄울 수 있다. 근데 서비스랑 통신하기에는 골치아프다.


반응형

댓글