2

どのWindowsサービスが実行可能ファイルを実行したかを見つけることができるかどうか疑問に思いましたか?

同じexeから2つの異なるサービスを実行し、異なることを実行しています。プログラムのメインメソッドはコマンドラインパラメーターを検出し、コンソールアプリを起動するか(Environment.UserInteractiveで実行されている場合)、2つの可能なサービスのいずれかを起動します。どのサービスが実行されているかを識別する良い方法が見つからないため、コードで開始する正しいサービスを選択できます。Windowsサービスのイメージパスで.exeパラメータを渡すことが機能していないようです。サービスはサーバー上で実行されており、自動的に開始されるため、手動で実行することは実際にはオプションではありません。

実行可能ファイルが異なる2つの異なるプロジェクトを作成する必要がないようにしたいので、実行するサービスをプログラムに通知できると便利です。

4

3 に答える 3

0

実行中のバージョンに固有の名前を使用して、サービスの開始時にミューテックスを作成できます。ミューテックスが取得された場合は、実行されていないことがわかります。取得できない場合、サービスはすでに実行されています。

次に、最初に最初のサービスのミューテックスを取得しようとする新しいプロセスを介してサービスを開始し、取得できない場合は2番目のサービスを開始します。

したがって、ServiceRunner.exe-fooを起動します。「foo」と呼ばれるミューテックスが取得されるため、ミューテックスを解放すると、ServiceRunner.exeがService.exe-fooを起動します。

ミューテックスが取得されない場合は、「bar」と呼ばれるミューテックスを取得して、同じプロセスを実行してください。

これは厄介な解決策であり、単にサービスを開始しようとする新しいexeを作成する必要があります。

于 2013-01-11T16:49:18.223 に答える
0

サービスに開始状態を共有させます (一時ファイル、レジストリ キー、またはその他の方法で、これを HTML として Web サーバーに書き込むこともできます...)

ServiceController yourService = new ServiceController( "YourServiceName" , "YourMachine" );
if( yourService.Status == ServiceControllerStatus.Stopped )
{
    yourService.Start();
}
于 2013-01-11T16:23:45.783 に答える
0

で引数を渡すことができますImagePath。ある時点で .net Windows サービスを使用して実行したことは知っていますが、思い出すと、標準の .Net インストーラー以外のものを使用してサービスをインストールする必要がありました。

.Net インストーラーは、渡すものすべてに引用符を追加C:\test\test.exe -arguments"C:\test\test.exe -arguments"ます"C:\test\test.exe" -arguments

WiXsc.exeまたはCreateServiceをチェックして、正しいレジストリ値を取得してください。

テストするには、通常どおりサービスをインストールし、regedit で参照してHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\yourServiceNameImagePath を編集します。表示方法の例については、 をご覧くださいHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\seclogon

于 2013-01-11T17:05:36.293 に答える