2016-11-12 15 views
0

他のアプリケーションと連携して動作するWindowsサービスを作成しています。これらのアプリケーションは、サービスVIA Remotingとの通信を開始します。接続が確立されると、サービスが停止された場合にすぐに通信を停止するアプリケーションにしたいと考えています。意味私は、通信がもはや有効ではないIpcConnectionを使用しようとしていたために、Timerが経過するか、例外が発生するのを待っていません。外部プロセス(サービス)に対してWaitForExit()を実行する方法

これは、サービスがサービスとしてではなく対話的に実行されている場合にすべて機能します。それがサービスとして実行されると、例外が発生します。サービスは、サービスとして実行されるか、対話的に実行されるかに関係なく、管理者として実行されます。他のアプリケーションを管理者として実行すると、期待通りに機能します。残念ながら、このアプリケーションを管理者として実行することは、本番環境では選択肢にはなりません。

私は、例外の原因を絞り込んだ。

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

serverProc成功しているが、WaitForExit失敗します。

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) 

私はTimerでこのコードを置き換えることができますが、私は、この現在の技術は働くだろう期待していました。

私は何か仕事をしていますが、例外を避けて同様のコードを使用するために何かできますか?

+0

これは完全に正常です:

は作品は、あなたがあなたのアプリケーションを作るために、この質問を使用することができると仮定すると、常にその許可が必要です。あなたは実用的にならなければならないでしょう、プロセスクラスの仕方を変えることはできません。そして、確かにさようならと言ってサービスから始める必要があるので、難しい方法を見つけ出す必要はありません。ハードクラッシュで死んでもまだ動作しません。例外的に何かが発生した場合、例外を生成する必要があります。 –

答えて

0

サービスが別のユーザー(おそらくLocalSystem)として動作している可能性が高いです。また、アプリケーションが管理者ではなく現在のユーザーとして実行されている可能性が高いです。

管理者以外のプロセスは、他のユーザーがプロセスのいくつかの側面を問い合せることはできません。あなたは問題を確認するために管理者としてアプリケーションを実行することができます:実行ファイルを右クリックして「管理者として実行」を選択すると、ユーザー・アクセス制御ダイアログが表示され、問題なく動作するはずです。 How do I force my .NET application to run as administrator?

関連する問題