はじめに
SharePoint Onlineのチームサイトは基本的には 接続された M365 グループ のメンバーを通じてサイトに対する権限が付与されますが、サイト単独でユーザーやグループに共有することも可能です。
サイト共有を行うと、グループメンバーではなく、サイトに既定で作られているSharePointグループに追加されます。
グループメンバーの管理をちゃんとやっていても、それとは別のところで権限が付与されてしまうのでグループオーナー (=サイトオーナー) の意図せぬところで情報を公開してしまったり、一度共有した後放置してしまう恐れもあります。
"意図せぬところで" コンテンツが共有されてしまうことを予防するにはサイトの共有設定を変更してオーナーだけがグループ以外に共有できるようにしておくことが有効だと思います。これについては太田さんのブログが大変ためになりました。
今回はどちらかというと防止ではなく後から気付けるようにする仕組みを Power Automate を使って考えてみました。
つまり、サイトの共有先 (SharePointグループ)に含まれる チームメンバー以外のユーザー・グループを一覧化 (してオーナーに連絡) というフローです。
実際にはスケジュール実行して最後に通知を入れていますが、全体としては以下のような比較的短いフローです。
フロー詳細
今回のフローではサイトに設定されたグループを取得してそのメンバーを一覧化するところから始まります。
残念ながら Power Automate の標準アクションの中にはサイトの権限一覧を取得するものがないため、"Send HTTP request" のアクションを利用してSharePoint REST APIを実行していきます。
REST APIのまとめは以下のサイトにお世話になってます。今回利用するのは _api/web/SiteGroups?$expand=Users
というもの。
ユーザー一覧取得
対象のサイトに対して _api/web/SiteGroups?$expand=Users
を実行すると、2個の配列が入れ子になっていて、一番深い階層にユーザー情報が含まれていることが分かります。
これで一応サイトに設定されているユーザー一覧がとれたことになるので、ここからグループのメンバーと不要なシステムアカウントを除外していきます。
グループのメンバーとシステムアカウントの除外
チームサイトに接続されたグループのメンバーは、 "XXXX メンバー", "XXXX 所有者" などの小さいグループとしてユーザー一覧に含まれています。
UIでみる時と同じ構成ですね。
これらのグループに由来するユーザーはLoginNameというプロパティで判断ができます。
以下のQ&Aの回答にあるように、チームサイトに接続されたグループ由来のユーザーはLoginNameにグループのIDを含んでいます。
フローの中でグループIDを取得しているので、これを使って対象のユーザーを除外していきます。
※グループIDを取得する方法は前回の投稿を参照
システムアカウントも同様に、LoginNameに "system" とそのまんま入ってますので、これで判定していきます。
ループ処理
フロー上での処理に話を戻します。 _api/web/SiteGroups...
で取得した結果は グループ一覧 > メンバー一覧 という入れ子になっているので、Apply to eachのループ処理を1つ入れます。
ちょっと込み入っているので、詳細が必要な場合はサンプルをダウンロードして確認してください。
実行結果
実行してみると、個別に権限を追加されたユーザーはUPNと名前が取れています。
それ以外にも、Publicサイトであれば 『外部ユーザー以外のすべてのユーザー』が含まれていることが分かります。
というわけで、情報の管理・共有スコープを厳格に管理したいチームサイトの場合に有効なフローをご紹介しました。
サンプルは以下からダウンロードいただけます。SharePointへの接続情報のみインポート時に指定してください。