前々から Power Automate でもっと柔軟に出来たら良いなと思っていた SharePoint Online のリストアイテムの権限操作の方法を調べてみたいと思います。
SharePoint Online では、このような権限操作は SharePoint Designer 2013 を利用して SharePoint 2010 ワークフローを作成して実現することが多かったのですが、その SharePoint 2010 ワークフローもそろそろリタイアするという話もあったので、良い機会だなと思いました。
この記事では、僕が調べて試してみた結果を書き留めていきたいと思います。SharePoint のことをある程度知っている人向けの内容なので、細かな説明は省いているところがあります。ご了承ください。
- SharePoint コネクタを利用
- 権限操作系アクション
- SharePoint に HTTP 要求を送信します アクション
- リストアイテムの権限情報を取得する
- リストアイテムに対する PrincipalId の権限を取得する
- プリンシパル Id からユーザー情報を取得する
- プリンシパル Id から SharePoint グループ情報を取得する
- グループ名で SharePoint グループ情報を取得する
- サイトに含まれるすべての SharePoint グループの ID を取得する
- SharePoint グループのメンバーを取得する
- SharePoint グループにユーザーやグループを追加する
- SharePoint グループからユーザーやグループを削除する
- サイトに含まれる権限の種類を取得する
- リストアイテムの権限継承を解除する
- リストアイテムの権限継承を元に戻す
- リストアイテムの権限にユーザーやグループを追加する
- リストアイテムから指定したユーザーやグループの権限を削除する
- ユーザーのログイン名やメールアドレスを利用してプリンシパル Id を取得する
- セキュリティグループのプリンシパル Id を取得する
- 出力の処理
- アクションを実行するユーザーの権限を考慮
- 実践
- さいごに
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/sitegroups/getbyname(‘<グループ名>’) |
指定するグループ名は、サイトの設定から確認できる表示名なので、分かりやすいです。
サイトに含まれるすべての SharePoint グループの ID を取得する
サイトに含まれるすべての SharePoint グループの ID を取得します。
設定項目 | 設定値 |
---|---|
サイトのアドレス | <リストが存在するサイトの URL> |
方法 | GET |
URI | _api/web/sitegroups |
ここで取得できる ID
は PrincipalId
と同じですね。
SharePoint グループのメンバーを取得する
SharePoint グループを取得できたら、そのメンバーを取得したくなるかもしれません。SharePoint グループを取得した URI の末尾に /users を追加します。
設定項目 | 設定値 |
---|---|
サイトのアドレス | <リストが存在するサイトの URL> |
方法 | GET |
URI | _api/web/sitegroups/getbyid(<プリンシパル Id>)/users |
上記は、SharePoint グループをプリンシパル Id を利用して取得していますが、グループ名を利用して取得した場合でも大丈夫です。
設定項目 | 設定値 |
---|---|
サイトのアドレス | <リストが存在するサイトの URL> |
方法 | GET |
URI | _api/web/sitegroups/getbyname(‘<グループ名>’)/users |
SharePoint グループにはグループの所有者が設定されていますので、そちらの情報を取得することもできます。
設定項目 | 設定値 |
---|---|
サイトのアドレス | <リストが存在するサイトの URL> |
方法 | GET |
URI | _api/web/sitegroups/getbyid(<プリンシパル Id>)/owner |
そのほかにも、次のような形で取得できます。この場合のプリンシパル Id は、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 グループにユーザーやグループを追加する
ついでに、SharePoint グループにユーザーやグループを追加してみます。
設定項目 | 設定値 |
---|---|
サイトのアドレス | <リストが存在するサイトの URL> |
方法 | POST |
URI | _api/web/sitegroups(<グループ ID>)/users |
ボディ | { |
ボディの LoginName
に指定するログイン ID は、ユーザーであればメールアドレスを含む「i:0#.f|membership|john@contoso.com」、セキュリティグループであれば Azure AD のオブジェクト ID を含む「c:0t.c|tenant|6e58d467-f8cf-4d63-9890-30842e53d506」のようになります。
SharePoint グループからユーザーやグループを削除する
SharePoint グループにユーザーやグループが追加できたら、もちろん削除もやりたくなります。
設定項目 | 設定値 |
---|---|
サイトのアドレス | <リストが存在するサイトの URL> |
方法 | POST |
URI | _api/web/sitegroups(<グループ ID>)/users/removeByLoginName |
ボディ | { |
ボディに含まれる値の loginName
は、先頭の L が小文字である必要があるみたいなので注意が必要です。
サイトに含まれる権限の種類を取得する
サイトにはフルコントロール、編集、投稿、閲覧などの複数の権限の種類が登録されています。権限を設定するときには、これらの情報が必要になるため調べておきます。
設定項目 | 設定値 |
---|---|
サイトのアドレス | <リストが存在するサイトの 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 要求を実行するには、リストアイテムの権限操作が可能なユーザーでアクションを実行する必要があります。このあたりは、フローを作成時には気を付けておきましょう。
実践
それではちょっと実践してみましょう。ためしに次のようなフローを作成してみます。
- リストにアイテムが追加されたら
- アイテムの権限継承を解除し元の権限を全削除
- アイテムに対して、編集権限を指定したユーザーに付与
こんな感じになります。
簡単ではありませんが、HTTP 要求のアクションを利用することで権限操作も実現できます。
さいごに
このような形で「SharePoint に HTTP 要求を送信します」アクションを利用することで、SharePoint の REST API を簡単に利用でき、権限操作などもフローから実現することができます。
もちろん、REST API にはこの他にもさまざまな操作が用意されていますので、SharePoint Online のサイトの管理を含めもっと多くの操作が自動化できそうですね。