서비스 프로세스(세션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 을 통해서 관련 정보를 얻지 못했습니다. 말하자면... 그냥 현상이 저렇다는 거지 왜 저런 현상이 벌어지는지는 알수 없다는 거죠. ㅡ.ㅜ


Posted by kuaaan
,


사랑합니다. 편안히 잠드소서