Dataverse を利用する Power Apps キャンバスアプリを他のユーザーに共有する



# はじめに

まず、Power Apps のアプリや Power Automate のフロー等のリソースは、環境という場所に保存されます。また、Dataverse のデータベースについても環境に紐づいているため、Dataverse のテーブルも環境に保存されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/47364c45-b930-fc7c-443c-5d7622f39342.png)

https://learn.microsoft.com/ja-jp/power-platform/admin/environments-overview

Microsoft 365 のライセンスの範囲内で、既定 (Default) の環境のみを利用している場合、市民開発者が Dataverse を利用した Power Apps キャンバスアプリを作成して共有するような運用は発生しない認識です。しかし、Power Apps の有償ライセンスを購入し、個別の環境を市民開発者に提供して Dataverse を活用したアプリを作成してもらう場合、環境の概念や環境に対するアクセス権の付与などについて、市民開発者に理解してもらう必要があります。

実際に「Power Apps の有償ライセンスを購入し、個別の環境で Dataverse を利用した Power Apps キャンバスアプリを作成したが、他のユーザーと共有するにはどうすればいいのか？」といった相談を受けることがあるため、この点について情報を整理したいと思います。

# Dataverse を利用するキャンバスアプリを利用するために必要なことは

まず、Dataverse を利用する Power Apps キャンバスアプリにアクセスして利用するために必要なことは主に以下の 3 つです。

* 環境へのアクセス権がある
* アプリが共有されている
* アプリが利用するテーブルへのアクセス権がある

それぞれについて説明していきます。

## 環境へのアクセス権がある

上述の通り、アプリやフロー等は、環境に保存されます。テナントに必ず一つ存在する既定の環境の場合、すべてのユーザーが環境へのアクセス権があるためあまり意識しませんが、個別の環境を利用する場合は、こちらについて考慮が必要になります。

:::note
Microsoft 365の「テナント」とは、一言で言えば、あなたの会社や組織が Microsoft 365 を利用するための「専用のスペース」です。ある会社が Microsoft 365 を契約すると、その会社専用のテナントが作られ、そのテナントの中で全ての作業が行われます。
:::

以下は、環境を作成する際に、環境へのアクセスをセキュリティグループのメンバーに限定するか制御する箇所になります。こちらの箇所でセキュリティグループを設定している場合は、セキュリティグループのメンバーではない人は環境へのアクセス権がないことになります。逆に、特にセキュリティグループを指定しなければ、テナント内の全ユーザーが環境に対してアクセス権があることになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/cf1bcd9e-a3c5-7138-70f6-7d0ef05c2d7c.png)

こちらの設定において注意することとしては、**こちらでセキュリティグループを指定しなかったとしても、テナント内の全ユーザーがその環境でアプリを作成したり、アプリを実行できたりするという訳ではない点です。これらのことができるようになるためには、後述の要件も満たす必要があります。**

逆に言えば、例えば、全社でアプリを利用したい場合、上記箇所でセキュリティグループを指定すると、そのセキュリティグループのメンバーに対してしかアプリを共有できなくなることになります。

以下は、環境へアクセス可能なユーザーをセキュリティグループ (総務部チーム) にした際、グループに所属していないユーザー (testuser2) にアプリを共有しようとした際にエラーとなってしまった際の画面ショットです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/a103ac32-f335-bfa0-3245-c12461b1a348.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e446051d-edb7-b836-99ca-2b510302a379.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/67a2a579-2e12-4846-68b6-f344e3a5f493.png)

もちろん、Power Platform 管理センター側で環境にユーザーを追加しようとした際も以下のような結果になり、ユーザーを追加できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/a58034e4-6de1-f901-08d0-57d67bb024c0.png)

そのため、最終的にどのユーザーに対してアプリを共有したいかを踏まえ、必要に応じてセキュリティグループを指定する必要があります。

