Windows サービスのアーキテクチャについて

 

Windows サービスは、サービス アプリケーションとも呼ばれますが、これはユーザーがログインしているかどうかにかかわらず Windows コンピュータ上で実行されるアプリケーションのことです。Windows サービスには、実行可能ファイル、アプリケーション コンポーネントを格納するディレクトリ、およびサービス パラメータを定義するレジストリ設定が含まれます。Windows サービスはプログラム インターフェイスを実装しており、サービス コントロール マネージャ (SCM) はそれを使用してサービスを制御できます。Windows サービスは、システムの起動時に自動的に開始することも、サービス コントロール プログラムによって手動で開始することもできます。サービス コントロール プログラムは、SCM 機能を使用してサービスを制御するアプリケーションです。サービス コントロール プログラムの例としては、サービス ツールや、コマンド ライン ツールの net.exe および SC.exe があります。

次の図に、Windows サービスのアーキテクチャを示します。

ca48e350-ed32-4789-988f-9f28dc0567b6

注意

SCM プロセスは、リモート プロシージャ コール (RPC) のサーバー サービスです。RPC を使用することにより、サービス コントロール プログラムは SCM とローカルまたはネットワーク経由で通信し、リモート コンピュータ上のサービスを制御することができます。

サービス コントロール マネージャの機能

SCM は、サービス コントローラとも呼ばれますが、サービスに関するさまざまなタスクを実行する汎用の Windows プロセスです。これらのタスクについて、以降のセクションで詳細に説明します。

インストール済みサービスのデータベースの保持

SCM は、Windows を正常に起動するために読み込む必要があるすべてのサービスとデバイス ドライバの一覧など、すべてのインストール済みサービスのデータベースを保持します。追加のサービス (Exchange Server 2003 サービスなど) がサーバーにインストールされると、サービス データベースにエントリが追加されます。SCM は、レジストリの次の場所でこのデータベースを維持します。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

サービス データベースには、インストール済みの各サービスおよび各ドライバに対するキーが登録されています。キーの名前は、そのサービスがインストールされたときにサービス構成プログラムによって指定された名前であり、サービスの名前に対応しています。たとえば、MSExchangeIS は Microsoft Exchange Information Store サービスの名前であり、MSExchangeSA は Microsoft Exchange System Attendant サービスの名前です。サービス名の長さは、最大 256 文字です。

次の図に、レジストリ内にある Exchange 固有のサービスのエントリをいくつか示します。

2c8c4abe-979d-4757-a34b-57339cfc5eca

注意

サービス ツールで作業を行っているときに表示される名前は、Windows サービスの表示名です。たとえば、MSExchangeSA の表示名は Microsoft Exchange System Attendant です。表示名は、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services<サービス名> の下にある DisplayName という名前の REG_SZ 値で定義されます。

サービス データベースのロックとロックの解除

SCM は構成情報に対するアクセスをシリアル化するため、SCM の初期化中はサービス データベースをロックする必要があります。たとえば、SCM はサービスの開始前にサービス データベースをロックして、そのサービス構成がサービスの開始中に変更されないようにします。SCM は、サービスの開始が完了するとロックを解除します。サービス構成プログラムは SCM と通信し、サービスを再構成する前にロックを要求し、またロックを解除する必要もあります。SC.exe ツールを使用して、コマンド ライン "sc QueryLock" を指定することにより、サービス データベースがロックされているかどうかを確認することができます。

注意

開始に長時間かかるサービスを管理する場合は、サービスの開始プロセス中に SCM がサービス データベースをロックするため、スタートアップの種類やその他の構成の設定を再構成できない点に注意してください。サービス開始の前か後にのみ、構成の変更を適用できます。

インストール済みサービスの列挙

SCM プロセスはサービス データベースから各レジストリ キーを読み込んで、各サービスのサービス レコードを作成します。サービス レコードには、サービス名、スタートアップの種類、サービスの状態 (たとえば、サービスの現在の状態および受け入れ可能な制御コード)、および依存関係の一覧へのポインタが含まれます。SCM はこれらのサービス レコードを使用して、現在の状態や依存関係に従って、そのサービスに対して有効なアクションを決定します。たとえば System Attendant は、それに依存する別のサービス (Microsoft Exchange Information Store サービスなど) が実行されている場合は、サービス ツールで停止することはできません。

サービスの開始、停止、一時停止、または再開

