Initialize-SPObjectPermissions.ps1

##############################
#.SYNOPSIS
#Initiaize permission properties (Groups, Users, Permissions) related to objects in SharePoint - Web, List, Item.
#
#.DESCRIPTION
#Initialize RoleAssignments, RoleDefinitionBindings, Groups, Members, etc. to report on the permissions for specific CSOM Object
#
#.PARAMETER Objects
#The CSOM Object(s) we want the permissions properties instantiated on.
#
#.PARAMETER Display
#Displays the permission properties for the Object(s) passed over. This is in development.
#
#
#.EXAMPLE
#Initialize-SPObjectPermissions -Objects $Webs -Verbose
#
#Initialize-SPObjectPermissions -Objects $AllLists -Verbose
#
#.NOTES
#Display is in development
##############################
Function Initialize-SPObjectPermissions{
    [CmdletBinding()]
    Param(
        
        [Parameter(Mandatory=$true,ValueFromPipeline)]
        [Microsoft.SharePoint.Client.SecurableObject[]]$Objects,

        [Parameter(Mandatory=$false)]
        [Switch]$Display
    )
    #Doing this for each object
    $Objects | ForEach-Object {

        $object = $_
        Write-Progress -Activity "Initialize Permission Properties on $($Object.Gettype().Name)" -Status $_.Title -PercentComplete ((($Objects.IndexOf($_) + 1) / ($Objects.Count)) * 100)
        Write-Verbose "Initializing Permissions on $($Object.Gettype().Name) - $($Object.Title)"
        #If we are not displaying Only
        #If(!$Display){
            #Initialize the permission/security properties we want available. We don't want verbose logging for the commands in the module.
            $vp = $VerbosePreference
            $VerbosePreference = "SilentlyContinue"
            Initialize-SPOCSOMObjectProperty -Objects $Object -PropertyName @("HasUniqueRoleAssignments","RoleAssignments")
            Initialize-SPOCSOMObjectProperty -Objects $Object.RoleAssignments -PropertyName @("Member","roledefinitionbindings")
            $VerbosePreference = $vp
            #Foreach RoleAssignmet on the object, check if it's a group. If it's a group try to instantiate the users list for the group.
            $Object.RoleAssignments | ForEach-Object{
                #If users are available, it's a group object.
                if($false -eq $_.Member.Users.AreItemsAvailable){
                    #Initialize-SPOCSOMObjectProperty -Objects $Object.RoleAssignments.Member -PropertyName @("Users")
                    Try{
                        $t = $_.Member.Title
                        Initialize-SPOCSOMCollections -CSOMCollection $_.Member.Users -ErrorAction Stop
                    }
                    #We failed to instantiate the group list. This is probably due to not having permission to read the group membership. Write a warning and report the error.
                    Catch{
                        $e = $_.Exception.InnerException
                        Write-Warning "Failed to Instantiate Users on Group $t - $($e.Message)"
                    }
                }
            }
        #}
    
        #This is for display purposes and is still in development. Need to choose what to display based on the Object(s) passed in.
        Switch ($Object.GetType().Name){
            "Web" {
                #$Object.RoleAssignments | Select-Object @{L="Site";E={$Ctx.Url}},@{L="Parent";E={$ListName}},@{L="Member";E={$_.Member.LoginName}},@{L="Email Address";E={If($_.Member.Email){$_.Member.Email}Else{$_.Member.Users.Email}}},@{L="Permissions";E={$_.RoleDefinitionBindings.Name -Join ","}} -ErrorAction SilentlyContinue
                }
            "List" {
                If(!$Object.RootFolder.IsPropertyAvailable('Name')){
                    Initialize-SPOCSOMCollections -CSOMCollection $Object.RootFolder
                }
                If(!$Object.ParentWeb.URL -eq $null){
                    Initialize-SPOCSOMCollections -CSOMCollection $Object.ParentWeb
                }
                $Name = $_.RootFolder.Name
                #$Object.RoleAssignments | Select-Object @{L="Site";E={$Ctx.Url}},@{L="Parent";E={$ListName}},@{L="Member";E={$_.Member.LoginName}},@{L="Email Address";E={If($_.Member.Email){$_.Member.Email}Else{$_.Member.Users.Email}}},@{L="Permissions";E={$_.RoleDefinitionBindings.Name -Join ","}} -ErrorAction SilentlyContinue
            }
            "ListItem" {     
                $_.RoleAssignments | Select-Object @{L="Site";E={$Ctx.Url}},@{L="Document Library";E={$ListName}},@{L="RelativeLocation";E={$RelativeLoc}},@{L="Member";E={$_.Member.LoginName}},@{L="Email Address";E={If($_.Member.Email){$_.Member.Email}Else{$_.Member.Users.Email}}},@{L="Permissions";E={$_.RoleDefinitionBindings.Name -Join ","}} -ErrorAction SilentlyContinue
            }
        }
    }       
}