対話型サービス
通常、サービスは、グラフィカル ユーザー インターフェイス (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 関数を呼び出すときに次の操作を行います。
- LocalSystem アカウントのコンテキストでサービスを実行するには、lpServiceStartName パラメーターに NULL を指定します。
- 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 に接続されていることを保証する方法がないため、ターミナル サービスまたは高速ユーザー切り替えをサポートするシステムで対話型サービスとして実行するようにサービスを構成しないでください (高速ユーザー切り替えはターミナル サービスを使用して実装されます)。