サービスの開始や停止などの一般的なタスクを実行するため、SCM は制御対象のサービスと通信します。SCM は、システムのスタートアップ時に Windows サービスを自動的に開始 (自動的に開始するサービス) したり、サービス コントロール プログラムによって要求されたときに手動で開始 (要求によって開始するサービス) できます。ただし、自動的に開始するサービスが要求によって開始するサービスに依存している場合は、要求によって開始するサービスも自動的に開始されます。スタートアップの種類によっても、サービスを無効にすることを指定できます。その場合、そのサービスは開始できなくなります。自動的に開始するサービスでも要求によって開始するサービスでも、無効にされているサービスに依存しているサービスは開始できません。この依存関係は重要です。Exchange Server を実行しているフロントエンド サーバーでサービスを無効にしようとしている場合などは特に注意してください。重要なサービスは無効にしないでください。重要なサービスを無効にすると、無効になったサービスに依存するすべてのサービスが開始できなくなるため、オペレーティング システムを起動できないことがあります。サービスを無効にした後でスタートアップに問題が発生した場合は、Windows にログオンしないでください。代わりに、[前回正常起動時の構成] オプションを使用してシステムを再起動し、サービス構成に対する最新の変更を破棄してください。Windows の [前回正常起動時の構成] は、レジストリ キー HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001 に格納されており、オペレーティング システムに正常にログオンするたびにこのキーが更新されます。正しくない構成で Windows にログオンすると、その正しくない設定を [前回正常起動時の構成] に適用することになります。

Exchange サービスの依存関係とスタートアップの種類を簡単に確認するには、コマンドとして "sc qc <サービス名>" を指定して、SC.exe ツールを実行します。たとえば、次の出力はシステム アテンダント (コマンド ライン : sc qc MSExchangeSA) の標準的な構成を示しています。

SERVICE_NAME: MSExchangeSA

TYPE : 10 WIN32_OWN_PROCESS

ERROR_CONTROL : 1 NORMAL

BINARY_PATH_NAME : "C:\Program Files\Exchsrvr\bin\mad.exe"

LOAD_ORDER_GROUP :

TAG : 0

DISPLAY_NAME : Microsoft Exchange System Attendant

SERVICE_START_NAME : LocalSystem

スタートアップの種類を指定するには、サービス ツールで、サービスのプロパティの [全般] タブをクリックし、次に [スタートアップの種類] ボックスの一覧をクリックします。または、サービス ツールを使用してシステム アテンダントを開始するか、コマンド ライン "sc start MSExchangeSA" を指定して SC.exe を使用します。また、net start コマンドを使用してサービスを開始することもできます。たとえば、「net start MSExchangeSA」と入力します。管理者の多くは、サービス ツールを使用することを好みます。

サービス ツール、SC.exe、net start コマンド、またはそれら以外のサービス コントロール プログラムのどれを使用するかにかかわらず、SCM は次のような一連の手順を実行してサービスを開始します。

  1. サービス データベースに格納されたアカウント情報の取得
    サービス アカウントのユーザー名とパスワードは、そのサービスがインストールされたときに指定されます。SCM は、個々のサービスのレジストリ キー内にある、ObjectName という名前の REG_SZ レジストリ値 (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<サービス名>) に、ユーザー名を格納します。パスワードは、ローカル セキュリティ機関 (LSA) のセキュリティ部分にあります。サービス ツールで [ログオン] タブを使用すると、サービス アカウントを変更できます。

    注意

    Exchange Server 2003 サービスは、既定では LocalSystem アカウントを使用します。LocalSystem アカウントは、ローカル コンピュータで包括的な特権を持つ定義済みのローカル アカウントです。このアカウントはシステム プロセスのみに対し利用可能であり、パスワードはありません。

  2. サービス アカウントへのログオン
    Windows においてすべてのアクティブなプロセスは ID を持つ必要があり、サービス アプリケーションも例外ではありません。サービスを開始するとき、SCM はサービス データベースから取得したアカウント情報を使用して Windows にログオンします。ローカル コンピュータでは、SCM がログオンに使用するアカウントは、特殊なユーザー権利 "サービスとしてログオン" を持つ必要があります。

    注意

    LocalSystem アカウントは暗黙的に "サービスとしてログオン" する権利を持っています。これは、このアカウントがすべてのローカル リソースに対する完全なアクセス権を持っているためです。

  3. 中断状態でのサービスの作成
    SCM は新規サービスを中断状態で開始します。これは、必要なセキュリティ情報が SCM により新規プロセスに追加された後でないと、そのサービスが有効にならないためです。

  4. プロセスに対するアクセス トークンの割り当て
    Windows で実行されるすべてのプロセスには、アクセス トークンが必要です。これは、ログオン トークンとも呼ばれます。アクセス トークンは、サービスのセキュリティ コンテキストを記述しているオブジェクトです。このトークン内の情報には、サービスがオペレーティング システムとの通信に使用するサービス アカウントの ID および特権が含まれます。

  5. プロセスの実行の許可
    ログオンの手続きを完了してアクセス トークンを割り当てると、SCM はサービスがその機能を実行することを許可します。

