名前付きオブジェクトの共有中

このトピックでは、ユニバーサル Windows プラットフォーム (UWP) アプリケーションや Win32 アプリケーション間で名前付きオブジェクトを共有する方法について説明します。

パッケージ アプリケーション内の名前付きオブジェクト

名前付きオブジェクトは、プロセスでオブジェクト ハンドルを簡単に共有する方法を提供します。 プロセスによって名前付きオブジェクトが作成されると、他のプロセスはその名前を使用して、そのオブジェクトへのハンドルを開く適切な関数を呼び出すことができます。 名前付きオブジェクトは一般に、スレッド同期プロセス間通信に使用されます。

既定では、パッケージ アプリケーションは、自身で作成した名前付きオブジェクトにのみアクセスできます。 パッケージ アプリケーションと名前付きオブジェクトを共有するには、オブジェクトが作成されるときにアクセス許可を設定する必要があり、オブジェクトが開かれるときに名前を修飾する必要があります。

名前付きオブジェクトの作成

名前付きオブジェクトは、次の対応する Create API で作成されます。

これらの API はすべて、そのオブジェクトにアクセスできるプロセスを制御するためのアクセス制御リスト (ACL) を呼び出し元で指定できる LPSECURITY_ATTRIBUTES パラメーターを共有します。 パッケージ アプリケーションと名前付きオブジェクトを共有するには、名前付きオブジェクトが作成されるときに ACL 内でアクセス許可を付与する必要があります。

セキュリティ識別子 (SID) は、ACL 内の ID を表します。 どのパッケージ アプリケーションにも、そのパッケージ ファミリ名に基づいた独自の SID があります。 パッケージ アプリケーションの SID は、そのパッケージ ファミリ名を DeriveAppContainerSidFromAppContainerName に渡すことによって生成できます。

注意

パッケージ ファミリ名は、開発中に Visual Studio のパッケージ マニフェスト エディターで、Microsoft Store 経由で公開されているアプリケーションの場合はパートナー センターを使用して、または既にインストールされているアプリケーションの場合は Get-AppxPackage PowerShell コマンドを使用して見つけることができます。

このサンプルは、名前付きオブジェクトを ACL に登録するために必要な基本的なパターンを示しています。 パッケージ アプリケーションと名前付きオブジェクトを共有するには、アプリケーションごとに EXPLICIT_ACCESS 構造を構築します。

パッケージ アプリケーションの EXPLICIT_ACCESS 規則を使用して Create の呼び出しで LPSECURITY_ATTRIBUTES パラメーターを設定することによって、これらのアプリケーションに名前付きオブジェクトを開くためのアクセス権を付与できます。

注意

Win32 アプリケーションは、オブジェクトを開くときにオブジェクト名を修飾する限り、パッケージ アプリケーションによって作成されたすべての名前付きオブジェクトにアクセスできます。 アクセス権が付与されている必要はありません。

名前付きオブジェクトを開く

名前付きオブジェクトは、次の対応する Open API に名前を渡すことによって開かれます。

パッケージ アプリケーションによって作成される名前付きオブジェクトは、そのアプリケーションの名前空間内に作成されます (名前付きオブジェクト パスとも呼ばれます)。 パッケージ アプリケーションによって作成された名前付きオブジェクトを開く場合は、オブジェクト名の先頭に、作成アプリケーションの名前付きオブジェクト パスを付加する必要があります。

GetAppContainerNamedObjectPath は、パッケージ アプリケーションの SID に基づいて、その名前付きオブジェクト パスを返します。 パッケージ アプリケーションの SID は、そのパッケージ ファミリ名を DeriveAppContainerSidFromAppContainerName に渡すことによって生成できます。

注意

パッケージ ファミリ名は、開発中に Visual Studio のパッケージ マニフェスト エディターで、Microsoft Store 経由で公開されているアプリケーションの場合はパートナー センターを使用して、または既にインストールされているアプリケーションの場合は Get-AppxPackage PowerShell コマンドを使用して見つけることができます。

パッケージ アプリケーションによって作成された名前付きオブジェクトを開く場合は、<PATH>\<NAME> という形式を使用します。

  • <PATH> を作成アプリケーションの名前付きオブジェクト パスに置き換えます。
  • <NAME> をオブジェクト名に置き換えます。

注意

オブジェクト名への <PATH> の付加は、そのオブジェクトがパッケージ アプリケーションによって作成された場合にのみ必要です。 Win32 アプリケーションによって作成された名前付きオブジェクトを修飾する必要はありませんが、オブジェクトが作成されるときにアクセス権を付与することは引き続き必要です。

注釈

パッケージ アプリケーション内の名前付きオブジェクトは、セキュリティを保持し、中断や終了などのアプリケーション ライフサイクル イベントのサポートを保証するために、既定では分離されています。 アプリケーション間での名前付きオブジェクトの共有により、バインドやバージョン管理の厳密な制約が導入され、各アプリケーションには他のアプリケーションのライフサイクルに対する回復性が必要になります。 これらの理由から、名前付きオブジェクトは、同じ公開元のアプリケーション間でのみ共有することをお勧めします。