On Terminal Server, how does a service start a process in a user's session?

旧街凉风 提交于 2020-01-16 05:14:29

问题


From a Windows Service running on a Terminal Server (in global space), we would like to be able to start up a process running a windows application in a specific user's Terminal Server sessions.

How does one go about doing this?

The Scenerio: the windows service starts at boot time. After the user has logged into a Terminal Server user session, based on some criteria known only to the windows service, the windows service wants to start a process in the user's session running a windows application.

An example: We would like to display a 'Shutdown in 5 minutes' warning to the users. The windows service would detect this condition, and start up a process in each user session that starts the windows app that displays the warning. And, yes, I know there are other ways of displaying a warning dialog, this is the example, what we want to do is much more invasive.


回答1:


You can use CreateProcessAsUser to do this - but it requires a bit of effort. I believe the following steps are the basic required procedure:

  • Get the user's session (WTSQuerySessionInformation).
  • Get a token for that user (WTSQueryUserToken).
  • Create a duplicate token for your use (DuplicateTokenEx).
  • Use the token to create an environment block (CreateEnvironmentBlock).
  • Launch the application with CreateProcessAsUser, using the block above.

You'll also want to make sure to clean up all of the appropriate handles, tokens, etc., after you've launched the process.




回答2:


Really late reply but maybe somebody will find this helpful.

You can use PsExec to launch an application on a remote (or local) server inside a specified session by using the following command:

psexec \\COMPUTER_NAME -i SESSION_ID APPLICATION_NAME

Where SESSION_ID indicates the session id in which to launch the application.

You will need to know what sessions are active on the server and which session id maps to which user login. The following thread provides a nice code sample for this exact problem: How do you retrieve a list of logged-in/connected users in .NET?




回答3:


Late reply but in the answer above DuplicateToken is not necessary since WTSQueryUserToken already returns a primary token.



来源:https://stackoverflow.com/questions/1280855/on-terminal-server-how-does-a-service-start-a-process-in-a-users-session

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!