Windows サービス アプリケーションの概要
更新 : 2007 年 11 月
Microsoft Windows サービス (旧 NT サービス) を使用すると、Microsoft Windows サービス自体の Windows セッションで長時間にわたって実行されるアプリケーションを作成できます。作成したサービスは、コンピュータのブート時に自動的に起動させることができます。また、サービスを一時停止したり、再起動したりすることもできます。このサービスはユーザー インターフェイスを表示しません。このような特徴があるため、サービスはサーバー上で使用するのに適しており、コンピュータを共用する他のユーザーの邪魔をせずに長時間稼動させる機能を実現するのに最適です。また、ログオン ユーザーや既定のコンピュータ アカウントとは異なる、特定のユーザー アカウントのセキュリティ コンテキストでサービスを実行することもできます。サービスと Windows セッションの詳細については、MSDN ライブラリのプラットフォーム SDK ドキュメントの「サービスについて」セクションを参照してください。
メモ : |
---|
Windows サービスのテンプレートおよび関連する機能は、Visual Studio の Standard Edition では使用できません。 |
サービスは、サービスとしてインストールするアプリケーションを作成することで簡単に作成できます。たとえば、パフォーマンス カウンタのデータを監視し、しきい値を基準にした処理を行うとします。この場合、パフォーマンス カウンタのデータを取得する Windows サービス アプリケーションを作成し配置して、データの収集と分析を行うことができます。
サービスは、Microsoft Visual Studio のプロジェクトとして作成します。サービスには、サービスに送信できるコマンドと、コマンド受信時に行うアクションとを制御するコードを定義します。サービスに送信できるコマンドには、サービスの起動コマンド、一時停止コマンド、再開コマンド、および停止コマンドがあります。また、カスタム コマンドも実行できます。
アプリケーションの作成後、コマンド ライン ユーティリティの InstallUtil.exe を実行してサービスの実行可能ファイルのパスを指定するか、または Visual Studio の配置機能を使用することで、アプリケーションをインストールできます。アプリケーションをインストールすると、サービス コントロール マネージャを使用して、サービスを起動、停止、一時停止、再開、および設定できるようになります。サーバー エクスプローラの [サービス] ノード、または ServiceController クラスを使用して、これらの作業を行うこともできます。
サービス アプリケーションとその他の Visual Studio アプリケーション
サービス アプリケーションの動作は、次に示すように、他のプロジェクトと異なります。
サービス アプリケーション プロジェクトが作成するコンパイル済み実行可能ファイルは、プロジェクトの使用開始前にサーバーにインストールしておく必要があります。F5 キーまたは F11 キーを押してサービス アプリケーションをデバッグまたは実行することはできません。サービスを即時に実行したり、サービスのコードにステップ インすることはできません。サービスのインストールと起動を行ってから、デバッガをサービスのプロセスにアタッチする必要があります。詳細については、「方法 : Windows サービス アプリケーションをデバッグする」を参照してください。
一部のプロジェクトの場合とは異なり、サービス アプリケーションのインストール コンポーネントは必ず作成する必要があります。インストール コンポーネントは、サーバーへのサービスのインストールと登録を行い、Windows サービス コントロール マネージャでサービスのエントリを作成します。詳細については、「方法 : サービス アプリケーションにインストーラを追加する」を参照してください。
サービス アプリケーションの Main メソッドは、プロジェクトに含まれているサービスの Run コマンドを実行する必要があります。Run メソッドによって、適切なサーバーのサービス コントロール マネージャにサービスが読み込まれます。Windows サービスのプロジェクト テンプレートを使用すると、このメソッドは自動的に作成されます。サービスの読み込みとサービスの起動は異なります。詳細については、後述の「サービスの有効期間」を参照してください。
Windows サービス アプリケーションは、ログオン ユーザーの対話型ステーションとは異なるウィンドウ ステーションで実行されます。ウィンドウ ステーションは、クリップボード、グローバルなアトムのセット、およびデスクトップ オブジェクトのグループを含む安全なオブジェクトです。Windows サービスのステーションは対話型ステーションではないので、Windows サービス アプリケーションから出力されたダイアログ ボックスは表示されず、プログラムの応答が停止することがあります。同様に、エラー メッセージもユーザー インターフェイスに出力されるのではなく、Windows イベント ログに記録されます。
.NET Framework でサポートされている Windows サービスのクラスは、対話型ステーション、つまりログオン ユーザーとの対話をサポートしていません。また、.NET Framework には、ステーションおよびデスクトップを表すクラスが含まれていません。Windows サービスが他のステーションと対話する必要がある場合は、アンマネージ Windows API にアクセスする必要があります。詳細については、プラットフォーム SDK の「Window Stations」および「Desktops」を参照してください。
Windows サービスとユーザーまたは他のステーションとの対話は、ログオン ユーザーがいない場合やユーザーが予期しないデスクトップ オブジェクトのセットを持っている場合などのシナリオにも対応できるように注意してデザインする必要があります。場合によっては、ユーザーの制御下で実行される Windows アプリケーションを書いた方がより適切であることもあります。
Windows サービス アプリケーションは、独自のセキュリティ コンテキストで実行され、Windows サービス アプリケーションがインストールされている Windows コンピュータにユーザーがログインする前に起動されます。サービスを実行するユーザー アカウントは慎重に検討する必要があります。システム アカウントで実行されるサービスには、ユーザー アカウントで実行される場合より多くのアクセス許可とアクセス特権が認められます。
サービスの有効期間
サービスの内部状態は、有効期間内でさまざまに変化します。まず初めに、サービスを実行するシステムにインストールされます。このプロセスでは、サービス プロジェクトのインストーラが実行され、ターゲット コンピュータのサービス コントロール マネージャにサービスが読み込まれます。サービス コントロール マネージャは、サービス管理の中核となる Windows 標準ユーティリティです。
サービスが読み込まれた後で、サービスを起動します。サービスを起動すると、サービスが動作できるようになります。サービスは、サービス コントロール マネージャから起動することも、サーバー エクスプローラから起動することも、コードから Start メソッドを呼び出して起動することもできます。Start メソッドは、処理をアプリケーションの OnStart メソッドに渡し、このメソッドに定義されている処理を実行します。
実行中のサービスは、サービスの停止や一時停止が指示されたり、コンピュータがシャットダウンされるまで、実行中の状態を維持できます。サービスの基本的な状態は、Running、Paused、または Stopped です。サービスは保留中のコマンドの状態 (ContinuePending、PausePending、StartPending、または StopPending) も報告できます。これらの状態は、実行中のサービスを一時停止するコマンドなどが実行されたが、まだ完了していない状態を表します。Status を問い合わせるとサービスがどの状態にあるかを判別でき、WaitForStatus を使用するとこのいずれかの状態になったときに処理を実行できます。
サービスの一時停止、停止、および再開は、サービス コントロール マネージャまたはサーバー エクスプローラで実行できます。また、コードでメソッドを呼び出して実行することもできます。これらのアクションは、サービスの中でそれぞれ対応するプロシージャ (OnStop、OnPause、または OnContinue) を呼び出すことができます。これらのプロシージャには、サービスの状態が変化したときに実行する追加処理を定義できます。
サービスの種類
Visual Studio で .NET Framework を使用して作成できるサービスには 2 種類あります。プロセスを占有するサービスには、Win32OwnProcess 型が割り当てられます。他のサービスとプロセスを共有するサービスには、Win32ShareProcess 型が割り当てられます。サービスの種類は、ServiceType プロパティを問い合わせて取得できます。
Visual Studio 以外で作成された既存のサービスを問い合わせた場合は、これ以外のサービスの種類が割り当てられていることもあります。それらの詳細については、「ServiceType」を参照してください。
サービスと ServiceController コンポーネント
ServiceController コンポーネントは、インストール済みのサービスに接続し、サービスの状態を操作するときに使用します。ServiceController コンポーネントを使用すると、サービスの起動と停止、およびサービスの一時停止と継続を実行できます。また、カスタム コマンドをサービスに送信することもできます。ただし、サービス アプリケーションを作成する場合は、ServiceController コンポーネントを使用する必要はありません。ほとんどの場合は、サービスを定義している Windows サービス アプリケーションとは別のアプリケーションに ServiceController コンポーネントが含まれています。
ServiceController コンポーネントの詳細については、「Windows サービスの監視」を参照してください。
サービスの配置とインストール
Visual Studio には、サービス アプリケーションに関連付けられたリソースをインストールできるインストール コンポーネントが組み込まれています。インストール コンポーネントは、サービスをインストール先システムに登録し、サービス コントロール マネージャにサービスの存在を知らせます。
アプリケーションにインストーラを追加した後、次の手順として、コンパイルされたプロジェクト ファイルをインストールし、サービスのインストールに必要なインストーラを実行するセットアップ プログラムを作成します。完全なセットアップ プロジェクトを作成するには、サービス プロジェクトの出力をセットアップ プロジェクトに追加し、サービスをインストールするカスタム処理を追加する必要があります。セットアップ プロジェクトの詳細については、「セットアップ プロジェクト」を参照してください。カスタム動作の詳細については、「チュートリアル : カスタム動作の作成」を参照してください。
必要条件
サービスは、Windows サービス アプリケーション プロジェクトなどの .NET Framework 対応プロジェクト内で作成する必要があります。.NET Framework 対応プロジェクトは、ビルド時に .exe ファイルを作成し、ServiceBase クラスから継承を行います。
Windows サービスを含むプロジェクトには、プロジェクトのインストール コンポーネントと、プロジェクトのサービスのインストール コンポーネントが必要です。これは [プロパティ] ウィンドウで簡単に設定できます。詳細については、「方法 : サービス アプリケーションにインストーラを追加する」を参照してください。
参照
処理手順
方法 : Windows サービス アプリケーションをデバッグする
チュートリアル : コンポーネント デザイナによる Windows サービス アプリケーションの作成
方法 : サービス アプリケーションにインストーラを追加する