外部プログラムを定期的に実行したい Windows サービスがあります。今のところ普通にやってます
Process program = Process.Start(@"C:\mpewatch\db_parameters\DBParameters.exe");
これは機能していないようです。OnStart
サービスのハンドラーで開始された別のスレッドからこれを実行しています。これに概念的な問題はありますか?このようなサービスから外部プログラムを実行することはできませんか?
外部プログラムを定期的に実行したい Windows サービスがあります。今のところ普通にやってます
Process program = Process.Start(@"C:\mpewatch\db_parameters\DBParameters.exe");
これは機能していないようです。OnStart
サービスのハンドラーで開始された別のスレッドからこれを実行しています。これに概念的な問題はありますか?このようなサービスから外部プログラムを実行することはできませんか?
サービスから外部プログラムを実行できますが、セキュリティ上の問題があります。たとえば、対話型アカウントにアクセス権がある場合でも、外部プログラムが存在するフォルダーへの読み取りアクセス権を持たないアカウントでサービスが実行されている可能性があります。
テスト目的で、対話型アカウントで実行するようにサービスを構成してみてください。プログラムが期待どおりに呼び出された場合、元のアカウントの問題は、プログラムを実行するための十分な権限がないことです。
Another critical consideration with Windows Services is that there is no GUI. Technically, there is an option to allow the service to interact with a local GUI, but you will not see it. This is due to services running as the Local System user.
Within a service, any modal dialog box (OK, Cancel, etc) is considered an error.
あなたの質問はオペレーティングシステムを示していませんでした。
Windows XP では、サービス コントロール パネルを開き、サービスをダブルクリックして、[ログオン] タブを選択し、サービスをローカル システムとして実行するように構成し、チェックボックスをオンにすることで、デスクトップと対話するように Windows サービスを構成できます。それはかなり簡単です。Notepad.exe などでテストして、動作するかどうかを確認してみてください。
ただし、Vista (およびおそらく Windows 7) では、うまくいかない場合があります。Windows サービスがデスクトップと対話する機能が Vista で削除されたことを読みました。用語は忘れましたが、基本的にサービスは「シェル 0」で実行され、ユーザーは「シェル 1」で実行されます。ユーザー アプリケーションは WCF などのテクノロジを使用してサービスと通信できますが、サービスはデスクトップと直接通信できません。たとえば、エラー ボックスが表示された場合は、「シェル 0」にスワップして対処する必要があります。繰り返しますが、これは私が数か月前に読んだものに基づいており、もう一度読んでいません. 私にとっては、フロントエンド アプリを介して WCF を使用して Windows サービスを構成するように構成しました。
リンクがなくて申し訳ありませんが、サービスを最終的に新しい OS に移行する必要がある場合 (または既に移行している場合) は、これを確認してください。