SharePointグループへのアクセス権をPowerAutomateのフローで変更する

SharePoint

SharePointのドキュメントライブラリ内のドキュメントやフォルダー、リストのアイテムに対するアクセス権をPowerAutomateのフローで設定する際、「アイテムまたはフォルダーへのアクセス権の付与」というアクションが便利に使えます。

しかし、このアクションではSharePointグループをアクセス権付与の対象として指定することはできません

SharePointサイトにおいてデフォルトで作成されるのがSharePointグループ。
このSharePointグループに対して権限設定をしている方がほとんどなのではないでしょうか。

SharePointグループ

ということで、今回はPowerAutomateのフローを操り、SharePointグループに対するアクセス権変更を行う方法について解説していきたいと思います。

PowerAutomateフローの作成

ドキュメントライブラリのあるフォルダにファイルがアップロードされたことをトリガーとし、ファイルに設定されているSharePointグループに対するアクセス権を変更するフローを作成していきます。

上位よりこのような権限が継承されており、今回は「メンバー」に設定されている編集権限を閲覧権限に変更してみましょう。

トリガーの設定

トリガーは以下の通り設定しました。

設定項目内容入力例
サイトのアドレス対象ライブラリがあるサイトを選択します**ポータル – https://xxxx.sharepoint.com/site/portal
ライブラリ名対象のライブラリを選択します営業部
フォルダー対象のフォルダーを選択します(任意)お知らせ

指定したフォルダーにドキュメントがアップロードされたことをトリガーとし、処理が実行されます。

SharePointグループの情報を取得する

トリガーの設定ができたら次はアクションの設定です。

SharePointグループに対してアクセス権を設定する際、そのグループの「プリンシパルID」というものが必要となります。
なので、まずは対象のSharePointグループの情報を取得するアクションを設定していきます。

設定するアクションは「SharePoint にHTTP 要求を送信します」を使用します。

httpで検索すると見つけやすいです。

アクションは以下のように設定しました。
※アクションの名前は「SharePointグループの情報を取得」に変更しています。

設定項目内容入力例
サイトのアドレス対象ライブラリがあるサイトを選択**ポータル – https://xxxx.sharepoint.com/site/portal
方法情報の取得方向を設定GET
URIREST APIでSharePointグループの情報を取得
_api/web/sitegroups/getbyname(‘<グループ名>’)
_api/web/sitegroups/getbyname(‘猫草ポータル メンバー’)
ヘッダーHTTPリクエストのヘッダーを指定(任意)Accept:application/json;odata=verbose
Content-Type:application/json;odata=verbose

皆さんの環境に合わせてパラメーターを設定しましょう。

取得結果を確認する

ここで一度テストを実行し、SharePointグループの情報を表示してみます。

トリガーとして指定した操作を行うと処理が実行されます。
実行結果として以下画面の通り出力がありました。

出力はJSON形式となります。

{
  "d": {
    "__metadata": {
      "id": "https://tenantname.sharepoint.com/sites/portal/_api/Web/SiteGroups/GetById(5)",
      "uri": "https://tenantname.sharepoint.com/sites/portal/_api/Web/SiteGroups/GetById(5)",
      "type": "SP.Group"
    },
    "Owner": {
      "__deferred": {
        "uri": "https://tenantname.sharepoint.com/sites/portal/_api/Web/SiteGroups/GetById(5)/Owner"
      }
    },
    "Users": {
      "__deferred": {
        "uri": "https://tenantname.sharepoint.com/sites/portal/_api/Web/SiteGroups/GetById(5)/Users"
      }
    },
    "Id": 5,
    "IsHiddenInUI": false,
    "LoginName": "猫草ポータル メンバー",
    "Title": "猫草ポータル メンバー",
    "PrincipalType": 8,
    "AllowMembersEditMembership": true,
    "AllowRequestToJoinLeave": false,
    "AutoAcceptRequestToJoinLeave": false,
    "Description": null,
    "OnlyAllowMembersViewMembership": false,
    "OwnerTitle": "猫草ポータル 所有者",
    "RequestToJoinLeaveEmailSetting": ""
  }
}

出力はこのアクションの「body」に格納され、以降のアクションで利用することが可能です。

しかし、今回必要な情報は「body」の18行目の「ID(プリンシパルID)」の「値」である「5」のみです。

値の抽出を行うには次項の「JSONの解析」というアクションを使います。

その準備として以下のJSONを作成しておきましょう。

{
"Id": 5
}

18行目の出力から行末の「,」を取り除き、{}で囲んだだけのJSONです。

値は入ったままでかまいません。

JSONの解析を実行する

新規アクションとして「JSONの解析」を追加します。

jsonで検索すると見つけやすいです。

コンテンツに以下の式を設定します。

内容入力例
式に以下を入力し[OK]で確定
body(‘<HTTP 要求のアクション名>’)?[‘d’]
body(‘SharePointグループの情報を取得’)?[‘d’]

続いて[サンプルから生成]をクリックします。

そして先ほど作成したJSONを貼り付け[完了]をクリックします。