SCM は、サービスを停止するときに、次の一連の処理を実行します。

  1. SCM でのサービスの停止要求の受信
    サービス コントロール プログラムは、サービス コントロール機能を使用してサービスを停止できます。それには、SCM を介してサービスに SERVICE_CONTROL_STOP 要求を送信します。
  2. SCM でのサービス依存関係の検証
    SCM は、停止要求で指定されたサービスと依存関係のある他のサービスが実行中であると判断すると、サービス コントロール プログラムにエラー コードを返します。停止処理をトリガする前に、サービス コントロール プログラムは指定されたサービスに依存するすべてのサービスを列挙して停止する必要があります。たとえば、サービス ツールによって [別のサービスの停止] ダイアログ ボックスが表示され、依存関係のあるすべてのサービスも同様に停止するかどうかを確認するメッセージが表示されます。これに対し SC.exe は、エラー コードと、他のアクティブなサービスが依存しているためにそのサービスを停止できないということを報告するだけです。
  3. SCM による停止要求のサービスへの転送
    依存関係があるアクティブなサービスが検出されない場合、SCM は指定されたサービスに停止コードを転送して、停止を指示します。これにより、サービスは割り当てられたリソースを解放して、シャットダウンします。

実行中のサービスの状態情報の管理

サービスは、実行中に SCM プロセスに状態通知を送信します。SCM はこの状態情報を各サービスのサービス レコード内で管理します。SCM はこの情報を追跡して、受信側サービスの現在の状態に適合しない制御要求を誤って送信しないようにします。

このサービスの状態情報には、次の情報が含まれます。

  • サービスの種類   サービスは、ファイル システム ドライバ、デバイス ドライバ、または Windows サービスであり、それらは独自のプロセスを実行することも、他のサービスとプロセスを共有することもあります。システム アテンダントは、独自のプロセスを実行するサービスの例です。一方、SMTP サービスは、インターネット インフォメーション サービス (IIS) に統合された他のサービスとプロセスを共有するサービスです。
  • 現在の状態   サービスの状態は、開始、実行、一時停止、停止、または実行されていない、です。
  • 受け入れ可能な制御コード   これらは、現在の状態に従って、サービスが受け入れてそれ自身のハンドラ機能で処理することができる制御コードです。
  • Windows 終了コード   サービスはこのコードを使用して、開始中および終了中に発生したエラーを報告します。サービスに固有のエラー コードを返すには、サービスがこの値を ERROR_SERVICE_SPECIFIC_ERROR に設定して、サービスの終了コード内に追加の情報があることを示す必要があります。実行や終了が正常に行われているときは、サービスはこの値を NO_ERROR に設定します。
  • サービスの終了コード   サービスはこのコードを使用して、開始中および終了中のエラーを報告します。この値は、Windows 終了コードが ERROR_SERVICE_SPECIFIC_ERROR に設定されていない限り無視されます。
  • 待機予想時間   サービスはこのコードを使用して、保留中の開始、停止、一時停止、または操作の継続に必要な予想時間をミリ秒で報告します。
  • チェックポイント   サービスはこの値を使用して、開始、停止、一時停止、または続行の操作に時間がかかるときに、進行状況を定期的に報告します。たとえば、サービス ツールはこの値を使用して、操作の開始および終了の間のサービスの進行状況を追跡します。

ヒント

すべての Windows サービスの現在の状態を表示するには、コマンド "sc query state= all type= service" を使用します。

Exchange サービスと LocalSystem アカウント

