서비스 프로세스(세션0)에서 UI를 띄우거나 하기 위해서는 사용자 세션으로 프로세스를 띄워야 하는데 이때 각 세션의 사용자 프로세스(예를 들면 explorer.exe)에서 Token을 가져다가 CreateProcessAsUser 에 넘겨줍니다. 일반적으로 많이 쓰는 방법이고 지금까지 별 문제 없이 잘 쓰고 있었죠.
그런데 이상한 일이 벌어졌습니다.
분명히 SYSTEM 권한을 가진 프로세스인데 CreateProcessAsUser 에 실패하는 것이었죠.
상황은 다음과 같습니다.
Step 1. MyService.exe라는 서비스 권한 프로세스가 MyLauncher.exe라는 런쳐 프로세스를 시스템 권한으로 실행
Step 2. SYSTEM 권한으로 실행된 MyLauncher.exe 프로세스는 UI를 가진 프로세스인 MyUi.exe를 실행하기 위해 CreateProcessAsUser를 시도하지만 실패. 에러코드는 ERROR_ACCESS_DENIED (5)
정말 삽질 많이 했습니다.
프로세스에 Priviledge도 이것저것 넣어보고... UAC 문제도 체크해보고...
결국 확인된 문제는 Step 1 에서 MyService.exe가 MyLauncher.exe를 실행할 때 ShellExecuteEx를 사용했기 때문이었습니다. ShellExecute나 CreateProcess를 사용하면 문제가 생기지 않습니다.
결국 ShellExecuteEx 로 실행된 자식 프로세스는 SYSTEM권한을 가지고 있더라도 CreateProcessAsUser에 실패한다는 것입니다.
이 문제에 대해서는 구글이나 MSDN 을 통해서 관련 정보를 얻지 못했습니다. 말하자면... 그냥 현상이 저렇다는 거지 왜 저런 현상이 벌어지는지는 알수 없다는 거죠. ㅡ.ㅜ
'C++' 카테고리의 다른 글
CreateFile 시 DesiredAccess와 ShareMode의 관계 (2) | 2013.07.31 |
---|---|
파일이 수정 (삭제) 가능한 상태인지 체크하는 방법 (How to Determine a File is Writable or Deletable) (2) | 2013.07.18 |
DLL / LIB 에서의 함수 Export 시 Name Mangling (Decoration) 규칙 (0) | 2012.05.08 |
서비스를 svchost에 따로 실행하기 (0) | 2011.07.27 |
IP Help API Reference Page (0) | 2011.05.02 |