すでに依存関係がある Windows サービスに新しい依存関係を追加する

すでに依存関係がある Windows サービスに新しい依存関係を追加する

古い依存関係を削除することなく、既存のサービスにバッチ スクリプトを使用して新しいサービス依存関係を追加したいと考えています。

このコマンドsc config ServiceA depend= ServiceB/ServiceC/ServiceDで複数の依存関係を追加できることはわかっていますが、たとえば、ServiceB と ServiceC に依存するサービスに ServiceD 依存関係を追加して、同じ結果を得て、古い依存関係について言及しないようにする方法がわかりません (古い依存関係がわからないため)。

それを実行する方法は何ですか? また、変更を元に戻す方法 (バッチ経由も) は何ですか?

ちなみに、私はバッチについてはあまり経験がありません。

答え1

既存の依存関係を見つけて、新しい依存関係を追加し、全体を書き戻します。 というサービスがあるとするとw3svc、次を使用できます。

sc.exe  qc  w3svc

または PowerShell の場合:

(get-service w3svc | Select ServicesDependedOn).ServicesDependedOn

ここで、これらをループして、実行する新しい sc.exe コマンドを構築できます。

例:

 $serviceName = "w3svc"
 $cmd = "config $serviceName depend= "
 (gsv $serviceName | Select ServicesDependedOn).ServicesDependedOn | % {$cmd += $_.Name + "/"}
 $cmd += "myMasterService"
 invoke-expression "sc.exe $cmd"

既存のサービスからコマンド文字列を構築し、独自のものを追加します。

自分のサービスを削除するには、同じことを行いますが、ループ内で自分のサービスを除外します。

 $serviceName = "w3svc"
 $cmd = "config $serviceName depend= "
 (gsv $serviceName | Select ServicesDependedOn).ServicesDependedOn | % {
      if ($_.Name -ne "myMasterService")
      {
           $cmd += $_.Name + "/"
      }
 }
 # remove the last slash
 $cmd = $cmd -replace "/$", ""   
 invoke-expression "sc.exe $cmd"

実際の sc.exe コマンドをテストしたわけではありませんが、何をしているのかはご存じだと思います。

関連情報