Exchange Server 2003 のサービスは、LocalSystem アカウントで実行されます。これには、次のようなセキュリティ上の影響があります。

  • 追加のサービス アカウントやパスワードの変更が不要   LocalSystem アカウント (NT AUTHORITY\LocalSystem) は、必ず存在し、パスワードはランダムな 16 進数です。このパスワードは 7 日ごとに自動的に変更されるため、Exchange Server 2003 のインストール前に Active Directory にサービス アカウントを作成したり、サービス パスワードを頻繁に変更したりする必要がありません。

  • すべてのローカル リソースに対するフル コントロール   Exchange Server 2003 サービスはすべてのローカル リソースに対してフル コントロールを持つため、通常これらのサービスは、レジストリ データベース、IIS メタベース、およびファイル システムに対して無制限のアクセスが可能です。ただし、特別な Windows アカウントである SYSTEM、または Everyone アカウントが明示的にアクセスを拒否される場合は、無制限のアクセスができないため、この構成は推奨できません。したがって、Exchange 2003 がドメイン コントローラにインストールされた場合、Exchange Server 2003 のサービスは Active Directory に対するフル アクセスを持つことになります。これは、ドメイン コントローラがディレクトリ レプリカをホストし、LocalSystem にはローカル リソースへの完全なアクセス権があるためです。

    注意

    セキュリティを重視する多くの組織では、ドメイン コントローラに Exchange Server 2003 をインストールしません。このようにインストールすると Exchange Server 2003 と Active Directory の分割管理が有効にならないためです。

  • LocalSystem によるローカル リソースのみに対するアクセスの有効化   サービスが LocalSystem アカウントで実行されているときは、ネットワーク アクセスのために他のアカウントを使用していない限り、サービスはローカル リソースにのみアクセスできます。したがって、LocalSystem で実行しているサービスは、ネットワーク アクセスのために NetworkService アカウントを使用します。このアカウントの名前は、NT AUTHORITY\NetworkService です。このアカウントにはパスワードはありません。
    NetworkService アカウントは、そのドメイン内のローカル コンピュータのコンピュータ アカウントに相当します。LocalSystem アカウントのセキュリティ コンテキスト内で実行する Exchange サービスは、ネットワーク経由で Active Directory などのドメイン リソースにアクセスするときは、ローカル コンピュータ アカウントの資格情報を使用します。したがって、Exchange Server 2003 の特権はメンバ サーバーではドメイン コントローラよりも大幅に少なくなります。これは、コンピュータ アカウントの特権が既定では非常に少なく、コンピュータ アカウントはどのグループにも属していないためです。コンピュータ アカウントの既定の構成では、Active Directory に対して最小限のアクセスのみを許可しています。
    この問題を解決してコンピュータ アカウントに必要なアクセス許可を付与するために、Exchange Server 2003 は Active Directory に次の 2 つの特別なセキュリティ グループを作成します。

    • Exchange Domain Servers   Exchange Domain Servers は、ドメイン内で Exchange Server を実行しているすべてのサーバーのコンピュータ アカウントを含むグローバル セキュリティ グループです。
    • Exchange Enterprise Servers   Exchange Enterprise Servers は、フォレスト内のすべてのグローバルな Exchange Domain Servers グループを含むローカル セキュリティ グループです。このセキュリティ グループは、ローカル ドメイン内の要求されたリソースに対するアクセス権をすべての Exchange コンピュータに付与します。

    注意

    Exchange Domain Servers セキュリティ グループや Exchange Enterprise Servers セキュリティ グループの名前の変更や移動を行わないでください。また、これらのグループから、Exchange を実行している既存のサーバーのコンピュータ アカウントを削除しないでください。

サービス データベースの検査

レジストリ エディタ (Regedit.exe) で HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services を開き、Exchange サービスの個別のキーを検査すると、MSExchange と共に起動する多くのサービスのサービス キーには類似した値が含まれていることがわかります。次の表に、それらの値の一覧を示します。

Windows サービスの一般的なレジストリ値

種類 説明
DependOnGroup

REG_MULTI_SZ

Windows サービスが依存する、読み込み順序グループの一覧です。グループに依存するサービスは、グループのすべてのメンバのインストールを試みた後で、メンバの少なくとも 1 つが実行されている場合に実行できます。

DependOnService

REG_MULTI_SZ

このサービスが依存する、Windows サービスの名前の一覧です。SCM はこのサービスを開始する前に、これらのサービスを開始する必要があります。この値は、サービスに依存関係がない場合は空の文字列になります。

Description

REG_SZ

サービスについての説明です。この説明は、サービスの目的に関する簡単なコメントです。

DiagnosticsMessageFile

REG_SZ

サービスがアプリケーション イベント ログに書き込むイベントの説明文字列が格納されているリソース DLL の名前です。リソース DLL は、\Program Files\Exchsrvr\Res ディレクトリにあります。

DisplayName

REG_SZ

サービスの識別に使用される表示名です。この文字列の長さは最大で 256 文字です。名前は SCM では大文字と小文字が区別されます。表示名の比較では、常に大文字と小文字の違いは無視されます。

ErrorControl

REG_DWORD

