EternalWindows
サービス / サービスの意義

Windowsにおいてサービスという言葉を用いる場合、 それは通常のアプリケーションよりも少しシステム寄りのアプリケーション であると解釈されることがよくあります。 事実、Windowsに最初から存在するサービスはシステムの重要な機能を担っており、 サービスが起動されていないときは、何らかのエラーが発生することも考えられます。 ただし、自分でサービスを開発することになった場合は、 このようなシステム機能を必ずしも実装する必要はありません。 基本的には、以下に示すようなサービス独自の特徴が必要になったときに、 アプリケーションをサービスとして開発することを検討するとよいでしょう。

まず、サービスは、ローカルシステムアカウントとして動作できる特徴があります。 ローカルシステムアカウントは最も高位なアカウントであり、 ほぼ全てのファイルやレジストリキーは、ローカルシステムアカウントへのアクセスを許可しています。 そのため、ローカルシステムアカウントでコードを実行すれば、 リソースへのアクセスが失敗することは基本的にありません。 さらに、ローカルシステムアカウントのトークンは、全ての特権が最初から割り当てられています。 このため、特権が必要となる関数を呼び出す場合は、 特権を有効にするだけでよく(多くの特権は最初から有効になっていますが)、 特権を割り当てる関数を呼び出す必要はありません。

1つ目のリソースのアクセスについては、 コンピュータの管理者としてコードを実行していればそれほど悩むことでもありませんが、 2つ目の特権については、管理者のアカウントでは限界があります。 確かに、管理者はLsaAddAccountRights関数を呼び出すことで、 任意の特権を割り当てることができますが、 これは、ユーザーの合意がある場合のみ行うべきことです。 プロセスが、特定の関数を呼び出したいがために勝手に特権を追加したとなると、 そのプロセスと同じアカウントで動作するプロセスも呼び出せる関数が増えてしまうため、 ユーザーからすればそのプロセスは一種のウイルスに見えるでしょう。 ローカルシステムアカウントとして動作すれば、特権問題に悩むこともなくなります。

次に、サービスはシステムの起動時と共に自動で実行できる利点があります。 これにより、ユーザーが明示的にサービスを起動する手間が省くことができます。 このシステムの起動時というタイミングを正確に述べると、 ユーザーがログオンする前、より正確にはWinlogonがGINAをロードする前となります。 サービスがシステムの重要な機能を担っているということから、 サービスによっては他のサービスが事前に起動されていなければ、 自身を起動してはならないような場合も生じます。 このような依存関係の問題は、自動起動のサービスを作成する場合は、 強く認識しておかなければなりません。

次に、サービスにはインストールという概念があります。 サービスをインストールするとは、そのサービスの情報、たとえばEXEへのフルパスや、 自動起動するかどうかなどの情報をレジストリに書き込むことであり、 これを行うことで作成したEXEがサービスがとして認識されることになります。 一般にサービスを開発する際には、サービスアプリケーション本体と、 サービスをインストールするアプリケーションの2つを作成することになります。 サービスをインストールするには、管理者アカウントで実行する必要があります。

サービスは他のプログラムから制御することも可能となっています。 サービスは、開始、一時停止、停止などの制御コードを受け取ることができ、 その要求に応じて自身の状態を変更します。 既に述べたようにサービスはシステムの起動と共に実行できますが、 中にはユーザーによって明示的に実行されるサービスもあります。 このようなときユーザーは、サービスに「開始」の制御コードを送ることにより 目的のサービスを実行します。 サービスを制御するプログラムはSCPと呼ばれ、 コントロールパネル/システムとメンテナンス/管理ツールから、 サービスという名のプログラムをクリックすると、 Windows付属のSCPを起動することができます。

Windows付属のSCPは、インストールされている全てのサービスを表示します。 スタートアップの種類には、手動、自動、無効のいずれかが入りますが、 自動となっているときは、状態が開始となっていることが分かります。 図ではファイアウォールを実装するサービスを示していますが、 このようなサービスはあらゆるプログラムより先立って実行しなければ 不正なアクセスを検出できないため、自動で起動するようインストールされているのでしょう。 サービスが一時停止の制御コードを受信するよう設計されている場合は、 「サービスの一時停止」という項目も表示されることになります。 開始状態でないサービスは、「サービスの開始」を選択することで実行することができます。

さて、これらサービスの特徴についてよく考えてみると、 サービスとは、サーバーアプリケーションの開発と大変相性がよいことが分かります。 サーバーは、クライアントからの要求を処理し、 その結果をクライアントに返すというのが基本的な役目ですが、 そのためにはサーバーが常に実行し続けているのが絶対条件です。 サービスの自動起動の特徴を利用すれば、この問題を案じることはありません。

また、サービスはクライアントの要求によって、 様々なリソースへのアクセスが発生することがありますが、 ローカルシステムアカウントとして動作していればアクセスの失敗の恐れもありません。 ときとして、サービスはクライアントのアカウントでリソースへのアクセスを 試みる必要もありますが、そのようなときには偽装という選択肢を取るとよいでしょう。

そして、サービスはSCP経由で制御することができました。 SCPはリモートコンピュータのサービスにも制御コードを送ることができ、 サーバーをサービスとして実装してれば、リモートからのサーバーの調整が可能です。 一般には、サーバーマシンの前に常に人が立っているようことはありませんから、 リモートからのサーバーの調整はサーバーの管理を大変容易にします。


戻る