次の方法で共有


ユーザーの簡易切り替えとリモート デスクトップを使用するユーザー アカウント

Windows XP ユーザー アカウントを使用すると、複数のユーザーが同時にログオンし、各ユーザーが独自の設定を使用して独自のアプリケーションを実行できます。 ユーザーの簡易切り替え機能を使用すると、別のユーザーがアクセスできるようにするために、あるユーザーがログオフする必要がないため、各ユーザーのデスクトップに簡単にアクセスできます。 ユーザー アカウントには、Personal Terminal Server 機能、つまりリモート デスクトップも含まれています。これにより、ユーザーは、リモート システムから自分のデスクトップ アカウントにアクセスできます。

次のトピックについて説明します。

インフラストラクチャの使用要件

Windows 2000 から継承された基になるインフラストラクチャでは、ユーザー データ、ユーザー設定、コンピューター設定の状態の分離がサポートされています。 このインフラストラクチャを利用して、Windows XP でアプリケーションを正常に実行するには、次の要件を満たす必要があります。

  • ユーザーが作成したデータを格納する既定のフォルダーをマイ ドキュメント にする。
  • アプリケーション データを正しく分類して格納する。
  • "アクセスが拒否されました" メッセージが表示された場合、適切に機能低下状態にする。

一時ファイル、メモリ マップ済みファイル、ドキュメントはすべて、ユーザーのプロファイル ディレクトリの適切なサブディレクトリに格納する必要があります。 これらのファイルの適切な保存場所を決定するには、SHGetFolderLocation または SHGetFolderPath を使用します。 これらの関数に CSIDL_APPDATA フラグを渡すと、アプリケーション固有データの共通リポジトリとして機能するファイル システム ディレクトリのパスが返されます。 一時ファイルなど、ユーザーが変更されたときに変更する必要があるデータには、CSIDL_APPDATA の代わりにフラグ CSIDL_LOCAL_APPDATA を使用します。

上記の要件は、Microsoft Certification プログラムの要件の一部です。 詳細については、「Windows デスクトップ アプリの認定要件」ページを参照してください。

既存のアプリケーションとの互換性

ユーザーの簡易切り替えと Personal Terminal Server は両方ともターミナル サービス テクノロジを使用するため、以前のほとんどの Microsoft Win32 アプリケーションと互換性があります。 アプリケーションが Windows 2000 ロゴに準拠しており、基本的なプロファイル分離機能と電源管理機能を実装している場合、そのアプリケーションは、個々の Windows XP ユーザー アカウントで正常に実行されます。

セッション切り替え通知の登録

通常、デスクトップの切り替えが発生しても、アプリケーションに通知する必要はありません。 ただし、シリアル ポートやその他の共有リソースにアクセスするアプリケーションなど、そのアプリケーションが実行されているアカウントが現在のデスクトップである場合に通知を受ける必要があるアプリケーションは、デスクトップ切り替え通知に登録できます。 通知に登録するには、WTSRegisterSessionNotification 関数を使用します。

この関数が呼び出されると、ハンドル hWnd を持つウィンドウが登録され、WndProc 関数を介して WM_WTSSESSION_CHANGE メッセージを受信できるようになります。 セッション ID は lParam パラメータで送信され、メッセージを生成したイベントを示すコードは、次のフラグのいずれかとして wParam で送信されます。

  • WTS_CONSOLE_CONNECT
  • WTS_CONSOLE_DISCONNECT
  • WTS_REMOTE_CONNECT
  • WTS_REMOTE_DISCONNECT
  • WTS_SESSION_LOGOFF
  • WTS_SESSION_LOGON

アプリケーションでは、このメッセージを使用して、状態を追跡するだけでなく、コンソール固有のリソースを解放および取得することもできます。 ユーザー デスクトップは、リモート コントロールとコンソール コントロールの間で動的に切り替えることができます。 アプリケーションでは、WM_WTSSESSION_CHANGE メッセージを使用して、リモートまたはローカルの接続状態と同期する必要があります。

プロセスでこれらの通知が不要になった場合、またはプロセスを終了する場合、WTSUnRegisterSessionNotification を呼び出して、その通知の登録を解除する必要があります。

重要

WTSRegisterSessionNotification に渡される hWnd 値は参照カウントされるため、割り当てられたすべてのリソースを確実に解放するには、WTSUnRegisterSessionNotification を同じ回数呼び出す必要があります。

 

確実にアプリケーションの 1 つのインスタンスのみが実行されるようにする

多くのアプリケーションでは、確実にアプリケーションの 1 つのインスタンスのみが実行されるようにする必要があります。 Windows XP では、これを行うための方法がいくつかあります。 その中には次のようなものがあります。

  • FindWindow または FindWindowEx を使用して、アプリケーションによって開かれる既知のウィンドウを検索します。 そのウィンドウが既に開かれている場合、それを、アプリケーションが既に実行されていることを示す表示として使用できます。
  • アプリケーションが開かれるときにミューテックスまたはセマフォ オブジェクトを作成し、アプリケーションが終了するときにそのオブジェクトを閉じます。 グローバル オブジェクトの名前空間はデスクトップごとに分離されており、それぞれにミューテックスおよびセマフォ オブジェクトの一意のリストを作成できます。

すべてのセッションでアプリケーションをシャットダウンする

アプリケーションでは、すべてのセッションで自動的にシャットダウンすることが必要になる場合があります。 たとえば、2 つ以上のセッションで同時に実行されているアプリケーションが、Web から新しいファイルをダウンロードするとします。 その後、それ自体を閉じて、更新されたビットで再起動することが必要になる可能性があります。 もちろん、これは実行中のすべてのセッションで行う必要があります。 アプリケーションは、通知を受信したときに正常に終了するように作成する必要があります。

システム サービスとの対話

プログラムの観点から、次のようなケースに対処する必要があります。

  • サーバー プロセスはクライアント プロセスから直接要求を受け取ります。

    この場合、メッセージはローカル プロシージャ コール (LPC) またはリモート プロシージャ コール (RPC) を使用して送信される可能性があります。 クライアント トークンの取得を可能にする LPC または RPC 用の API があります。 クライアント トークンを取得すると、サーバーは、それを CreateProcessAsUser の呼び出しで使用できます。 これにより、クライアント ユーザー トークンにセッション タグが含まれていると仮定して (そうである必要があります)、正しいウィンドウ ステーションでプロセスが起動されます。

    Note

    現時点では、CreateProcessAsUser では、セッション間でのハンドル継承はサポートされていません。

     

  • サーバー プロセスは通知を受け取り、UI を表示する必要がありますが、表示は現在のユーザーのコンテキストに存在する必要はありません。

    この場合、サーバー プロセスはプライマリ プロセス トークンを複製し、問題のセッション ID を現在のセッション ID と一致するように変更できます。 WTSGetActiveConsoleSessionId 関数を使用すると、現在のセッション ID を取得できます。

    Note

    トークン セッション ID を設定するには、SE_TCB_PRIVILEGE が必要です。 これは、NT AUTHORITY\SYSTEM で実行されるサービスとしてのみ使用できます。

     

リモート デスクトップと帯域幅

Windows XP にリモート デスクトップ機能が追加されたことで、アプリケーションは必要以上の帯域幅を使用しないように努め、デスクトップがリモート接続されている場合に広範囲に及ぶ画面描画やアニメーション効果を回避する必要があります。 現在のセッションがリモートであるかどうかを判断するには、SM_REMOTESESSION を指定して GetSystemMetrics を呼び出すことができます。 ただし、この呼び出しでは、リモートと切断済みは区別されないことに注意してください。