対話型サービス

通常、サービスは、グラフィカル ユーザー インターフェイス (GUI) なしで無人で実行するように設計されたコンソール アプリケーションです。 ただし、一部のサービスでは、ユーザーとの対話が必要になる場合があります。 このページでは、サービスからユーザーと対話するための最適な方法について説明します。

重要

Windows Vista の時点では、サービスはユーザーと直接やり取りできません。 そのため、「対話型サービスの使用」セクションで説明されている手法は、新しいコードでは使用しないでください。

 

サービスから間接的にユーザーと対話する

次の手法を使用して、サポートされているすべてのバージョンのWindowsでサービスからユーザーと対話できます。

  • WTSSendMessage 関数を使用して、ユーザーのセッションにダイアログ ボックスを表示します。

  • 個別の非表示 GUI アプリケーションを作成し、 CreateProcessAsUser 関数を使用して、対話型ユーザーのコンテキスト内でアプリケーションを実行します。 プロセス間通信 (IPC) の一部の方法 (名前付きパイプなど) を使用してサービスと通信するように GUI アプリケーションを設計します。 サービスは GUI アプリケーションと通信して、GUI を表示するタイミングを伝えます。 アプリケーションは、ユーザー操作の結果をサービスに伝え、サービスが適切なアクションを実行できるようにします。 IPC は、適切なアクセス制御リスト (ACL) を使用しない限り、ネットワーク経由でサービス インターフェイスを公開できることに注意してください。

    このサービスがマルチユーザー システムで実行されている場合は、各セッションで実行されるようにアプリケーションを次のキーに追加します: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run。 アプリケーションが IPC に名前付きパイプを使用する場合、サーバーはセッション ID に基づいて各パイプに一意の名前を付けることで、複数のユーザー プロセスを区別できます。

Windows Server 2003 および Windows XP では、次の手法も使用できます。

  • メッセージ ボックスを表示するには、MB_SERVICE_NOTIFICATIONを使用して MessageBox 関数を呼び出します。 これは、単純なステータス メッセージを表示する場合にお勧めします。 サービスの初期化中や HandlerEx ルーチンから MessageBox を呼び出さないでください。別のスレッドから呼び出す場合を除き、SCM にタイムリーに戻ります。

対話型サービスの使用

既定では、サービスは非インターアクティブ ウィンドウステーション を使用し、ユーザーと対話することはできません。 ただし、 対話型サービス では、ユーザー インターフェイスを表示し、ユーザー入力を受け取ることができます。

注意事項

LocalSystem アカウントなどの管理者特権のセキュリティ コンテキストで実行されているサービスは、対話型デスクトップで実行されている他のアプリケーションがこのウィンドウと対話できるため、対話型デスクトップにウィンドウを作成しないでください。 これにより、ログオン ユーザーが実行するすべてのアプリケーションにサービスが公開されます。 また、LocalSystem として実行されているサービスは、 OpenWindowStation または GetThreadDesktop 関数を呼び出して対話型デスクトップにアクセスしないでください。

 

対話型サービスを作成するには、 CreateService 関数を呼び出すときに次の操作を行います。

  1. LocalSystem アカウントのコンテキストでサービスを実行するには、lpServiceStartName パラメーターに NULL を指定します。
  2. SERVICE_INTERACTIVE_PROCESS フラグを指定します。

サービスが対話型サービスとして実行されているかどうかを確認するには、 GetProcessWindowStation 関数を呼び出してウィンドウ ステーションへのハンドルを取得し、 GetUserObjectInformation 関数を 呼び出して、ウィンドウ ステーションに WSF_VISIBLE 属性があるかどうかをテストします。

ただし、次のレジストリ キーには、SERVICE_INTERACTIVE_PROCESSの影響を制御する値 NoInteractiveServices が含まれていることに注意してください。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows

NoInteractiveServices の値の既定値は 1 です。つまり、サービスにSERVICE_INTERACTIVE_PROCESSがあるかどうかに関係なく、対話型の実行は許可されません。 NoInteractiveServices が 0 に設定されている場合、SERVICE_INTERACTIVE_PROCESSを持つサービスは対話形式で実行できます。

Windows 7、Windows Server 2008 R2、Windows XP、Windows Server 2003:NoInteractiveServices の値の既定値は 0 です。つまり、SERVICE_INTERACTIVE_PROCESSを持つサービスは対話形式で実行できます。 NoInteractiveServices が 0 以外の値に設定されている場合、その後開始されたサービスは、SERVICE_INTERACTIVE_PROCESSがあるかどうかに関係なく、対話形式で実行することはできません。

重要

すべてのサービスは、ターミナル サービス セッション 0 で実行されます。 そのため、対話型サービスでユーザー インターフェイスが表示される場合は、セッション 0 に接続したユーザーにのみ表示されます。 対話型ユーザーがセッション 0 に接続されていることを保証する方法がないため、ターミナル サービスまたは高速ユーザー切り替えをサポートするシステムで対話型サービスとして実行するようにサービスを構成しないでください (高速ユーザー切り替えはターミナル サービスを使用して実装されます)。