Windows サービス アプリケーションの概要

警告

このドキュメントは、最新版の Windows サービスは対象としていません。 BackgroundService を使用した Windows サービスの最新のコンテンツと Worker サービス テンプレートについては、次を参照してください。

Microsoft Windows サービス (旧 NT サービス) を使用すると、Microsoft Windows サービス自体の Windows セッションで長時間にわたって実行されるアプリケーションを作成できます。 作成したサービスは、コンピューターのブート時に自動的に起動させることができます。また、サービスを一時停止したり、再起動したりすることもできます。このサービスはユーザー インターフェイスを表示しません。 このような特徴があるため、サービスはサーバー上で使用するのに適しており、コンピューターを共用する他のユーザーの邪魔をせずに長時間稼動させる機能を実現するのに最適です。 また、ログオン ユーザーや既定のコンピューター アカウントとは異なる、特定のユーザー アカウントのセキュリティ コンテキストでサービスを実行することもできます。 サービスと Windows セッションの詳細については、Windows SDK ドキュメントを参照してください。

サービスは、サービスとしてインストールするアプリケーションを作成することで簡単に作成できます。 たとえば、パフォーマンス カウンターのデータを監視し、しきい値を基準にした処理を行うとします。 この場合、パフォーマンス カウンターのデータを取得する Windows サービス アプリケーションを作成し配置して、データの収集と分析を行うことができます。

サービスは、Microsoft Visual Studio のプロジェクトとして作成します。サービスには、サービスに送信できるコマンドと、コマンド受信時に行うアクションとを制御するコードを定義します。 サービスに送信できるコマンドには、サービスの起動コマンド、一時停止コマンド、再開コマンド、および停止コマンドがあります。また、カスタム コマンドも実行できます。

アプリケーションを作成してビルドした後に、コマンド ライン ユーティリティの InstallUtil.exe を実行してサービスの実行可能ファイルのパスを指定することで、アプリケーションをインストールできます。 アプリケーションをインストールすると、サービス コントロール マネージャーを使用して、サービスを起動、停止、一時停止、再開、および設定できるようになります。 サーバー エクスプローラー[サービス] ノード、または ServiceController クラスを使用して、これらの作業を行うこともできます。

サービス アプリケーションと他の Visual Studio アプリケーション

サービス アプリケーションの動作は、次に示すように、他のプロジェクトと異なります。

  • サービス アプリケーション プロジェクトが作成するコンパイル済み実行可能ファイルは、プロジェクトの使用開始前にサーバーにインストールしておく必要があります。 F5 キーまたは F11 キーを押してサービス アプリケーションをデバッグまたは実行することはできません。サービスを即時に実行したり、サービスのコードにステップ インすることはできません。 サービスのインストールと起動を行ってから、デバッガーをサービスのプロセスにアタッチする必要があります。 詳細については、Windows サービス アプリケーションをデバッグする

  • 一部のプロジェクトの場合とは異なり、サービス アプリケーションのインストール コンポーネントは必ず作成する必要があります。 インストール コンポーネントは、サーバーへのサービスのインストールと登録を行い、Windows サービス コントロール マネージャーでサービスのエントリを作成します。 詳細については、サービス アプリケーションにインストーラーを追加する」を参照してください。

  • サービス アプリケーションの Main メソッドは、プロジェクトに含まれているサービスの Run コマンドを実行する必要があります。 Run メソッドによって、適切なサーバーのサービス コントロール マネージャーにサービスが読み込まれます。 Windows サービスのプロジェクト テンプレートを使用すると、このメソッドは自動的に作成されます。 サービスの読み込みとサービスの起動は異なります。 詳細については、後述の「サービスの有効期間」を参照してください。

  • Windows サービス アプリケーションは、ログオン ユーザーの対話型ステーションとは異なるウィンドウ ステーションで実行されます。 ウィンドウ ステーションは、クリップボード、グローバルなアトムのセット、およびデスクトップ オブジェクトのグループを含む安全なオブジェクトです。 Windows サービスのステーションは対話型ステーションではないので、Windows サービス アプリケーションから出力されたダイアログ ボックスは表示されず、プログラムの応答が停止することがあります。 同様に、エラー メッセージもユーザー インターフェイスに出力されるのではなく、Windows イベント ログに記録されます。

    .NET Framework でサポートされている Windows サービスのクラスは、対話型ステーション、つまりログオン ユーザーとの対話をサポートしていません。 また、.NET Framework には、ステーションおよびデスクトップを表すクラスが含まれていません。 Windows サービスが他のステーションと対話する必要がある場合は、アンマネージ Windows API にアクセスする必要があります。 詳細については、Windows SDK ドキュメントを参照してください。

    Windows サービスとユーザーまたは他のステーションとの対話は、ログオン ユーザーがいない場合やユーザーが予期しないデスクトップ オブジェクトのセットを持っている場合などのシナリオにも対応できるように注意してデザインする必要があります。 場合によっては、ユーザーの制御下で実行される Windows アプリケーションを書いた方がより適切であることもあります。

  • Windows サービス アプリケーションは、独自のセキュリティ コンテキストで実行され、Windows サービス アプリケーションがインストールされている Windows コンピューターにユーザーがログインする前に起動されます。 サービスを実行するユーザー アカウントは慎重に検討する必要があります。システム アカウントで実行されるサービスには、ユーザー アカウントで実行される場合より多くのアクセス許可とアクセス特権が認められます。

