2009-08-15 2 views
1

터미널 서버 (글로벌 공간)에서 실행되는 Windows 서비스에서 특정 사용자의 터미널 서버 세션에서 Windows 응용 프로그램을 실행하는 프로세스를 시작할 수 있기를 원합니다.터미널 서버에서 서비스가 사용자 세션에서 프로세스를 시작하는 방법은 무엇입니까?

어떻게하면됩니까?

Scenerio : Windows 서비스가 부팅 할 때 시작됩니다. 사용자가 Windows 서비스에만 알려진 일부 기준에 따라 터미널 서버 사용자 세션에 로그인하면 Windows 서비스는 Windows 응용 프로그램을 실행하는 사용자 세션에서 프로세스를 시작하려고합니다.

예 : 'Shutdown in 5 minutes (종료 5 분)'경고를 사용자에게 표시하려고합니다. Windows 서비스는이 조건을 감지하고 경고를 표시하는 Windows 응용 프로그램을 시작하는 각 사용자 세션에서 프로세스를 시작합니다. 그리고 예, 경고 대화 상자를 표시하는 다른 방법이 있다는 것을 알고 있습니다. 예를 들어, 우리가하고 싶은 것은 훨씬 더 침입 적입니다.

답변

5

CreateProcessAsUser를 사용하면이 작업을 수행 할 수 있지만 약간의 노력이 필요합니다. 다음 단계가 기본 필수 절차라고 생각합니다.

프로세스를 시작한 후에 적절한 핸들, 토큰 등을 모두 정리해야합니다.

+1

상당한 권한 (TCB 권한)이 필요합니다. – Michael

+0

포스터가 Windows 서비스에서이 작업을 수행 할 예정이므로 아마 괜찮을 것입니다. 대부분의 서비스는 상당한 권한으로 실행됩니다 ... –

+1

그렇지 않습니다 - 내 컴퓨터의 대부분의 서비스가 LocalService가 아닌 LocalService로 실행 중입니다. – Michael

0

답장을 보내지 만 위의 대답에서 WTSQueryUserToken은 이미 기본 토큰을 반환하므로 DuplicateToken은 필요하지 않습니다.

+1

리드 (Reed)의 대답에 대한 의견으로는 더 좋았을 것입니다. – dotalchemy

1

정말로 늦은 답변이지만 누군가 도움이 될 것입니다.

다음과 같은 명령을 사용하여 지정된 세션 내에서 원격 (또는 로컬) 서버에서 응용 프로그램을 시작 PsExec를 사용할 수 있습니다

psexec에 \\ COMPUTER_NAME -i SESSION_ID APPLICATION_NAME

을 여기서 SESSION_ID은 응용 프로그램을 시작할 세션 ID를 나타냅니다.

서버에서 어떤 세션이 활성화되어 있고 어떤 세션 ID가 어떤 사용자 로그인에 매핑되는지 알아야합니다. 다음 스레드는이 정확한 문제에 대한 좋은 코드 샘플을 제공합니다. How do you retrieve a list of logged-in/connected users in .NET?

관련 문제