前々から Power Automate でもっと柔軟に出来たら良いなと思っていた SharePoint Online のリストアイテムの権限操作の方法を調べてみたいと思います。

SharePoint Online では、このような権限操作は SharePoint Designer 2013 を利用して SharePoint 2010 ワークフローを作成して実現することが多かったのですが、その SharePoint 2010 ワークフローもそろそろリタイアするという話もあったので、良い機会だなと思いました。

この記事では、僕が調べて試してみた結果を書き留めていきたいと思います。SharePoint のことをある程度知っている人向けの内容なので、細かな説明は省いているところがあります。ご了承ください。

SharePoint コネクタを利用

利用するのは SharePoint コネクタです。もちろん、Office 365 のライセンスで利用可能な Power Automate のライセンスの範囲に含まれています。助かりますね。

権限操作系アクション

あらかじめ用意されている権限操作系のアクションを見ていきましょう。

アイテムまたはフォルダーへのアクセス権の付与

このアクションを利用すると、リストアイテムに対して権限を追加することができます。SharePoint の画面上から共有を行ったときと同じです。

アイテムまたはファイルの共有を停止します

このアクションを利用すると、リストアイテムの権限が削除されます。SharePoint の画面上から共有の停止を行ったときと同じです。

これだけ?

既定で用意されている権限操作系のアクションこれだけです。これでやりたいことが実現できる場合はとても簡単に作成できますね。

SharePoint に HTTP 要求を送信します アクション

もっと複雑な権限操作を行いたい場合には、こちらの「SharePoint に HTTP 要求を送信します」アクションが利用できます。

ただし、こちらのアクションを利用するには SharePoint REST API の知識が必要になります。覚えているのも大変なので、権限操作に必要なところをメモしていきたいと思います。

リストアイテムの権限情報を取得する

リストアイテムに設定されている権限情報を取得します。

設定項目設定値
サイトのアドレス<リストが存在するサイトの URL>
方法GET
URI_api/web/lists/getbytitle(‘<リスト名>’)/items(<リストアイテム ID>)/roleassignments

これでリストアイテムに対して何かしらの権限が設定されているユーザーやグループの PrincipalId(プリンシパル Id)が確認できます。

このプリンシパル Id は権限を管理するために必要ですので、取得方法は覚えておきましょう。

リストアイテムに対する PrincipalId の権限を取得する

得られたプリンシパル Id に設定されている権限を確認します。

設定項目設定値
サイトのアドレス<リストが存在するサイトの URL>
方法GET
URI_api/web/lists/getbytitle(‘<リスト名>’)/items(<リストアイテム ID>)/roleassignments/getbyprincipalid(<プリンシパル Id>)/roledefinitionbindings

これで個人やグループがリストアイテムにどういった権限を持つかを確認できます。

プリンシパル Id からユーザー情報を取得する

プリンシパル Id がユーザーの場合、次のようにしてユーザー情報を取得することができます。

設定項目設定値
サイトのアドレス<リストが存在するサイトの URL>
方法GET
URI_api/web/getuserbyid(<プリンシパル Id>)

ユーザーの表示名やログイン名、メールアドレスなどを取得できます。

プリンシパル Id から SharePoint グループ情報を取得する

プリンシパル Id が SharePoint グループの場合、次のようにしてグループの情報を取得することができます。

設定項目設定値
サイトのアドレス<リストが存在するサイトの URL>
方法GET
URI_api/web/sitegroups/getbyid(<プリンシパル Id>)

SharePoint グループの名前などが確認できます。

SharePoint グループのメンバーを取得する

SharePoint グループを取得できたら、そのメンバーを取得したくなるかもしれません。

設定項目設定値
サイトのアドレス<リストが存在するサイトの URL>
方法GET
URI_api/web/roleassignments/getbyprincipalid(<プリンシパル Id>)/member

roleassignments の配下であれば良いので、次のようにしても取得できます。

