コメント セクションの「Lex Li」で既に示されているように、セッション 0 で実行されているプロセス (ローカル IIS のアプリケーション) が UI を要求すると、UI はユーザー セッションに表示されません。ユーザーの観点からは、アプリケーションはハングしているように見えますが、実際にはアプリケーションはまったく正常に実行されており、ユーザーには表示されないユーザーの応答を辛抱強く待っています。
Windows Vista 以降では、セッション 0 がサービスとユーザー モード ドライバー用に作成されます。セッション 1 は、ログインする最初のユーザー用に作成されます。このユーザーのアプリケーションはセッション 1 で実行されます。
次の例を考えてみましょう。アプリケーションに属するサービスがセッション 0 で UI 要素を生成する場合、たとえばダイアログ ボックスでユーザーが [OK] または [キャンセル] をクリックするのを待っている場合、アプリケーションはサービスを待機しています。 UI はユーザー セッションに表示されません。ユーザーの観点からは、アプリケーションはハングしているように見えますが、実際にはアプリケーションはまったく正常に実行されており、ユーザーには表示されないユーザーの応答を辛抱強く待っています。
ご想像のとおり、これはユーザー、管理者、および開発者に問題をもたらします。ただし、考慮すべき簡単な緩和要因がいくつかあります。
アプリケーションのサービスが UI を使用する場合、組み込みの軽減策 (Windows Vista 以降) により、ユーザーは特別なデスクトップでセッション 0 UI を操作できます。これにより、セッション 0 デスクトップ全体ではなく、アプリケーション固有の UI が使用可能になります。
アプリケーションがグローバルな名前のオブジェクトを作成する場合は、Windows XP 互換モードを使用して、アプリケーションが引き続きセッション 0 サービスを使用できるようにします。
Windows Vista 以降との互換性についてアプリケーションをテストする場合は、次のテスト シナリオを考慮してください。
ターミナル サーバー モードまたはユーザーの簡易切り替え (FUS) モードの Windows XP でアプリケーションをテストおよび検証します。これらのシナリオでアプリケーションが Windows XP で適切に動作する場合、Windows Vista でも動作する可能性が非常に高くなります。
Window XP 互換モードを適用した後、アプリケーションが適切に機能することを確認します。これには、セッション 0 の問題の一部に対する軽減策が含まれています。
ドライバーをテストして (Windows Vista 以降)、正しく動作することを確認します。それが不可能な場合は、FUS を有効にし、複数のユーザーがログオンしている Windows XP でドライバーをテストします。ドライバーが 2 番目以降のログオン ユーザーに対して正しく機能する場合は、Session 0 の変更による影響を受けない可能性があります (Windows Vista 以降)。このテストで検出されない唯一の問題は、セッション 0 (Windows Vista 以降) にビデオ ドライバーがないことに関連するものです。
最後に、次の Windows Vista 以降の機能ソリューションを活用できます。
リモート プロシージャ コール (RPC) や名前付きパイプなどのクライアントまたはサーバー メカニズムを使用して、サービスとアプリケーション間の通信を行います。
関数を使用WTSSendMessage
して、ユーザーのデスクトップに簡単なメッセージ ボックスを作成します。これにより、サービスはユーザーに通知を送信し、簡単な応答を要求できます。
より複雑な UI の場合は、CreateProcessAsUser
関数を使用して、ユーザーのセッションでプロセスを作成します。
イベントやマップされたメモリなど、サービスによって使用可能になる名前付きオブジェクトに対して、Local\
または名前空間のいずれかを明示的に選択します。Global\
これで、Session 0 の分離が Windows Vista 以降のアプリケーションの互換性にどのように影響するかを簡単に確認できます。
注 : Application Compatibility – Session 0 Isolationからコピー。詳細については、このリンクを確認してください。