2009-08-15 4 views
1

A partir d'un service Windows s'exécutant sur un serveur Terminal Server (dans un espace global), nous aimerions pouvoir démarrer un processus exécutant une application Windows dans les sessions Terminal Server d'un utilisateur spécifique.Sur Terminal Server, comment un service démarre un processus dans la session d'un utilisateur?

Comment va-t-on faire cela?

Scenerio: le service Windows démarre au démarrage. Une fois que l'utilisateur s'est connecté à une session utilisateur Terminal Server, en fonction de certains critères connus uniquement du service Windows, le service Windows souhaite démarrer un processus dans la session de l'utilisateur exécutant une application Windows.

Un exemple: Nous souhaitons afficher un avertissement 'Arrêt en 5 minutes' aux utilisateurs. Le service Windows détectera cette condition et démarrera un processus dans chaque session utilisateur qui démarre l'application Windows qui affiche l'avertissement. Et, oui, je sais qu'il existe d'autres façons d'afficher une boîte de dialogue d'avertissement, c'est l'exemple, ce que nous voulons faire est beaucoup plus envahissant.

Répondre

5

Vous pouvez utiliser CreateProcessAsUser pour cela, mais cela demande un peu d'effort. Je crois que les étapes suivantes sont la procédure obligatoire de base:

Vous devez également vous assurer de nettoyer toutes les poignées, jetons, etc. appropriés après avoir lancé le processus.

+1

Sachez que cela nécessite des privilèges importants, à savoir le privilège TCB. – Michael

+0

Probablement, ça va aller, puisque l'affiche va le faire à partir d'un service Windows. La plupart des services sont exécutés avec des privilèges importants ... –

+1

Non - La plupart des services sur ma machine s'exécutent en tant que LocalService et non en tant que LocalSystem. – Michael

0

Réponse tardive mais dans la réponse ci-dessus DuplicateToken n'est pas nécessaire car WTSQueryUserToken renvoie déjà un jeton principal.

+1

Aurait été mieux comme un commentaire à la réponse de Reed. – dotalchemy

1

Vraiment réponse en retard, mais peut-être que quelqu'un trouvera cela utile.

Vous pouvez utiliser PsExec pour lancer une application sur un serveur distant (ou local) à l'intérieur d'une session spécifiée en utilisant la commande suivante:

psexec \\ COMPUTER_NAME -i SESSION_ID APPLICATION_NAME

SESSION_ID indique l'ID de session dans lequel lancer l'application.

Vous devez savoir quelles sessions sont actives sur le serveur et quel ID de session correspond à la connexion de l'utilisateur. Le thread suivant fournit un exemple de code sympa pour ce problème: How do you retrieve a list of logged-in/connected users in .NET?

Questions connexes