#powershell to get sharepoint online site permissions Function Generate-SPOSitePermissionRpt($SiteURL,$ReportFile) { Try { #Get Credentials to connect $Cred= Get-Credential $Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password) #Setup the context $Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL) $Ctx.Credentials = $Credentials #Get the Web $Web = $Ctx.Web $Ctx.Load($Web) $Ctx.ExecuteQuery() #Write CSV- TAB Separated File) Header "URL `t Object `t Title `t Account `t PermissionType `t Permissions" | out-file $ReportFile Write-host -f Yellow "Getting Site Collection Administrators..." #Get Site Collection Administrators $SiteUsers= $Ctx.Web.SiteUsers $Ctx.Load($SiteUsers) $Ctx.ExecuteQuery() $SiteAdmins = $SiteUsers | Where { $_.IsSiteAdmin -eq $true} ForEach($Admin in $SiteAdmins) { #Send the Data to report file "$($Web.URL) `t Site Collection `t $($Web.Title)`t $($Admin.Title) `t Site Collection Administrator `t Site Collection Administrator" | Out-File $ReportFile -Append } #Function to Get Permissions of All List Items of a given List Function Get-SPOListItemsPermission([Microsoft.SharePoint.Client.List]$List) { Write-host -f Yellow "`t `t Getting Permissions of List Items in the List:"$List.Title $Query = New-Object Microsoft.SharePoint.Client.CamlQuery $Query.ViewXml = "$BatchSize" $Counter = 0 #Batch process list items - to mitigate list threshold issue on larger lists Do { #Get items from the list $ListItems = $List.GetItems($Query) $Ctx.Load($ListItems) $Ctx.ExecuteQuery() $Query.ListItemCollectionPosition = $ListItems.ListItemCollectionPosition #Loop through each List item ForEach($ListItem in $ListItems) { $ListItem.Retrieve("HasUniqueRoleAssignments") $Ctx.ExecuteQuery() If($ListItem.HasUniqueRoleAssignments -eq $True) { #Call the function to generate Permission report Get-Permissions -Object $ListItem } $Counter++ Write-Progress -PercentComplete ($Counter / ($List.ItemCount) * 100) -Activity "Processing Items $Counter of $($List.ItemCount)" -Status "Searching Unique Permissions in List Items of '$($List.Title)'" } } While ($Query.ListItemCollectionPosition -ne $null) } #Function to Get Permissions of all lists from the web Function Get-SPOListPermission([Microsoft.SharePoint.Client.Web]$Web) { #Get All Lists from the web $Lists = $Web.Lists $Ctx.Load($Lists) $Ctx.ExecuteQuery() #Get all lists from the web ForEach($List in $Lists) { #Exclude System Lists If($List.Hidden -eq $False) { #Get List Items Permissions Get-SPOListItemsPermission $List #Get the Lists with Unique permission $List.Retrieve("HasUniqueRoleAssignments") $Ctx.ExecuteQuery() If( $List.HasUniqueRoleAssignments -eq $True) { #Call the function to check permissions Get-Permissions -Object $List } } } } #Function to Get Webs's Permissions from given URL Function Get-SPOWebPermission([Microsoft.SharePoint.Client.Web]$Web) { #Get all immediate subsites of the site $Ctx.Load($web.Webs) $Ctx.executeQuery() #Call the function to Get Lists of the web Write-host -f Yellow "Getting the Permissions of Web "$Web.URL"..." #Check if the Web has unique permissions $Web.Retrieve("HasUniqueRoleAssignments") $Ctx.ExecuteQuery() #Get the Web's Permissions If($web.HasUniqueRoleAssignments -eq $true) { Get-Permissions -Object $Web } #Scan Lists with Unique Permissions Write-host -f Yellow "`t Getting the Permissions of Lists and Libraries in "$Web.URL"..." Get-SPOListPermission($Web) #Iterate through each subsite in the current web Foreach ($Subweb in $web.Webs) { #Call the function recursively Get-SPOWebPermission($SubWeb) } } #Call the function with RootWeb to get site collection permissions Get-SPOWebPermission $Web Write-host -f Green "Site Permission Report Generated Successfully!" } Catch { write-host -f Red "Error Generating Site Permission Report!" $_.Exception.Message } } #Set parameter values $SiteURL="https://domain.sharepoint.com/sites/xyzax-version1" $ReportFile="C:\SitePermissionReport.csv" $BatchSize = 500 #Call the function Generate-SPOSitePermissionRpt -SiteURL $SiteURL -ReportFile $ReportFile