設定項目設定値
サイトのアドレス<リストが存在するサイトの URL>
方法GET
URI_api/web/lists/getbytitle(‘<リスト名>’)/items(<リストアイテム ID>)/roleassignments/getbyprincipalid(<プリンシパル Id>)/member

SharePoint グループのメンバーの情報が確認できます。

サイトに含まれる SharePoint グループの ID を取得する

サイトに含まれるすべての SharePoint グループの ID を取得します。

設定項目設定値
サイトのアドレス<リストが存在するサイトの URL>
方法GET
URI_api/web/sitegroups

ここで取得できる IDPrincipalId と同じですね。

SharePoint グループにユーザーやグループを追加する

ついでに、SharePoint グループにユーザーやグループを追加してみます。

設定項目設定値
サイトのアドレス<リストが存在するサイトの URL>
方法GET
URI_api/web/sitegroups(<グループ ID>)/users
ボディ
{
"LoginName": "<ログイン ID>"
}

ボディの LoginName に指定するログイン ID は、ユーザーであればメールアドレスを含む「i:0#.f|membership|john@contoso.com」、セキュリティグループであれば Azure AD のオブジェクト ID を含む「c:0t.c|tenant|6e58d467-f8cf-4d63-9890-30842e53d506」のようになります。

サイトに含まれる権限の種類を取得する

サイトにはフルコントロール、編集、投稿、閲覧などの複数の権限の種類が登録されています。権限を設定するときには、これらの情報が必要になるため調べておきます。

設定項目設定値
サイトのアドレス<リストが存在するサイトの URL>
方法GET
URI_api/web/roledefinitions

各権限の種類には Id が付与されており、リストアイテムの権限設定でも利用します。既定の権限は次のような Id になっています。

権限Id
フルコントロール1073741829
デザイン1073741828
編集1073741830
投稿1073741827
閲覧1073741826

独自に権限の種類を定義している場合などは事前に確認しておきましょう。

リストアイテムの権限継承を解除する

既定ではリストアイテムはリストの権限を継承しています。(リストはサイトの権限を継承しています)そのため、リストアイテムに個別の権限を設定するためには、権限の継承を解除する必要があります。

権限の継承を解除するには、アクションを次のように設定します。

設定項目設定値
サイトのアドレス<リストが存在するサイトの URL>
方法POST
URI_api/web/lists/getbytitle(‘<リスト名>’)/items(<リストアイテム ID>)/breakroleinheritance(copyRoleAssignments=false)

breakroleinheritance の引数にある copyRoleAssignments の値は true または false のいずれかになります。true の場合は、継承されていた権限をそのまま保持し、継承のみを解除します。false の場合は、継承されていた権限は削除し、継承も解除します。また、false の場合には、アクションの実行者に対しての権限が自動的に付与されます。

リストアイテムの権限継承を元に戻す

設定した権限を破棄し、リストの権限を継承している状態に戻します。

アクションを次のように設定します。

設定項目設定値
サイトのアドレス<リストが存在するサイトの URL>
方法POST
URI_api/web/lists/getbytitle(‘<リスト名>’)/items(<リストアイテム ID>)/resetroleinheritance

こちらはシンプルですね。

リストアイテムの権限にユーザーやグループを追加する

それでは、実際にリストアイテムに権限を設定してみましょう。あらかじめ権限の継承を解除しておき、次のようにアクションを設定します。

設定項目設定値
サイトのアドレス<リストが存在するサイトの URL>
方法POST
URI_api/web/lists/getbytitle(‘<リスト名>’)/items(<リストアイテム ID>)/roleassignments/addroleassignment(principalid=<プリンシパル Id>,roledefid=<権限の種類 Id>)

addroleassignment の引数である principalid には、ユーザーや SharePoint グループのプリンシパル Id を設定します。そして、roledefid には、権限の種類の Id を指定します。編集権限を付与するのであれば、「1073741830」ですね。

リストアイテムから指定したユーザーやグループの権限を削除する

権限を削除するには次のようにアクションを設定します。

