public/get-AllExOPermissions.ps1

Function get-AllExOPermissions{
    <#
        Author = "Jos Lieben (jos@lieben.nu)"
        CompanyName = "Lieben Consultancy"
        Copyright = "https://www.lieben.nu/liebensraum/commercial-use/"
         
        Parameters:
        -includeFolderLevelPermissions: if set, folder level permissions for each mailbox will be retrieved. This can be (very) slow
 
        Potential to do:
        only reason we need GA rights for EXO scanning is because get-recipientpermission doesn't support Global Reader, this could be fixed by modifying the scope in EXO but is a config change a customer would need to accept
    #>
        
    Param(
        [Switch]$includeFolderLevelPermissions,
        [Switch]$skipReportGeneration
    )

    $activity = "Scanning Exchange Online"

    if($includeFolderLevelPermissions){
        Write-LogMessage -message "Including folder level permissions, this will lengthen the scan duration significantly"
    }

    Write-Progress -Id 1 -PercentComplete 1 -Activity $activity -Status "Scanning roles..."
    get-ExORoles
    Write-Progress -Id 1 -PercentComplete 1 -Activity $activity -Status "Retrieving all recipients..."
    Write-LogMessage -message "Getting all recipients..."
    [System.GC]::GetTotalMemory($true) | out-null
    Write-Progress -Id 1 -PercentComplete 2 -Activity $activity -Status "Retrieving all recipients..."
    $global:octo.recipients = (New-ExOQuery -cmdlet "Get-Recipient" -cmdParams @{"ResultSize" = "Unlimited"}) | Where-Object{$_ -and !$_.Identity.StartsWith("DiscoverySearchMailbox")}
    foreach($recipient in $global:octo.recipients){
        New-ScanJob -Title $activity -Target $recipient.displayName -FunctionToRun "get-ExOPermissions" -FunctionArguments @{
            "recipientIdentity" = $recipient.Identity
            "includeFolderLevelPermissions" = $includeFolderLevelPermissions.IsPresent
            "isParallel" = $True
        }
    }
    [System.GC]::GetTotalMemory($true) | out-null
    Write-LogMessage -message "Starting scan..."
    Start-ScanJobs -Title $activity
    $global:octo.recipients = $Null
    if(!$skipReportGeneration){
        Write-LogMessage -message "Generating report..." -level 4
        Write-Report
    }
    Write-Progress -Id 1 -Completed -Activity $activity
}