2016-11-12 4 views
0

Je crée un service Windows qui fonctionne de pair avec d'autres applications. Ces applications démarrent la communication avec le service VIA Remoting. Une fois la connexion établie, je souhaite que les applications arrêtent immédiatement la communication si le service est arrêté. Ce qui signifie que je ne veux pas attendre qu'un Timer se soit écoulé ou qu'il y ait une exception parce que la communication essayait d'utiliser IpcConnection qui n'est plus valide.Comment faire pour WaitForExit() pour le processus externe (Service)

Tout cela fonctionne lorsque le service fonctionne de manière interactive plutôt que comme un service. Quand il fonctionne comme un service, j'ai une exception. Le service s'exécute en tant qu'administrateur, qu'il soit exécuté en tant que service ou en mode interactif. Si j'exécute l'autre application en tant qu'administrateur, cela fonctionne comme prévu. Malheureusement, l'exécution de cette application en tant qu'administrateur ne sera pas une option en production.

Je l'ai réduit à ce qui cause l'exception.

var serverProc = Process.GetProcessById(_remote.ProcessId); 
serverProc.WaitForExit(); 

serverProc est réussie, mais WaitForExit échoue.

System.ComponentModel.Win32Exception (0x80004005): Access is denied 
    at System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited) 
    at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited) 
    at System.Diagnostics.Process.WaitForExit(Int32 milliseconds) 

Je peux remplacer ce code avec un Timer, mais j'espérais cette technique actuelle fonctionnerait. Est-ce que je fais quelque chose de travail et y a-t-il quelque chose que je puisse faire pour éviter l'exception et utiliser un code similaire?

+0

Ceci est tout à fait normal. Vous devrez être pragmatique, vous ne pouvez pas changer la façon dont la classe Process fonctionne. Et cela doit certainement commencer par votre service en disant adieu, pour que vous n'ayez pas à le découvrir à la dure. Ne fonctionnera toujours pas quand il meurt d'un accident dur. Mais quelque chose d'exceptionnel est arrivé, il devrait générer une exception. –

Répondre

0

Il est très probable que vos services s'exécutent en tant qu'utilisateur différent (probablement LocalSystem). Il est également hautement probable que votre application s'exécute en tant qu'utilisateur actuel, et non en tant qu'administrateur.

Les processus non-administrateur ne sont pas autorisés à interroger certains aspects des processus par d'autres utilisateurs. Vous pouvez essayer d'exécuter votre application en tant qu'administrateur pour vérifier que c'est votre problème: essayez de cliquer avec le bouton droit de la souris sur votre exécutable et choisissez "Exécuter en tant qu'administrateur", ce qui ouvrira la boîte de dialogue Contrôle d'accès utilisateur.

En supposant que les travaux, vous pouvez utiliser cette question pour faire votre demande exigent toujours de l'autorisation: How do I force my .NET application to run as administrator?