次の方法で共有


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

この記事は、.NET でホストされているサービスには適用されません。 Microsoft.Extensions.Hosting.BackgroundServiceと Worker Service テンプレートを使用した Windows サービスの最新のコンテンツについては、次を参照してください。

以前 NT サービスと呼ばれる Microsoft Windows サービスを使用すると、独自の Windows セッションで実行される実行時間の長い実行可能アプリケーションを作成できます。 これらのサービスは、コンピューターの起動時に自動的に開始でき、一時停止して再起動でき、ユーザー インターフェイスは表示されません。 これらの機能により、サービスは、サーバー上で使用したり、同じコンピューターで作業している他のユーザーに干渉しない実行時間の長い機能が必要な場合に最適です。 ログオンしているユーザーまたは既定のコンピューター アカウントとは異なる特定のユーザー アカウントのセキュリティ コンテキストでサービスを実行することもできます。 サービスと Windows セッションの詳細については、Windows SDK のドキュメントを参照してください。

サービスとしてインストールされているアプリケーションを作成することで、サービスを簡単に作成できます。 たとえば、パフォーマンス カウンター データを監視し、しきい値に対応するとします。 パフォーマンス カウンター データをリッスンし、アプリケーションをデプロイし、データの収集と分析を開始する Windows サービス アプリケーションを作成できます。

サービスを Microsoft Visual Studio プロジェクトとして作成し、サービスに送信できるコマンドと、それらのコマンドを受信したときに実行する必要があるアクションを制御するコードを定義します。 サービスに送信できるコマンドには、サービスの開始、一時停止、再開、停止が含まれます。カスタム コマンドを実行することもできます。

アプリケーションを作成してビルドしたら、コマンド ライン ユーティリティ InstallUtil.exe を実行し、サービスの実行可能ファイルへのパスを渡すことで、アプリケーションをインストールできます。 その後、 サービス コントロール マネージャー を使用して、サービスの開始、停止、一時停止、再開、構成を行うことができます。 サーバー エクスプローラー[サービス] ノードまたは ServiceController クラスを使用して、これらの同じタスクの多くを実行することもできます。

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

サービス アプリケーションは、いくつかの方法で他の多くのプロジェクトの種類とは異なる方法で機能します。

  • サービス アプリケーション プロジェクトが作成するコンパイル済みの実行可能ファイルは、プロジェクトが意味のある方法で機能する前に、サーバーにインストールする必要があります。 F5 キーまたは F11 キーを押してサービス アプリケーションをデバッグまたは実行することはできません。サービスをすぐに実行したり、そのコードにステップ インしたりすることはできません。 代わりに、サービスをインストールして開始し、サービスのプロセスにデバッガーをアタッチする必要があります。 詳細については、「 方法: Windows サービス アプリケーションをデバッグする」を参照してください。

  • 一部の種類のプロジェクトとは異なり、サービス アプリケーションのインストール コンポーネントを作成する必要があります。 インストール コンポーネントは、サーバーにサービスをインストールして登録し、Windows Services Control Manager を使用してサービスのエントリを作成します。 詳細については、「 方法: サービス アプリケーションにインストーラーを追加する」を参照してください

  • サービス アプリケーションの Main メソッドは、プロジェクトに含まれるサービスに対して Run コマンドを発行する必要があります。 Runメソッドは、適切なサーバー上のサービス コントロール マネージャーにサービスを読み込みます。 Windows サービス プロジェクト テンプレートを使用する場合、このメソッドは自動的に作成されます。 サービスの読み込みは、サービスの開始と同じではないことに注意してください。 詳細については、以下の「サービスの有効期間」を参照してください。

  • Windows サービス アプリケーションは、ログオンしているユーザーの対話型ステーションとは異なるウィンドウ ステーションで実行されます。 ウィンドウ ステーションは、クリップボード、グローバル アトムのセット、およびデスクトップ オブジェクトのグループを含むセキュリティで保護されたオブジェクトです。 Windows サービスのステーションは対話型ステーションではないため、Windows サービス アプリケーション内から発生したダイアログ ボックスは表示されず、プログラムが応答しなくなる可能性があります。 同様に、エラーメッセージは、ユーザーインターフェイスで表示するのではなく、Windowsイベントログに記録されるべきです。

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

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

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

サービスの有効期間

サービスは、有効期間中にいくつかの内部状態を通過します。 まず、サービスが実行されるシステムにインストールされます。 このプロセスでは、サービス プロジェクトのインストーラーが実行され、そのコンピューターの サービス コントロール マネージャー にサービスが読み込まれます。 サービス コントロール マネージャーは、サービスを管理するために Windows によって提供される中心的なユーティリティです。

サービスが読み込まれたら、サービスを開始する必要があります。 サービスを開始すると、サービスが機能し始めるようになります。 サービス コントロール マネージャーサーバー エクスプローラー、または Start メソッドを呼び出してコードからサービスを開始できます。 Start メソッドは、アプリケーションの OnStart メソッドに処理を渡し、そこで定義したすべてのコードを処理します。

実行中のサービスは、停止または一時停止するか、コンピューターがシャットダウンするまで、この状態で無期限に存在できます。 サービスは、 RunningPaused、または Stoppedの 3 つの基本状態のいずれかに存在できます。 サービスは、保留中のコマンド ( ContinuePendingPausePendingStartPending、または StopPending) の状態を報告することもできます。 これらの状態は、実行中のサービスを一時停止するコマンドなど、コマンドが発行されたが、まだ実行されていないことを示します。 Statusにクエリを実行してサービスの状態を判断したり、WaitForStatusを使用してこれらの状態のいずれかが発生したときにアクションを実行したりできます。

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

サービスの種類

.NET Framework を使用して Visual Studio で作成できるサービスは 2 種類あります。 プロセス内で唯一のサービスであるサービスには、 Win32OwnProcess型が割り当てられます。 プロセスを別のサービスと共有するサービスには、 Win32ShareProcess型が割り当てられます。 ServiceType プロパティに対してクエリを実行すると、サービスの種類を取得できます。

Visual Studio で作成されていない既存のサービスに対してクエリを実行すると、他のサービスの種類が表示されることがあります。 これらの詳細については、 ServiceTypeを参照してください。

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

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

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

要求事項

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

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

こちらも参照ください