すると、「ID(プリンシパルID)」の値を抽出するためのスキーマを自動生成してくれます。

コードが書けなくても大丈夫な便利機能です。

アクセス権の継承をリセットする

下準備はできましたので、ここからは実際にアクセス権の設定をしていきます。

ファイルのアクセス権はライブラリや上位フォルダから継承されており、継承されている状態ですとアクセス権の変更が行えません。

ということで、まずは継承を解除していきます。

アクションとして「SharePointにHTTP要求を送信します」を追加し、以下の通り設定していきます。
※アクションの名前は「アクセス権の継承をリセット」に変更しています。

設定項目内容入力例
サイトのアドレス対象ライブラリがあるサイトを選択します**ポータル – https://xxxx.sharepoint.com/site/portal
方法情報の取得方向を設定しますPOST
URIREST APIで権限の継承を停止
_api/web/lists/getbytitle(‘<ライブラリ名>’)/items(<トリガーで取得したドキュメントのID>)/breakroleinheritance(copyRoleAssignments=True)
_api/web/lists/getbytitle(‘営業部’)/items(<ID>)/breakroleinheritance(copyRoleAssignments=True)
ヘッダーHTTPリクエストのヘッダーを指定します(任意)Accept:application/json;odata=verbose
Content-Type:application/json;odata=verbose
If-Match=*

今回は継承を外しつつ「copyRoleAssignments=True」でこれまでのアクセス権設定を残してみました。

SharePointグループにアクセス権を設定する

権限を付与するアクションを設定していきます。

2ステップあり、権限の追加と元々設定されていた権限の削除です。

閲覧権限を追加する

アクションとして「SharePointにHTTP要求を送信します」を追加し、以下の通り設定していきます。
※アクションの名前は「SharePointグループに閲覧権限を設定」に変更しています。

設定項目内容入力例
サイトのアドレス対象ライブラリがあるサイトを選択**ポータル – https://xxxx.sharepoint.com/site/portal
方法情報の取得方向を設定POST
URIREST APIでドキュメントのアクセス権を設定
_api/web/lists/getbytitle(‘<ライブラリ名>’)/items(<トリガーで取得したドキュメントのID>)/roleassignments/addroleassignment(principalid=<JSONの解析で取得したID>,roledefid=<権限の種類のId>)
api/web/lists/getbytitle(‘営業部’)/<ID>/roleassignments/addroleassignment(principalid=<id>,roledefid=1073741826)
ヘッダーHTTPリクエストのヘッダーを指定(任意)Accept:application/json;odata=verbose
Content-Type:application/json;odata=verbose
If-Match=*

権限の種類は「roledefid」というIDで指定します。
今回設定した「roledefid」は「1073741826」=「閲覧権限」です。

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

編集権限を削除する

アクションとして「SharePointにHTTP要求を送信します」を追加し、以下の通り設定していきます。
※アクションの名前は「SharePointグループの編集権限を削除」に変更しています。

設定項目内容入力例
サイトのアドレス対象ライブラリがあるサイトを選択**ポータル – https://xxxx.sharepoint.com/site/portal
方法情報の取得方向を設定POST
URIREST APIでドキュメントのアクセス権を設定
_api/web/lists/getbytitle(‘<ライブラリ名>’)/items(<トリガーで取得したドキュメントのID>)/roleassignments/removeroleassignment(principalid=<JSONの解析で取得したID>,roledefid=<権限の種類のId>)
api/web/lists/getbytitle(‘営業部’)/items(<ID>)/roleassignments/removeroleassignment(principalid=<Id>,roledefid=1073741830)
ヘッダーHTTPリクエストのヘッダーを指定(任意)Accept:application/json;odata=verbose
Content-Type:application/json;odata=verbose
If-Match=*

設定した「roledefid」は「1073741830」=「編集権限」です。

これでフローは完成です。
全体としてはこのようなフローになりました。

保存して動作確認を行いましょう。

動作確認

トリガーとして設定した処理(今回はライブラリの特定フォルダーにファイルをアップロード)を実行します。

アップロード直後の権限はこの通り上位から継承された権限が付与されています。

5分程度待つとフローが実行されました。

改めて権限を確認すると…

継承が外れ、対象のSharePointグループの権限が「編集」から「閲覧」に変更されています。

このままだと所有者のみしか触れないドキュメントとなってしまいますね 汗

特定グループやアップロードしたユーザーに権限を付与するなど、用途に合わせてアクションを追加していきましょう。

なお、今回使用したトリガー「ファイルが作成されたとき(プロパティのみ)」はファイルが作成された際にリアルタイムで実行されるものではありません。

トリガーの実行タイミングについては以下の記事にてまとめていますので、よろしければ参考にしてみてください。

まとめ

いかがでしたでしょうか。

今回はPowerAutomateのフローでSharePointグループを操作する方法について、実例を挙げながらまとめてみました。

ちょっと回りくどくなってしまうところもありますが、PowerAutomateはプログラミングの知識がなくてもある程度のことができてしまうので、管理者さんの強い味方ですね!

コメント

タイトルとURLをコピーしました