また、もちろん、環境を作成し、Dataverse を追加した後にもこちらの設定を行うことができます。この場合、Power Platform 管理センターにアクセスし、環境を選択して、以下の個所から設定をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/f85a10e2-c41a-4600-8ea1-2ce91b5eed18.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/9ca112ca-d9ee-3c5e-71d6-84c9bc60e196.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/48435cee-37b8-cc54-1280-6f8fe30f3c7c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e32680c6-9001-34ce-7472-030c4f6bab28.png)

## アプリが共有されている

こちらは、Dataverse を利用する、利用しないに関わらず必要な操作です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/38d76466-1ea0-fd26-16ce-54663d009476.png)

しかし、Dataverse を利用するアプリの場合、単にアプリを共有しただけでは、アプリは正しく動作しません。

こちらは、SharePoint リストをデータソースにしたアプリを他のユーザーに共有する際、アプリを利用するユーザーに対して SharePoint リストへのアクセス権を付与する (リストを含むサイトへのアクセス権を付与する) のと同じ考え方です。

Microsoft Dataverse の場合は、アプリを利用させるユーザーに対して、アプリが利用するテーブルへのアクセス権を付与する必要があります。

## アプリが利用するテーブルへのアクセス権がある

上述の通りアプリを共有したとしても、アプリは正しく動作しません。そのため、アプリを利用するユーザーに対して、アプリが利用するテーブルへのアクセス権を付与する必要があるのですが、Dataverse の場合、セキュリティロールというものを介してテーブルへのアクセス権を付与します。

セキュリティロールについては、以下の記事がとてもわかり易いので参考にしていただければと思いますが、端的に言うと、テーブルに対するアクセス権の詰め合わせのようなものです。

https://qiita.com/skuramoto/items/fe305aac24273c7cccbf#%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A%E6%A6%82%E8%A6%81

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/6234680c-6de0-384c-c9ac-fbac40d72116.png)

アプリを利用するユーザーは、セキュリティロールを介してテーブルへのアクセス権が付与されることで、最終的にアプリを利用できるようになります。

そのため、アプリ作成者は、アプリの利用に必要なテーブルのアクセス権を付与するために、アプリ専用のセキュリティロールを作成することで、アプリを利用するユーザーに対して必要最低限のアクセス権を提供することが可能です。

そのためには、まず、Basic User またはアプリ オープナーという事前定義されたセキュリティロールのテンプレートをコピーし、コピーして作成したセキュリティロールを編集して、アプリで利用するテーブルに対してアクセス権を付与します。

以下の例では、勤務状況をシェアするアプリで使用するテーブルにアクセス権を付与しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e4f9c736-4801-dbfd-bdc7-021ea5b5cd4d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/c4b48904-3868-66ae-0108-9d69c10bc016.png)

特権 (作成、読み取りなど)、アクセスレベル (ユーザー、部署、組織など) についても上記記事が参考になります。端的に言うと、特権は、テーブルに対して、新しい行が作成できたり、読み取りできたりするという意味で、アクセスレベルは自分が作成した行に対してのみ操作ができるのか、他の人が作成した行に対しても操作が出来るのかという意味です。例えば、 `ユーザー`は、自分が所有 (基本的にデータを登録すると自分がそのレコードの所有者になります) しているレコード (行) のみ操作可能、`組織`は、誰が作成した行であってもその操作が可能という意味になります。

そのため、例えば、自分が作成した行について、アプリを利用する人は誰でも読み取り可能ですが、変更や削除は自分 (アプリの管理者は除く) しかできないようにしたい場合は、読み取りを`組織`にして、それ以外は`ユーザー`にするみたいな感じで設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/415ca2b6-2b77-f63f-1f1b-7caec397e7e6.png)

:::note warn
"なし"はその操作ができない、"部署"、"部署配下"は Dataverse 特有の仕組みであり、複雑であることや、市民開発では利用しないケースも多いため、こちらの記事での説明は割愛いたします。
:::

