前回の記事で,私はWindows Server 2003のSC(sc.exe)コマンドを使用して,Webカメラから2,3分ごとに画像を取得する架空のサービス・アプリケーション(つまりC:\wc\wcmail.exe)をベースにして新しいサービスを作成する方法を説明した。サービスに対するサービス・アカウントの指定方法,自動起動の設定方法,エラー・メッセージを表示しないようにする方法,表示名「Web cam image mailer」の指定方法を説明した。復習のために書いておくと,コマンドは次のようなものである。

sc create webimagemailer binpath= C:\wc\wcmail.exe
  start= auto displayname= "Web cam image mailer"
  obj= .\webcamguy password= swordfish error= ignore 

 今回はこれをより掘り下げていくことにする。WebimagemailerはWindows Image Acquisition(WIA)サービス(キー名stisvc)が実行されていなければ実行できないものと仮定する。サービス関連の用語で言えば,Webimagemailerはstisvcに依存しているということである。

 Webimagemailerにstisvcの起動後に起動するように指示するには,「depend= stisvc」パラメータを追加する(くどいようだが,等号とパラメータ値の間には空白が必要である)。サービスが一つ以上のサービスに依存していることを指定するには,サービスのキー名をスラッシュで区切って指定する。

 例えば,Webimagemailerサービスを作成し,stisvcおよびwebclientをその起動前に起動しておくよう指定するには,次のように入力する。

sc create webimagemailer binpath= C:\wc\wcmail.exe
  start= auto displayname= "Web cam image mailer"
  obj= .\webcamguy password= swordfish error= ignore depend= stisvc/webclient 

 依存性が問題になる場合は,SCの三つのサブコマンド,enumdepend,qc,configを依存性の問い合わせに使用できる。指定したサービスに依存しているサービスを特定するには,次のように入力する。

sc enumdepend <サービスのキー名>

 例えば,サーバー・サービス(キー名lanmanserver)に依存しているサービスを確認するには,次のように入力する。

sc enumdepend lanmanserver 

 このコマンドを私のテスト用Windows Server 2003で実行してみたところ,Netlogon,Dfs,およびコンピュータ・ブラウザ・サービスが,サーバー・サービスに依存していることがわかった。

 逆に,サーバー・サービスが依存しているサービスを特定するには,次のようにqcサブコマンドを使用する。

sc qc lanmanserver

 このコマンドを使用すると,サービスに関して9行からなる情報が表示される。そのうちの一つがDEPENDENCIESである(SCのメッセージには大文字が多い)。このコマンドを実行すると,サーバー・サービスは他のサービスに依存していないことがわかる。

複数のサービスに依存している場合

 複数のサービスに依存しているサービスの場合はどのように表示されるかを確認するには,このコマンドをNetlogonサービスに対して実行してみると良い。Netlogonの起動前にはサーバーおよびワークステーション・サービスが動作している必要があり,つまり,この二つのサービスにNetlogonが依存していることがわかる。

 依存性は一つのサービスが他の一つのサービスを必要とするような,簡単なものではない場合もある。例えば,あるサービスは他の三つのサービスのいずれかが起動している場合にのみ起動する(三つすべてが動いている必要はなく,いずれか一つで十分である)。このような動的な指定を行うには,あるサービスがサービスのグループに依存していることを情報として与える。

 Windowsには,SCSI CDROMクラス,SCSI miniport,Parallel arbitrator,NetBIOSGroup,NDIS,およびPrimary Diskサービスなど,このようなサービスがいくつかある。グループ内のすべてのサービスおよびドライバは次のコマンドで確認できる。

sc query type= service|driver|all group= <"グループ名">

 例えば,Primary Diskサービス・グループのすべてのサービスおよびドライバを確認するには,次のように入力する。

sc query type= all group= "primary disk"

 グループ名では大文字と小文字は区別されない。グループに対するサービスの追加,または新しいサービス・グループの作成は,「group= グループ名」コマンドをsc createコマンドに追加するか,またはsc configを使用してサービスのグループメンバーシップを変更することによって行うことができる。

 例えば,Webimagemailerを新しいグループ「unimportant」に追加するには次のコマンドを実行する。

sc config webimagemailer group= unimportant  

 私がこれまで調べた限りでは,サービスまたはドライバを複数のサービス・グループに登録することはできない。

 特定のグループが動作してしない場合はWebimagemailerをロードしないように,Windowsに対して指示することもできる。架空のwebstartupグループを指定するには,「depends= webstartup」パラメータを指定する。webstartupがグループであり,他のサービスでないことを示すため,名前の前にプラスの記号を付加する。

 例えば,webimagemailerがwebstartup起動グループに依存するように再構成するには,次のように入力する。

sc config webimagemailer depends= +webstartup 

 サービスのロード順序をより明確に制御するための,依存関係およびグループの使用方法を見てきた。私が2,3年前にSCを見つけたときになぜ喜んだか,これでわかってもらえると思う。