エラーの重大度、およびこのサービスが開始できない場合に行うアクションを指定します。このパラメータによって、次のいずれかの処理が行われます。

  • スタートアップ プログラムはエラーを記録するが、スタートアップ操作は継続する。
  • スタートアップ プログラムはエラーを記録してメッセージを表示するが、スタートアップ操作は継続する。
  • スタートアップ プログラムはエラーを記録する。[前回正常起動時の構成] で起動している場合は、スタートアップ操作を継続する。そうでない場合は、[前回正常起動時の構成] でシステムを再起動する。
  • スタートアップ プログラムは、可能な場合にエラーを記録する。[前回正常起動時の構成] で起動している場合は、システムのスタートアップ操作を取り消す。そうでない場合は、[前回正常起動時の構成] でシステムを再起動する。
FailureActions

REG_BINARY

サービスのそれぞれの失敗に対して SCM が行う必要のあるアクションを挙げます。サービスは、(たとえば、あるサービスが失敗したときに) サービス コントローラに状態を報告しないで停止すると、失敗したと見なされます。

Group

REG_SZ

このサービスがメンバになっている読み込み順序グループの名前です。この値を設定すると、DependOnService の値の設定が上書きされることに注意してください。

ImagePath

REG_EXPAND_SZ

サービスのバイナリ ファイルへの完全修飾パスです。パスにスペースが含まれる場合は、引用符で囲んで正しく解釈されるようにする必要があります。たとえば、"d:\\Program Files\\Exchsvr\\Bin\\mad.exe" のように記述します。

パスには、プログラムの引数を含めることもできます。

ObjectName

REG_SZ

サービスを実行するアカウントの名前を指定します。サービスが LocalService アカウントを使用する場合、このパラメータは NT AUTHORITY\LocalService に設定されます。アカウント名は、DomainName\UserName という形式で指定することもできます。

Start

REG_DWORD

サービスを開始する時期を指定します。SCM は、システムのスタートアップ中に自動的にサービスを開始することも、プロセスの要求に従ってサービスを開始することもできます。この値で、サービスを開始できないことも指定できます。その場合、サービスを開始しようとすると、エラー コード ERROR_SERVICE_DISABLED が返されます。

Tag

REG_DWORD

読み込み順序グループ内のサービスのスタートアップ順序を決定します。タグは、ドライバ サービスについてのみ評価されます。

Type

REG_DWORD

ファイル システム ドライバ、デバイス ドライバ、独自のプロセスを実行するサービス、または 1 つ以上の他のサービスとプロセスを共有するサービスとして、サービスの種類を指定します。MSExchangeSA は、独自のプロセスを実行するサービスの例です。EXIFS は、Exchange 固有のファイル システム ドライバの一例です。

さらに、Exchange サービスには次のようなサブキーが存在することもあります。

  • Diagnostics   このキーは、サービスで提供される可能性があるイベント ログ カテゴリを表す REG_DWORD パラメータです。このキーの下にあるパラメータ名は、リソース識別子番号の後に文字列が続く形式で、たとえば 9 Clean Mailbox のようになります。各パラメータに関連付けられた値は、そのカテゴリに対する診断ログ レベルを表します。通常は、Exchange システム マネージャのサーバー プロパティを介して、これらの値を構成します。[診断ログ] タブでは、さまざまなカテゴリが一覧表示され、選択した値をこれらのパラメータに割り当てます。
  • Enum   このキーには、SCM がサービス データベース内のサービスを列挙するために使用するパラメータが含まれます。たとえば、REG_SZ パラメータ 0 には、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root レジストリ キーのサブキーを参照する値が含まれます。これにより Windows 構成マネージャは、システム起動中に論理デバイスとしてサービスを列挙できます。
  • Parameters   このキーは、サービス固有の構成情報についてのレジストリ パラメータです。Parameters キーには、さらにサブキーが含まれることがあります。
  • Performance   このキーは、パフォーマンス監視用のカウンタを提供します。REG_SZ パラメータ Library は、パフォーマンス カウンタを含む DLL を指定します。パフォーマンス カウンタには、さらにキーが存在します。たとえば、REG_SZ パラメータ PerfIniFile は、個々のパフォーマンス カウンタを定義する .ini ファイルを参照します。
  • Security   このキーは、Security という名前の REG_BINARY パラメータを保持します。このパラメータには、サービスを制御可能なアカウントを指定するサービス セキュリティ記述子が含まれます。たとえば、管理者はサービスを開始および停止するアクセス許可を持ち、一般のユーザーはそのアクセス許可を持たないことを指定できます。

警告

レジストリの編集を誤ると、オペレーティング システムの再インストールを余儀なくされるような重大な問題が発生する可能性があります。レジストリの編集を誤ったために発生した問題は、解決できない場合があります。レジストリを編集する前に、大切なデータはすべてバックアップしてください。