【SharePoint Online】すべての権限情報をリストアップする【C#】

2019年7月27日

今回はSPOの特定のサイトからすべての権限情報をリストアップするツールを作成していきたいと思います。

ポイントとなる点は、SPOの権限付与には3種類の方法があるという点です。

1.SharePoint Groupを利用した権限付与
 →SharePoint GroupというSPO上の独自の管理形態で、
  1SPG内に複数のユーザーやセキュリティグループを登録することができます。
  SPG内にSPGを登録することはできません。

2.ユーザーアカウントを利用した権限付与
 →ADと連携し、ADに登録されているユーザーアカウント単位に権限を付与することができます。
  個別に権限を付与すると煩雑になるため、基本的にはSPGを利用するか、セキュリティグループを利用します。

3.セキュリティグループを利用した権限付与
 →ADと連携し、ADに登録されているセキュリティグループに直接権限を付与することができます。
  SPG内にセキュリティグループを登録することもできます。

つまり、すべての権限情報を取得するにはSPG内に存在するユーザーアカウント、セキュリティグループを抜き出して確認を行う必要があります。
それを気をつけて以下コードを書きましたのでまずは確認してみてください。

色々別に書いた関数とかを省いて記載しているので、誤っていたら教えて頂けると幸いです。

解説

権限情報は、[ _context.Web.RoleAssignments]内に格納されています。
取得したRoleAssignmentsをforeach文で回してあげることで権限情報を1つずつチェックしていきます。

foreach (SP.RoleAssignment ra in RootWeb.RoleAssignments)
                {
                    _context.Load(ra.Member);
                    await _context.ExecuteQueryAsync();

                    if (ra.Member.PrincipalType.ToString() == "SharePointGroup")
                    {
                        SP.Group groupMembers = _context.Web.SiteGroups.GetByName(ra.Member.Title);
                        _context.Load(groupMembers, group => group.Users);
                        await _context.ExecuteQueryAsync();

                        foreach(SP.User usr in groupMembers.Users)
                        {
                            sb.Add(usr.LoginName);
                        }

                    }
                    else
                    {
                        if ((ra.Member.PrincipalType.ToString() == "SecurityGroup") || (ra.Member.PrincipalType.ToString() == "User"))
                        {
                            sb.Add(ra.Member.LoginName);
                        }
                    } 
                }

前述したとおり、権限情報にはSPG,ユーザー,セキュリティグループの3種類があります。
そして、SPG内にはユーザーとセキュリティグループが存在するわけです。
そのため、もしRoleAssignmentsのプリンシパルタイプがSPGであれば、再度所属しているユーザー情報をforeachで取得してあげます。

もしプリンシパルタイプがセキュリティグループか、ユーザーであればそのまま取得してあげます。

以上のことをすべての権限情報に行うことで、権限情報の抜き出しが完了しました。

最後に

SharePointのツールで一番難しいというか面倒であるのは、「どのメソッドにどの情報が入っているのか」ということです。
これは結構めんどくさく、日本語での情報は多くありません。
そこら編をこのブログを通して情報の蓄積ができたらいいなと思います。

今日はここまで!