サービスの有効期間

サービスの内部状態は、有効期間内でさまざまに変化します。 まず初めに、サービスを実行するシステムにインストールされます。 このプロセスでは、サービス プロジェクトのインストーラーが実行され、ターゲット コンピューターのサービス コントロール マネージャーにサービスが読み込まれます。 サービス コントロール マネージャーは、サービス管理の中核となる Windows 標準ユーティリティです。

サービスが読み込まれた後で、サービスを起動します。 サービスを起動すると、サービスが動作できるようになります。 サービスは、サービス コントロール マネージャーから起動することも、サーバー エクスプローラーから起動することも、コードから Start メソッドを呼び出して起動することもできます。 Start メソッドは、処理をアプリケーションの OnStart メソッドに渡し、このメソッドに定義されている処理を実行します。

実行中のサービスは、サービスの停止や一時停止が指示されたり、コンピューターがシャットダウンされるまで、実行中の状態を維持できます。 サービスの基本的な状態は、RunningPaused、または Stopped です。 サービスは保留中のコマンドの状態 (ContinuePendingPausePendingStartPending、または StopPending) も報告できます。 これらの状態は、実行中のサービスを一時停止するコマンドなどが実行されたが、まだ完了していない状態を表します。 Status を問い合わせるとサービスがどの状態にあるかを判別でき、WaitForStatus を使用するとこのいずれかの状態になったときに処理を実行できます。

サービスの一時停止、停止、および再開は、サービス コントロール マネージャーまたはサーバー エクスプローラーで実行できます。また、コードでメソッドを呼び出して実行することもできます。 これらのアクションは、サービスの中でそれぞれ対応するプロシージャ (OnStopOnPause、または OnContinue) を呼び出すことができます。これらのプロシージャには、サービスの状態が変化したときに実行する追加処理を定義できます。

サービスの種類

Visual Studio で .NET Framework を使用して作成できるサービスには 2 種類あります。 プロセスを占有するサービスには、Win32OwnProcess 型が割り当てられます。 他のサービスとプロセスを共有するサービスには、Win32ShareProcess 型が割り当てられます。 サービスの種類は、ServiceType プロパティを問い合わせて取得できます。

Visual Studio 以外で作成された既存のサービスを問い合わせた場合は、これ以外のサービスの種類が割り当てられていることもあります。 それらの詳細については、「ServiceType」を参照してください。

サービスと ServiceController コンポーネント

ServiceController コンポーネントは、インストール済みのサービスに接続し、サービスの状態を操作するときに使用します。ServiceController コンポーネントを使用すると、サービスの起動と停止、およびサービスの一時停止と継続を実行できます。また、カスタム コマンドをサービスに送信することもできます。 ただし、サービス アプリケーションを作成する場合は、ServiceController コンポーネントを使用する必要はありません。 ほとんどの場合は、サービスを定義している Windows サービス アプリケーションとは別のアプリケーションに ServiceController コンポーネントが含まれています。

詳細については、「ServiceController」を参照してください。

必要条件

  • サービスは、Windows サービス アプリケーション プロジェクトなどの .NET Framework 対応プロジェクト内で作成する必要があります。 .NET Framework 対応プロジェクトは、ビルド時に .exe ファイルを作成し、ServiceBase クラスから継承を行います。

  • Windows サービスを含むプロジェクトには、プロジェクトのインストール コンポーネントと、プロジェクトのサービスのインストール コンポーネントが必要です。 これは [プロパティ] ウィンドウで簡単に設定できます。 詳細については、サービス アプリケーションにインストーラーを追加する」を参照してください。

関連項目