2009-12-03 4 views
1

C'est le scénario:Exécution d'un processus que l'utilisateur actuel d'un processus système

J'ai un service (# 1) comme système local, et il finira par exécuter un processus (# 2) qui met à jour une application (# 3). Ce processus (# 2), le programme de mise à jour, doit aussi fonctionner en tant que SYSTÈME LOCAL, pas de problème ici, puisqu'il doit réécrire certains fichiers (# 3). Lorsque le programme de mise à jour démarre en tant que SYSTÈME LOCAL, il supprime toute instance en cours d'exécution de mon application (# 3).

Une fois les fichiers en cours de mise à jour, je dois redémarrer l'application mise à jour (# 3) en tant que compte connecté.

Comment puis-je gérer cela? Y a-t-il quelque chose de mal conceptuel dans mon idée?

MISE À JOUR Le programme de mise à jour tue l'application simplement pour remplacer les fichiers.

+0

Pourriez-vous expliquer pourquoi le processus de mise à jour tue l'application visible par l'utilisateur (# 3)? Pourquoi l'application ne surveille-t-elle pas le (s) répertoire (s) que le programme de mise à jour va modifier? –

Répondre

2

Je ne pense pas qu'il y ait un moyen pour le service pour obtenir ses mains sur la WindowsIdentity.Token poignée il faudrait appeler la Fonction API CreateProcessAsUser(). Sauf si l'application elle-même le fournit.

Il y a une meilleure façon, vous ne devez pas terminer l'application pour remplacer ses fichiers exécutables. Tout ce que vous avez à faire est de les renommer. Vous pouvez ensuite mettre les mises à jour en place et signaler à l'application de redémarrer elle-même. Un autre avantage de cette approche est que l'application s'arrête volontairement (notifiant l'utilisateur) au lieu de se faire avorter grossièrement. Nettoyez les fichiers renommés lorsque vous voyez le processus terminé.

+0

Comment pourrais-je facilement signaler à l'application de redémarrer elle-même? – jonaspp

+0

Ce fil est un festival à la baisse. Est-ce que vous frappez le vote vers le bas? –

+0

Non, j'ai voté votre réponse ... il y a quelqu'un qui déconne ... – jonaspp

0

Si vous avez accès aux informations d'identification de l'utilisateur, vous pouvez utiliser Process.Start avec une entrée ProcessStartInfo spécifiant le nom d'utilisateur et le mot de passe de l'utilisateur.

Si vous ne connaissez pas les informations d'identification, je ne suis pas sûr que cela puisse être fait. Il se peut que le service communique avec votre programme en lui demandant de se fermer lui-même, mais avant de le faire, il doit démarrer un minuscule programme séparé. Cela devrait être exécuté en arrière-plan, mais il fonctionnera avec les informations d'identification de l'utilisateur actuel. Lorsque vous avez terminé, demandez au programme d'arrière-plan de redémarrer votre programme principal, puis quittez.

0

Un problème est de connaître "l'utilisateur connecté". XP et plus supportent le changement rapide d'utilisateur, où plus d'un utilisateur peut être connecté en même temps (vista et up supportent cette fonctionnalité même si la machine est un membre de domaine).

Voici un lien vers un article de blog Raymond Chen discuter de la question: http://blogs.msdn.com/oldnewthing/archive/2006/08/22/712677.aspx

+0

Downvoters: s'il vous plaît commenter si vous me votez vers le bas. – JMarsch

Questions connexes