Q

Windows NT/2000 Serverで構築したシステムに,新しい機能をサービスとして追加しようとしています。しかし,その新しいサービスは既存の業務関連サービスが動いている状態で起動させる必要があります。確実に,その順番で起動させるには,どうすればよいのでしょうか?

A

Windows NT/2000/XPでは,特定のプログラムを起動時にサービスとして組み込めるようになっています。このサービスの起動順序は通常Windowsによって自動的に決められ,他のサービスの起動の完了を待たずに次々と起動するようになっています。

 今回のように,ある一定の順番でサービスを起動する必要がある場合は,サービス間に依存関係を設定することで起動順序を保証することが可能です。

サービスの依存関係を定義
 サービスの依存関係は,レジストリで設定します。例えば,Aservice1というサービスをZservice2というサービスが起動した後に起動させたい場合には,Aservice1サービスのレジストリに設定します。各サービスに関するレジストリは
HKEY_LOCAL_MACHINE\SYSTEM\
CurrentControlSet\Services\〈サービスのレジストリ名〉以下に存在します。

 そのレジストリの下に,REG_MULTI_SZというデータ・タイプでDependOnServiceという値を作成し,このサービス(この場合はAservice1)よりも先に起動させたいサービス名を入力します(図1)。先に起動させたいサービスが複数存在する場合は,それぞれのサービス名を各行に1つずつ記入します。このレジストリは REG_MULTI_SZ型のため,Windows 2000以前のOSでは,regedit.exeではなく,必ずregedt32.exeを使って編集して下さい。


△ 図をクリックすると拡大されます
図1●サービス間の依存関係をレジストリに定義する

 この設定をする際に注意すべき点は,サービスのレジストリ名です。管理ツールなどの[サービス]アプレットで確認できるサービス名と,サービスのレジストリ名とは,必ずしも一致していません。例えば,Remote Procedure Callのサービスはレジストリ上ではRPCSSという名前ですが,[サービス]アプレット上ではRemote Procedure Call(RPC)と表示されます。今回の設定で記述する名前は,あくまでサービスのレジストリ名です。念のために,各「<サービス名>」レジストリ中のDisplayNameキーの値をチェックし,[サービス]で表示されている名前と一致していることを確認して下さい。


図2●サービスの依存関係は[管理ツール]にある[サービス]アプレットで確認できる

 依存関係が正しく設定されているかは,Windows 2000 以降のOSならば各サービスの[依存関係]タブから確認することが可能です(図2)。なお,利用に当たっては関連技術情報としてマイクロソフトのサポート技術情報も参照して下さい(文書番号,JP193888)。

スタートアップやタスクを活用する手も
 このように,レジストリを使ってサービスの起動順は制御できますが,手順がやや繁雑です。


図3●起動したい順番に実行するバッチ・ファイルをシステム起動時に実行する「タスク」として指定する
Internet Explorer 4.01以降をインストールしたOSで利用可能。

 業務サービスは,Windowsを構成する基本サービスの後に起動すればよい場合がほとんどだと思います。それならば,Windowsの起動が完了してから業務サービスを順番に起動するバッチ・ファイルを使えば,より簡単に制御することが可能です。このバッチ・ファイルを「スタートアップ・スクリプト」や,「システム起動時」に実行指定した「タスク」にすれば,起動時にサービスの自動起動が可能です(図3)。

 スタートアップ・スクリプトは,OSの起動時に指定されたプログラムを起動する機能で,Windows 2000以降で利用可能です。Active Directoryのグループ・ポリシーのほか,Active Directoryを利用していない場合もローカル・ポリシーとして設定できます。

 具体的には,「MMC」と入力してマイクロソフト管理コンソールを起動し,[コンソール]-[スナップインの追加と削除]-[追加]から,[グループポリシー]を追加してください。参照先を指定されますが,デフォルトの[ローカルコンピュータ]のままで[完了]を押します。[ローカルコンピュータポリシー]-[コンピュータの構成]-[Windowsの設定]を展開して,その中の[スタートアップ]をダブル・クリックして表示した画面からスクリプトを指定します(図4)。


△ 図をクリックすると拡大されます
図4●ローカル・ポリシーの「スタートアップスクリプト」にバッチ・ファイルを指定することでサービスを順に起動する方法もある

 この指定で相対パスを使うと,
%SystemRoot%\system32\GroupPolicy\
Machine\Scripts\Startup以下にあるスクリプトとして扱われます。絶対パス名で指定すれば,任意の位置のスクリプトを指定可能です。

 筆者が確認した限り,これらのスクリプトは,サービスの起動開始後に,「スタートアップ・スクリプト」「システム起動時に実行タイミングを設定したタスク」の順に実行されています。また,「タスク」の方が実行するアカウントが指定できるなど,詳細な設定が可能といった相違点がありますので,適宜使い分けて下さい。

高橋基信