:::note
Power Platform の環境に対する操作をするためのセキュリティロールも存在します。例えば、環境自体を管理するシステム管理者、その環境内でアプリやフローなどのリソースの作成が可能になる環境作成者 (環境自体が作成できるわけではないです) などの事前定義済みセキュリティロールがございます。こちらについても上述の記事で紹介されております。

そのため、アプリを共有されて利用するだけ (アプリを利用するためのセキュリティロールを付与されただけ) のユーザーは、そのアプリを利用することはできますが、環境作成者のセキュリティロールは付与されていないため、その環境でアプリやフローを新規に作成することはできないことになります。このようにすることで、環境において、アプリを利用するだけのユーザーとアプリやフローを作成することができるユーザーを分離することが可能です。
:::

最後に、作成したセキュリティロールの割当について紹介します。セキュリティロールは、ユーザーに対して割り当てる方法、グループに対して割り当てる方法があります。

### ユーザーに対して割り当てる

ユーザーに対してセキュリティロールを割り当てる方法は二つあります。一つ目は、以下のようにアプリを共有する際に合わせてユーザーにセキュリティロールを付与します。Power Apps のアプリを作成したことがある人であれば、こちらの方法でセキュリティロールを割り当てる方法が分かりやすいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/213f81ec-40b6-3841-90b0-e4d90d424530.png)

また、Power Paltform 管理センター側でも以下のようにしてユーザーに対してセキュリティロールを割り当てる事が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/dcc0ba99-a618-b0e3-76a1-3413156b3341.png)

### グループに対して割り当てる

多くの人に共有するアプリの場合、ユーザー一人一人にセキュリティロールを付与することは、現実的ではありません。そのため、グループに対して割り当てると非常に楽です。

幸い、Microsoft 365 を利用している場合、既に、部署や Teams のチームに紐づくグループ (Microsoft 365 グループ) が作成されており、特に前者の場合、組織の変更があった際も正確にメンテナンスも行われていることが多いため、アプリ作成者の方からすると、このようなグループを利用するのが一番楽だと思います。

こちらについても、ユーザーと同じように、アプリを共有する際にグループを検索して選択してセキュリティロールを割り当てることが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/63878d2e-b6f1-ed04-4cf1-7bf8fe5e9e96.png)

Power Platform 管理センターからも割当可能です。こちら、チームの作成画面にて、以下いずれかのグループを選び、チームに対してセキュリティロールを割り当てます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/0db2bb54-b32b-b640-6b9b-32e3e9014415.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/d7106cc4-d8c3-7b5f-857a-a5be75d5d3b6.png)

:::note
AAD Office グループは、Microsoft 365 グループ (Teams のチーム作成時にも作成されます) を意味します。
:::

アプリの共有画面では直接グループを指定してセキュリティロールの割当ができるのに、Power Platform 管理センターではチームを介さないとグループにセキュリティロールを割り当てられないの？と不思議に感じたかもしれません。

こちらについて、実は、アプリの共有画面でグループに対してセキュリティロールを割り当てた場合、裏でチームが作成されてセキュリティロールが割当たっております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/954b16b1-fc6a-2981-4353-ef9438c93769.png)

そのため、いずれの場合においても、以下のように、セキュリティグループや Microsoft 365 グループ (Teams のチーム作成時にも作成されます) に対してセキュリティロールを割り当てる場合、チームを介して割り当てていることになります。そのため、いずれかの方法でグループに対してセキュリティロールを割り当てていただければと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/5733e912-6917-8213-2059-1ba20407b3b8.png)

# まとめ

今回は、Dataverse 環境で Power Apps キャンバスアプリを共有する方法について紹介しました。アプリの作成者側の視点で言うと、以下のようなことを実施する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/3e7bc1b9-45f7-87dd-5f65-70a16fe1e3c8.png)

環境、セキュリティロール、テーブルへのアクセス権付与、チームなど、Dataverse のない環境では意識しなかった概念、用語も沢山あり、混乱してしまう、理解に時間を要す場合もあると思うので、こちらの記事が理解促進に少しでもつながれば幸いです。