カーネル オブジェクトの名前空間

リモート デスクトップ サービス サーバーには、イベント、セマフォ、ミューテックス、待機可能タイマー、ファイル マッピング オブジェクト、およびジョブ オブジェクトという名前のカーネル オブジェクトに対して複数の名前空間があります。 主にクライアント/サーバー アプリケーションのサービスによって使用されるグローバル名前空間があります。 さらに、各クライアント セッションには、Windows Vista など、これらのオブジェクトに対して個別の名前空間があります。

個別のクライアント セッション名前空間を使用すると、複数のクライアントが相互に干渉することなく同じアプリケーションを実行できます。 クライアント セッションで開始されたプロセスの場合、システムは既定でセッション名前空間を使用します。 ただし、これらのプロセスでは、"Global\" プレフィックスをオブジェクト名の前に置くことで、グローバル名前空間を使用できます。 たとえば、次のコードは CreateEvent を 呼び出し、CSAPP という名前のイベント オブジェクトをグローバル名前空間に作成します。

Note

グローバル名前空間は、Windows ストア アプリでは使用できません。

 

CreateEvent( NULL, FALSE, FALSE, "Global\\CSAPP" );

リモート デスクトップ サービス環境のサービス アプリケーションでは、既定でグローバル名前空間が使用されます。

セッション 0 はサービスのホストにのみ使用され、以前のバージョンの Windows とは異なり、コンソール セッションはありません。

グローバル名前空間を使用すると、複数のクライアント セッションのプロセスが 1 つのサービス アプリケーションと通信できるようになります。 たとえば、クライアント/サーバー アプリケーションで同期にミューテックス オブジェクトを使用する場合があります。 サーバー モジュールは、グローバル名前空間にミューテックス オブジェクトを作成できます。 その後、クライアント セッションで "Global\" プレフィックスを使用してミューテックス オブジェクトを開くことができます。

グローバル名前空間のもう 1 つの用途は、名前付きオブジェクトを使用して、すべてのセッションにわたってシステムで実行されているアプリケーションのインスタンスが既に存在することを検出するアプリケーション用です。 この名前付きオブジェクトは、セッションごとの名前空間ではなく、グローバル名前空間で作成または開く必要があります。 名前付きオブジェクトはセッションごとの名前空間に作成されるため、セッションごとに 1 回アプリケーションを実行する場合は、既定でサポートされます。

クライアント プロセスでは、"Global\" プレフィックスに加えて、"Local\" プレフィックスを使用して、セッション名前空間にオブジェクトを明示的に作成できます。 これらのキーワードでは、大文字と小文字が区別されます。

"Session\" プレフィックスはシステム用に予約されているため、カーネル オブジェクトの名前には使用しないでください。

高速ユーザー切り替えは、リモート デスクトップ サービス セッションを使用して実装されます。 ログオンする最初のユーザーはセッション 1 を使用し、次にログオンするユーザーはセッション 2 を使用します。 カーネル オブジェクト名は、アプリケーションが複数のユーザーをサポートできるように、リモート デスクトップ サービスに関するガイドラインに従う必要があります。

CreateFileMapping を使用したグローバル名前空間でのファイル マッピング オブジェクトの作成は、セッション 0 以外のセッションからの特権操作です。 このため、グローバル名前空間にファイル マッピング オブジェクトを正常に作成するには、任意のリモート デスクトップ セッション ホスト (RD セッション ホスト) サーバー セッションで実行されているアプリケーションで SeCreateGlobalPrivilege を有効にする必要があります。 チェック特権は、ファイル マッピング オブジェクトの作成に限定され、既存のオブジェクトを開く場合には適用されません。 たとえば、サービスまたはシステムがファイル マッピング オブジェクトを作成する場合、ユーザーが必要なアクセス権を持っている場合、任意のセッションで実行されているプロセスは、そのファイル マッピング オブジェクトにアクセスできます。