C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[58732] Re:Re:[급 질문]서비스프로그램 에서 다른 프로그램 실행할때 폼이 않보여요 ...(방법 있군요)
아제나 [azena] 2168 읽음    2009-10-08 17:58
서비스의 UI 지원을 위하여 비스타 이상의 운영체제에서 에서 사용자 세션으로 관6리 프로세스를 여는 방법에 대한 상세한 설명이 첨부되어 있는 글이 있네요.

http://artwook.tistory.com/tag/CreateProcessAsUser

이 스레드에 도움이 될 것 같아서 남깁니다.
나중에 다시 제가 필요해서 찾아 볼 때도 유용하게 쓰일거 같아서요 ^^

링크가 깨질 것에 대비하여 일부 발췌

사용자 세션에서 UI 띄우기 

위에서 말했듯이, UI를 띄울 때에는 CreateProcessAsUser 함수로 사용자 세션에서 프로세스를 생성하길 권장한다. MSDN을 찾아보면, CreateProcessAsUser는 다음과 같은 신택스를 갖는다. 

BOOL CreateProcessAsUser( HANDLE hToken, LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation ); 첫번째 인자는 토큰의 HANDLE이며, 사용자를 알려주는 프라이머리 토큰이다. 여기서 나올 질문은 "사용자의 토큰을 어떻게 알아내지?"이다. LogonUser라는 다른 함수로 사용자의 토큰을 가져올 수 있다. 그러나, LogonUser 는 암호화되지 않은 사용자의 아이디와 암호를 인자로 넘겨야 쓸 수 있다. 이건 확실히 좋은 방법은 아니다. 

프라이머리 토큰을 얻을 때 다음 방법을 쓰길 제안한다. 

PROCESS_ALL_ACCESS로 OpenProcess를 호출하고, 사용자 프로세스 하나를 연다. 호출이 성공하면, 그 프로세스의 핸들을 반환한다. 
위에서 얻은 핸들로, desiredAccess를 TOKEN_ASSIGN_PRIMARY와 TOKEN_DUPLICATE로 하여 OpenProcessToken을 호출한다. 호출이 성공하면, 프로세스 토큰의 핸들을 반환한다. 
2에서 얻은 토큰 핸들을 사용하여, accessRights를 TOKEN_ASSIGN_PRIMARY와 TOKEN_ALL_ACCESS로 하여 DuplicateTokenEx를 호출한다. 토큰 타입은 TokenPrimary로 설정한다. 호출이 성공하면, 토큰의 핸들이 얻어지고, 이 토큰은 프라이머리 토큰으로 사용할 수 있다. 
CreateProcessAsUser 함수로 사용자 세션에서 응용 프로그램을 생성한다. 
각 동작에 대해 설명을 조금 더 덧붙여 본다. 

어떤 사용자가 시작한 모든 프로세스는 그 사용자의 토큰을 가지고 있다. 이는 특정 프로세스에서 프로세스를 실행한 사용자를 찾을 수 있기 위함이다. 
OpenProcessToken 은 프라이머리 토큰을 요구하는 함수에선 쓰일 수 없는 임퍼스네이티드 토큰(impersonated token, 자격변경 토큰)을 반환한다. 
위에서 설명한 2단계에서, 임퍼스네이티드 토큰을 프라이머리 토큰으로 바꿔야 한다. 이를 위해 DuplicateTokenEx 함수를 사용한다. 
임퍼스네이티드 토큰을 프라이머리 토큰으로 일단 변경한 후에는 이 토큰을 프라이머리 토큰을 필요로하는 함수를 사용할 수 있다. 
토큰을 사용한 후에는, CloseHandle로 토큰을 닫아줘야 한다. 



둘리 님이 쓰신 글 :
: 이런 방법이 있군요...
: 서비스 실행에 속성을 정하는군요..
: 서비시 관리자(SCM)  창에서요..
: 해당 서비스 더블클릭하면 창나오죠(특성창)
:
: 거기에 로그온 텝이 있어요..
: 거기서
: 로컬시스템 계정이 체크 되어 있죠?
: 그밑에  서비스와 데스크톱 상호 작용 허용을 체크 하세요.
: 그리고 해보세요..
: 그러니까..
: 노트패드 띄워 지는군요..
:
: 의미적으로 Desktop 이 있어야 된다는 것이군요..
:
:
:
:
: 발코딩 님이 쓰신 글 :
: : 답변이 없으셔서 다시 올립니다.
: : 서비스프로그램에서 다른 프로그램 예를들어 노트패드라던지...
: : 실행시키면 shellexcute 또는 CreateProcess 로 시켰는데 폼이 않보이는데 이유가 뭘까요?
: : 실행시킬때 SW_SHOW, SW_SHOWDEFAULT 등등 다 해봤는데
: : 작업관리자에 프로세스에는 실행이 되어 있는걸로 나오는데 폼이 안보이네요..
: : 어떻게 폼을 보이게 할수 있는 방법이 없을까요?

+ -

관련 글 리스트
44690 [급 질문]서비스프로그램 에서 다른 프로그램 실행할때 폼이 않보여요 ... 발코딩 1035 2006/05/02
44693     Re:[급 질문]서비스프로그램 에서 다른 프로그램 실행할때 폼이 않보여요 ...(방법 있군요) 둘리 1662 2006/05/02
58732         Re:Re:[급 질문]서비스프로그램 에서 다른 프로그램 실행할때 폼이 않보여요 ...(방법 있군요) 아제나 2168 2009/10/08
44691     Re:[급 질문]서비스프로그램 에서 다른 프로그램 실행할때 폼이 않보여요 ... 둘리 1907 2006/05/02
44695         Re:Re:답변 감사 드립니다 ^^ (냉무) 발코딩 1000 2006/05/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.