対話型サービス
通常、サービスは、グラフィカル ユーザー インターフェイス (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 に接続されていることを保証する方法がないため、ターミナル サービスまたは高速ユーザー切り替えをサポートするシステムで対話型サービスとして実行するようにサービスを構成しないでください (高速ユーザー切り替えはターミナル サービスを使用して実装されます)。