Windows 起動時に読み込むサービスの順序を制御したい

対象プラットフォーム

質問

現在、Windows NT/2000 Server を利用したシステムに新しい機能を追加しようとしています。
業務用件上、既存の業務サービスの起動後に新たに作成した業務サービスを起動させる必要があるのですが、手段がわからず困っています。どのようにすればよいのでしょうか?

回答

Windows NT/2000/XP といった OS においては、基本的に OS によってサービスの起動する順序が決められます。またサービスの起動時には、あるサービスの起動の完了を待たずに次々とサービスの起動が行なわれていきます。
しかし、今回のように、ある一定の順番でサービスを起動する必要がある場合は、サービス間に依存関係を設定することでサービスの起動順序を保証することが可能です。

依存関係の設定は、レジストリで行ないます。例えば、Aservice1 というサービスの起動を Zservice2 というサービスの起動後に行なうには、Aservice1 サービスのレジストリを設定します。レジストリの位置は

  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<サービス名>

にあります。ただし「サービス」アプレットで確認できるサービス名と、レジストリ上のサービス名とは、必ずしも一致していないため、最終的には図xxのように、各「<サービス名>」レジストリ中の DisplayName キーの値が、「サービス」アプレット中で表示されているものと同じ値であることを確認してください。

図 1 : サービスのレジストリ確認

サービス

レジストリ エディタ - DisplayName

「サービス」アプレットの「名前」欄とレジストリ中の「DisplayName」欄が同一であることを確認する。

レジストリの位置を確認したら、そのレジストリの下に、

  REG_MULTI_SZ: DependOnService

というキーを作成して、図 2 のようにして、このサービス(上記の例では Aservice1 )よりも先に起動させたいサービスのレジストリ上での名称を入力します。先に起動させたいサービスが複数存在する場合は、各行に 1 つずつ名称を記入します。このレジストリは REG_MULTI_SZ 型のため、Windows 2000 以前の OS では、REGEDIT.EXE ではなく、必ず REGEDT32.EXE を使って編集作業を行なって下さい。

図 2 : 依存するサービスの追加

レジストリ エディタ - DisplayName

値の追加

データ

REGEDT32.EXE(Windows 2000までのOSの場合)を利用し、レジストリの型としてREG_MULTI_SZを指定する必要があることに注意。また、追加する値は、

レジストリ エディタ - DisplayName

依存するサービスのレジストリ上での名称であることに注意。


追加後のレジストリ

レジストリ エディタ - DependOnService

レジストリ上での名称は、先ほどと同様

  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<サービス名>

に存在するレジストリの名称になります。上記の例では、「サービス」アプレットと同じ名称 (Zservice2) になっていますが、これも常に同じとは限らないため、最終的には DisplayName が同一であるかどうかで確認を行なって下さい。
なお、Windows 2000 以降の OS の場合は、図 3 のように、各サービスの 「依存関係」 タブからサービス間の依存関係を確認することが可能になっています。

図 3 : 依存関係 「タブ」

依存関係 「タブ」

関連する技術情報として、「 JP193888 : 特定のサービスの読み込みを遅らせる方法 」も参照してみて下さい。

スタートアップ スクリプトやタスクを活用する

このようにサービスの起動順の制御は不可能ではありませんが、繁雑です。
業務サービスは、OSを構成するサービスの起動後に起動すればよい場合がほとんどだと思いますので、この場合は、業務サービスを順番に起動する以下のようなバッチファイルを作成して、「スタートアップ スクリプト」や、「システム起動時」に実行を指定した「タスク」として設定することで、同様の設定を簡単に行なうことが可能です。

バッチファイルの例
net start Zservice2 net start Aservice1

筆者が確認した限り、これらのスクリプトは、サービスの起動開始後に、「スタートアップ スクリプト」、「システム起動時に実行タイミングを設定したタスク」の順に実行されています。なお、この方法を利用する場合は、該当サービスが二重に起動されないように、「サービス」アプレットでの「スタートアップの種類」を「手動」にしておくのを忘れないようにして下さい。 スタートアップ スクリプトは、OS の起動時に指定されたプログラム (通常バッチファイル) を起動する機能で、Windows 2000 以降の OS で利用することが可能です。
設定は、Active Directory の GPO (グループ ポリシー オブジェクト)でも可能ですが、Active Directory を利用していない場合は、ローカル ポリシーで設定することも可能です。
MMC.EXE を起動して、「コンソール」-「スナップインの追加と削除」-「追加」から、「グループ ポリシー」を追加してください。参照先を指定されますが、デフォルトの「ローカル コンピュータ」のままで「完了」を押します。
ローカル コンピュータ ポリシーを図 4 のように展開して、「スタートアップ」をクリックすると現れる図 4 の画面からスクリプトを指定します。

図 4 : スタートアップスクリプトを設定する

スクリプト

スタートアップのプロパティ

このように相対パスでスクリプト名を設定すると、%SystemRoot%\system32\GroupPolicy\Machine\Scripts\Startup 以下のスクリプトを指定を意味しますが、絶対パス名で指定すれば、任意の位置のスクリプトを指定可能です。
「タスク」の機能は、Internet Explorer 4.01 以降をインストールした OS で利用することが可能です。そのため、Windows NT Server の場合でも IE をインストールすることで機能が利用可能になります。
「タスク」の作成は、「コントロール パネル」-「タスク」内の「スケジュールされたタスクの追加」から行なって下さい。タスク ウィザードが起動しますので、タスクの実行タイミングとして、図 5 のように、「コンピュータ起動時」を選択して下さい。

図 5 : タスク ウィザードの設定

スクリプト

「スタートアップ スクリプト」も「タスク」も、指定したスクリプト(プログラム)をマシン起動時に実行するという点では同様ですが、前述した「スタートアップ スクリプト」の方が先に実行されるという点の他、「タスク」の方が実行するアカウントの指定など、詳細な指定が可能になっているなどの相違点がありますので、適宜使い分けて下さい。

Windows 9x と同じ設定では、OS 起動時に自動起動しない

Windows 98 などで OS 起動時に自動的にコマンドを実行させる設定として、

HKEY_LOCAL_MACINE\Software\Microsoft\Windows\CurrenVersion\RunServices(もしくはRunServicesOnce)

以下に文字列型のキーを追加する方法があります。
しかし、Windows NT/2000/XP の場合、このキーは無効ですので、注意して下さい。

参考情報

注記・補足

  1. 本文書は、日経 Windowsプロ 2003 年 10 月号の「トラブル解決 Q&A コーナー」に掲載された「Windows 起動時に読み込むサービスの順序を制御したい」の草稿を有志の方の手により HTML 化して掲載しているものです。

Copyright (C) 1998-2009 TAKAHASHI, Motonobu
Last update: 2003-02-20 11:38:20 JST
webmaster@monyo.com