2009-04-07 60 views
5

J'ai une application qui s'exécute en tant qu'utilisateur normal et un service s'exécutant en tant que système local. Je souhaite que l'application puisse indiquer au service de redémarrer l'application, une fois que le service a effectué d'autres tâches. (Ainsi, l'application ne s'exécutera pas tant que le service effectuera son «truc».) Pour que le service puisse démarrer l'application en tant qu'utilisateur qui l'a démarré, il a besoin d'un jeton utilisateur. L'application envoie le jeton au service avant qu'il ne se ferme, mais le jeton/handle n'est pas valide lorsque le service tente de l'utiliser. (La première chose à faire est avec DuplicateTokenEx pour obtenir un jeton principal.)Comment puis-je obtenir un jeton d'utilisateur valide pour CreateProcessAsUser?

Un jeton utilisateur est-il toujours valide uniquement dans le processus appelé OpenProcessToken?

Y a-t-il un autre moyen de le faire? Je ne veux pas que l'utilisateur doive "se connecter" à l'application avec logonuser. Ce serait juste stupide. Je suppose que je pourrais remettre un handle de processus pour "explorer.exe" de l'application au service, que le service pourrait utiliser pour obtenir un jeton d'utilisateur, mais cela nécessiterait l'accès à PROCESS DUP HANDLE droit. Je ne suis pas ravi de cette solution, mais peut-être que c'est la façon de le faire?

Répondre

2
+0

Merci, je vais avec le premier article, en créant un jeton avec ZwCreateToken. C'est un peu brouillon d'emballer tout ce dont j'ai besoin dans un message, mais a apparemment travaillé pour d'autres .. –

+0

Le premier article semble avoir quelques erreurs, la seconde semble assez bonne.Mais je ne sais pas pourquoi vous utiliseriez ZwCreateToken (une méthode non documentée, non supportée et pas tout à fait stable) quand il existe des méthodes documentées pour faire ce que vous voulez. –

+0

Désolé, je voulais dire deuxième. Je n'ai même pas trouvé le premier. Je fais quelque chose comme http://www.apnilife.com/E-Books_apnilife/Windows%20Programming_apnilife/Windows%20NT%20Undocumented%20APIs/1996%20Ch08_apnilife.pdf. Faites-vous référence à CreateToken? –

3

Vous avez plusieurs questions ici, donc je vais essayer de les traiter séparément et vous pouvez me corriger si je l'ai mal compris:

  1. Vous semblez avoir un service et une application utilisateur qui ne peut pas exécuter certaines fonctionnalités en même temps. Pour ce faire, le service arrête l'application, exécute la fonctionnalité spéciale, puis redémarre l'application. Si cela est correct, à mon avis, vous avez un défaut de conception. Plutôt que de s'arrêter, puis de redémarrer l'application, vous devez coordonner l'accès à la ressource partagée via une exclusion mutuelle en utilisant un mutex nommé et/ou en utilisant une méthode IPC telle que des canaux nommés pour communiquer les intentions.

  2. Un jeton utilisateur est-il toujours uniquement valide dans le processus appelé OpenProcessToken? Oui, le handle de jeton que vous avez reçu est un index dans la table des handles du processus, il n'est pas directement transférable. Vous auriez besoin d'utiliser DuplicateHandle qui peut être ce que vous voulez, mais pourrait être désordonné.

  3. Vous souhaitez trouver le meilleur moyen d'obtenir le jeton de l'utilisateur pour lancer l'application dans la session (interactive?) De l'utilisateur. Si c'est le cas, le meilleur moyen est de récupérer le jeton de session de l'utilisateur et de l'utiliser. Vous pouvez consulter this article et l'exemple de code, il est en C#, mais devrait être relativement facile à transférer dans la langue de votre choix.

EDIT: Mise à jour pour inclure Windows 2000. Étant donné que vous exécutez le service sous le compte SYSTEM, il peut ouvrir une poignée au processus lui-même (si nécessaire le processus peut envoyer son numéro d'identification de processus). Il peut ensuite ouvrir le jeton attaché à ce processus, le dupliquer et utiliser le jeton résultant pour lancer (ou relancer) l'application cible.

+0

1. Cela pourrait ressembler à un défaut de conception. Le problème est que le service peut vouloir mettre à niveau l'application: il se peut que ce ne soit même pas la même application qui doit être lancée. 2. D'accord, c'est. Je vais essayer de créer un nouveau jeton à la place. 3. Doit travailler sur 2000, a oublié de mentionner que ... –

+0

Pourquoi le service ne se contente-t-il pas d'appeler OpenProcessToken et DuplicateTokenEx lui-même plutôt que de laisser le processus envoyer quelque chose au service? –

+0

Le processus créé ne serait-il pas exécuté en tant que système local dans ce cas? Si je fais cela, je pourrais tout aussi bien appeler CreateProcess et ne pas du tout utiliser de jetons utilisateur. –

Questions connexes