none
PowerShellから個人が持つ権限を取得したい RRS feed

  • 質問

  • お世話になっております。

    現在SharePointOnlineでPowerShellを使った権限管理・制御の仕組みを構築しているのですが、
    調べても情報が見つからなかったので質問させて頂きます。

    現在PowerShellからCSOMを用いて、指定のユーザーがリストに対して所持している権限を取得しようとしています。
    現在手持ちの情報で出来ていることは、オブジェクトに対して付与されているユーザー:権限の一覧と、
    明示的に指定した権限をユーザーが保持しているかどうかの判断のみです。
     ⇒「obj.RoleAssignments」や「get_effectiveBasePermissions().has(SP.PermissionKind.manageWeb)」等

    オブジェクトの権限一覧からでも目的の処理は出来るのですが、
    出来ることなら標準の画面から確認出来る「権限の確認」機能と同じような結果が取得できればと考えています。

    もし可能でしたら上記の取得方法をご教示頂ければと存じます。

    以上となります。よろしくお願い致します。

    2018年5月16日 5:21

回答

  • こんにちは。

    こんな感じでいけると思うのですが。(C#ですいません)

        class Program
        {
            static void Main(string[] args)
            {
                var siteurl = "<siteurl>";
                var username = "<username>";
                var password = "<password>";
                var credentials = new NetworkCredential(username, password);
                var ctx = new ClientContext(siteurl);
                ctx.Credentials = new SharePointOnlineCredentials(credentials.UserName, credentials.SecurePassword);
                var web = ctx.Web;
                var list = web.GetList("<listurl>");
                var perm = list.GetUserEffectivePermissions("i:0#.f|membership|<username>");
                ctx.ExecuteQuery();
                foreach (PermissionKind item in Enum.GetValues(typeof(PermissionKind)))
                {
                    Console.WriteLine($"{Enum.GetName(typeof(PermissionKind), item)}, {perm.Value.Has(item)}");
                }
                Console.ReadLine();
            }
        }
    

    • 回答としてマーク sttks 2018年6月12日 3:00
    2018年5月31日 8:54

すべての返信

  • 試行錯誤しているのですが、以下のコードで直接付与されている権限を取得することはできたのですが、
    SPグループやドメイングループ経由で付与されている権限や、
    サイトコレクション管理者として付与された権限を取得することができていない状態です。

    別方向からのアプローチをかけないとダメなんでしょうか。。。

     # Read CSOM
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client") | Out-Null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.Runtime") | Out-Null
    
    $siteUrl = "https://tenant.sharepoint.com/sites/hoge"
    $listName = "権限を確認したいリスト"
    
    #使用するユーザーとパスワードを入力
    $account = "hoge@tenant.onmicrosoft.com" 
    $securePassword = ConvertTo-SecureString "hogehoge" -AsPlainText -Force
    
    #認証
    $credential = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($account, $securePassword) 
    
    # サイトオブジェクト生成
    $context = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)
    $context.Credentials = $credential
    $web = $context.Web
    $context.Load($web)
    
    # リストオブジェクト生成
    $objList = $web.Lists.GetByTitle($listName)
    $context.Load($objList)
    
    #対象ユーザーを特定
    $target = $web.SiteUsers.GetById(11)
    $context.Load($target)
    
    #対象ユーザーが直接付与されている権限のみ取得される
    $listRole = $objList.RoleAssignments.GetByPrincipal($target).RoleDefinitionBindings
    $context.Load($listRole)
    
    $context.ExecuteQuery()
    
    echo $objList.Title $target.Title $listRole.Name
    
    $context.Dispose()



    • 編集済み sttks 2018年5月30日 11:04  
    2018年5月30日 11:03
  • こんにちは。

    こんな感じでいけると思うのですが。(C#ですいません)

        class Program
        {
            static void Main(string[] args)
            {
                var siteurl = "<siteurl>";
                var username = "<username>";
                var password = "<password>";
                var credentials = new NetworkCredential(username, password);
                var ctx = new ClientContext(siteurl);
                ctx.Credentials = new SharePointOnlineCredentials(credentials.UserName, credentials.SecurePassword);
                var web = ctx.Web;
                var list = web.GetList("<listurl>");
                var perm = list.GetUserEffectivePermissions("i:0#.f|membership|<username>");
                ctx.ExecuteQuery();
                foreach (PermissionKind item in Enum.GetValues(typeof(PermissionKind)))
                {
                    Console.WriteLine($"{Enum.GetName(typeof(PermissionKind), item)}, {perm.Value.Has(item)}");
                }
                Console.ReadLine();
            }
        }
    

    • 回答としてマーク sttks 2018年6月12日 3:00
    2018年5月31日 8:54
  • Takashi Shinohara様

    お世話になっております。ご回答有り難うございます。
    返信が遅くなってしまい申し訳ございません。

    一旦暫定対応として、対象がSPグループの場合RoleDefinitionBindingsを、
    ユーザー・ドメイングループの場合はget_effectiveBasePermissions().hasで各権限確認を作りました。

    ご回答頂いたソースを元により最適化を図ろうと思います、ありがとうございました。

    2018年6月12日 2:59