設定項目設定値
サイトのアドレス<リストが存在するサイトの URL>
方法DELETE
URI_api/web/lists/getbytitle(‘<リスト名>’)/items(<リストアイテム ID>)/roleassignments/getbyprincipalid(<プリンシパル Id>)

権限を削除するときには方法が DELETE になります。あとは、権限を削除したいユーザーやグループを roleassignments/getbyprincipalid でプリンシパル Id を利用して指定します。

ユーザーのログイン名やメールアドレスを利用してプリンシパル Id を取得する

権限を操作するにはユーザーのプリンシパル Id が必要ですが、プリンシパル Id を利用するためには、サイト毎に事前にユーザーを登録しておく必要があります。

ユーザーのメールアドレスなどを利用しサイトにユーザーを登録し、ユーザーのプリンシパル Id を取得するにはアクションを次のように設定します。

設定項目設定値
サイトのアドレス<リストが存在するサイトの URL>
方法POST
URI_api/web/ensureuser(‘<ログイン名/メールアドレス>’)

ユーザーがすでに登録済みの場合は、そのユーザーのプリンシパル Id が取得できます。

セキュリティグループのプリンシパル Id を取得する

Azure AD 上にあるセキュリティグループを利用して権限を付与したいと思うこともあると思います。その時は、Azure AD 上のセキュリティグループに付与されているオブジェクト ID を利用して次のように取得できます。

設定項目設定値
サイトのアドレス<リストが存在するサイトの URL>
方法POST
URI_api/web/ensureuser(‘c:0t.c|tenant|<オブジェクト ID>’)

セキュリティグループのオブジェクト ID は Azure ポータルにある Azure AD テナントの管理画面で確認できます。オブジェクト ID の先頭に「c:0t.c|tenant|」を付けるのがポイントです。

出力の処理

SharePoint コネクタの HTTP 要求を送信しますアクションを利用して SharePoint REST API を呼び出すと、その戻り値は JSON 形式でアクションの出力として返ってきます。

ほとんどの場合、JSON の書式は次のようになっています。ひとつのデータが返ってくるときは下記のようになります。

{
  "d": {
    <目的のデータ>
  }
}

または、複数のデータが返ってくるときは下記のようになります。

{
  "d": {
    "results": [
      <目的のデータの配列>
    ]
  }
}

Power Automate の「JSON の解析」アクションを利用するときには、d の中だけ、または、results の中だけを利用した方が便利です。そのためには、JSON の解析アクションは次のように設定します。

ひとつのデータが返ってくる場合は下記のようになります。

設定項目設定値
コンテンツ次のような式を利用
body(‘HTTP 要求のアクション名’)?[‘d’]
スキーマアクションからの出力のうち、d の中から次の部分をサンプルにスキーマを作成

{
<目的のデータ>
}

複数のデータが返ってくる場合は下記のようになります。

設定項目設定値
コンテンツ次のような式を利用
body(‘HTTP 要求のアクション名’)?[‘d’]?[‘results’]
スキーマアクションからの出力のうち、d の中から次の部分をサンプルにスキーマを作成

[
<目的のデータの配列>
]

このあたりはいろいろと工夫してみてください。

アクションを実行するユーザーの権限を考慮

もちろん、こういった権限操作の HTTP 要求を実行するには、リストアイテムの権限操作が可能なユーザーでアクションを実行する必要があります。このあたりは、フローを作成時には気を付けておきましょう。

実践

それではちょっと実践してみましょう。ためしに次のようなフローを作成してみます。

  1. リストにアイテムが追加されたら
  2. アイテムの権限継承を解除し元の権限を全削除
  3. アイテムに指定したユーザーに編集権限を付与

こんな感じになります。

簡単ではありませんが、HTTP 要求のアクションを利用することで権限操作も実現できます。

さいごに

このような形で「SharePoint に HTTP 要求を送信します」アクションを利用することで、SharePoint の REST API を簡単に利用でき、権限操作などもフローから実現することができます。

もちろん、REST API にはこの他にもさまざまな操作が用意されていますので、SharePoint Online のサイトの管理を含めもっと多くの操作が自動化できそうですね。