Public/Discovery/Get-365Info.ps1

function Get-365Info { 
    <#
    .SYNOPSIS
    Controller function for gathering information from an Office 365 tenant
 
    .DESCRIPTION
    Controller function for gathering information from an Office 365 tenant
 
    All multivalued attributes are expanded for proper output
     
    What information is gathered:
    1. Recipients
    2. MsolUsers
    3. MsolGroups
    4. Distribution Groups (includes mail-enabled Security Groups)
    5. Mailboxes
    6. Archive Mailboxes
    7. Resource Mailboxes with Calendar Processing
    8. Licenses assigned to each user broken out by Options
    9. Retention Policies and linked Retention Tags in a single report
     
    If using the -Filtered switch, it will be necessary to replace domain placeholders in script (e.g. contoso.com etc.)
    The filters can be adjusted to anything supported by the -Filter parameter (OPath filters)
 
    .EXAMPLE
    Get-365Info -Tenant CONTOSO -Verbose
 
    .EXAMPLE
    Get-365Info -Tenant CONTOSO -Filtered -Verbose
     
    #>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string] $Tenant,

        [Parameter(Mandatory = $false)]
        [switch] $Filtered
    )
    Begin {
        $servicesSplat = @{}
        try {
            $null = Get-AcceptedDomain -ErrorAction Stop
        }
        catch {
            $servicesSplat.ExchangeOnline = $True
        } 

        try {
            $null = Get-MsolDomain -ErrorAction Stop
        }
        catch {
            $servicesSplat.MSOnline = $True
        } 
        if ($servicesSplat.count -gt 0) {
            Connect-Cloud -Tenant $Tenant @servicesSplat -Verbose:$false
        }
        $RecipientProperties = @(
            'RecipientTypeDetails', 'Name', 'DisplayName', 'Office', 'Alias', 'Identity', 'PrimarySmtpAddress'
            'WindowsLiveID', 'LitigationHoldEnabled', 'EmailAddresses'
        )
    
        $MsolUserProperties = @(
            'UserPrincipalName', 'DisplayName', 'Title', 'FirstName', 'LastName', 'StreetAddress'
            'City', 'State', 'PostalCode', 'Country', 'PhoneNumber', 'MobilePhone', 'Fax', 'Department', 'Office'
            'LastDirSyncTime', 'IsLicensed', 'ProxyAddresses'
        )
        $EXOGroupProperties = @(
            'Name', 'DisplayName', 'Alias', 'GroupType', 'Identity', 'PrimarySmtpAddress', 'RecipientTypeDetails'
            'WindowsEmailAddress', 'AcceptMessagesOnlyFromSendersOrMembers', 'ManagedBy', 'EmailAddresses', 'x500'
            'membersName', 'membersSMTP'
        )
        $EXOMailboxProperties = @(
            'Name', 'RecipientTypeDetails', 'DisplayName', 'UserPrincipalName', 'Identity', 'PrimarySmtpAddress', 'Alias'
            'ForwardingAddress', 'ForwardingSmtpAddress', 'LitigationHoldDate', 'AccountDisabled', 'DeliverToMailboxAndForward'
            'HiddenFromAddressListsEnabled', 'IsDirSynced', 'LitigationHoldEnabled', 'LitigationHoldDuration'
            'LitigationHoldOwner', 'Office', 'RetentionPolicy', 'WindowsEmailAddress', 'ArchiveName', 'AcceptMessagesOnlyFrom'
            'AcceptMessagesOnlyFromDLMembers', 'AcceptMessagesOnlyFromSendersOrMembers', 'RejectMessagesFrom'
            'RejectMessagesFromDLMembers', 'RejectMessagesFromSendersOrMembers', 'InPlaceHolds', 'x500', 'EmailAddresses'
        )


    }



    Process {
        
        $RecipientFileName = ($Tenant + "-Recipients.csv")
        $RecipientFileNameDetailed = ($Tenant + "-Recipients_Detailed.csv")
        $MsolUserFileName = ($Tenant + "-MsolUser.csv")
        $MsolUserFileNameDetailed = ($Tenant + "-MsolUser_Detailed.csv")
        $MailContactFileName = ($Tenant + "-EXOMailContact.csv")
        $MsolGroupFileName = ($Tenant + "-MsolGroup.csv")
        $EXOGroupFileName = ($Tenant + "-EXOGroup.csv")
        $EXOGroupFileNameDetailed = ($Tenant + "-EXOGroup_Detailed.csv")
        $EXOMailboxFileName = ($Tenant + "-EXOMailbox.csv")
        $EXOMailboxFileNameDetailed = ($Tenant + "-EXOMailbox_Detailed.csv")
        $EXOArchiveMailboxFileName = ($Tenant + "-EXOArchiveMailbox.csv")
        $EXOArchiveMailboxFileNameDetailed = ($Tenant + "-EXOArchiveMailbox_Detailed.csv")
        $EXOResourceMailboxFileName = ($Tenant + "-EXOResourceMailbox.csv")
        $RetentionLinksFileName = ($Tenant + "-RetentionLinks.csv")
        $UnifiedGroupsFileName = ($Tenant + "-UnifiedGroups.csv")

        if (! $Filtered) {

            Write-Verbose "Gathering 365 Recipients"
            Get-365Recipient -DetailedReport | Export-Csv .\$RecipientFileNameDetailed -notypeinformation -encoding UTF8
            Import-Csv .\$RecipientFileNameDetailed | Select $RecipientProperties | Export-Csv .\$RecipientFileName -notypeinformation -encoding UTF8
        
            Write-Verbose "Gathering MsolUsers"
            Get-365MsolUser -DetailedReport | Export-Csv .\$MsolUserFileNameDetailed -notypeinformation -encoding UTF8
            Import-Csv .\$MsolUserFileNameDetailed | Select $MsolUserProperties | Export-Csv .\$MsolUserFileName -notypeinformation -encoding UTF8

            Write-Verbose "Gathering Mail Contacts"
            Get-EXOMailContact | Export-Csv .\$MailContactFileName -notypeinformation -encoding UTF8
                    
            Write-Verbose "Gathering MsolGroups"
            Get-365MsolGroup | Export-Csv .\$MsolGroupFileName -notypeinformation -encoding UTF8
        
            Write-Verbose "Gathering Distribution & Mail-Enabled Security Groups"
            Get-EXOGroup -DetailedReport | Export-Csv .\$EXOGroupFileNameDetailed -notypeinformation -encoding UTF8
            Import-Csv .\$EXOGroupFileNameDetailed | Select $EXOGroupProperties | Export-Csv .\$EXOGroupFileName -notypeinformation -encoding UTF8
        
            Write-Verbose "Gathering Exchange Online Mailboxes"
            Get-EXOMailbox -DetailedReport | Export-Csv .\$EXOMailboxFileNameDetailed -notypeinformation -encoding UTF8
            Import-Csv .\$EXOMailboxFileNameDetailed | Select $EXOMailboxProperties | Export-Csv .\$EXOMailboxFileName -notypeinformation -encoding UTF8
            
            Write-Verbose "Gathering Exchange Online Archive Mailboxes"
            Get-EXOMailbox -ArchivesOnly -DetailedReport | Export-Csv .\$EXOArchiveMailboxFileNameDetailed -notypeinformation -encoding UTF8
            Import-Csv .\$EXOArchiveMailboxFileNameDetailed | Select $EXOMailboxProperties | Export-Csv .\$EXOArchiveMailboxFileName -notypeinformation -encoding UTF8
            
            Write-Verbose "Gathering Exchange Online Resource Mailboxes and Calendar Processing"
            Get-EXOResourceMailbox | Export-Csv .\$EXOResourceMailboxFileName -notypeinformation -encoding UTF8
            
            Write-Verbose "Gathering Office 365 Licenses"
            Get-CloudLicense
            
            Write-Verbose "Gathering Mailbox Delegate Permissions"
            Get-EXOMailboxPerms -Tenant $Tenant -ReportPath .\
    
            Write-Verbose "Gathering Distribution Group Delegate Permissions"
            Get-EXODGPerms -Tenant $Tenant -ReportPath .\
    
        }
        
        else {

            Write-Verbose "Gathering 365 Recipients - filtered"
            
            '{UserPrincipalName -like "*contoso.com" -or
            emailaddresses -like "*contoso.com" -or
            ExternalEmailAddress -like "*contoso.com" -or
            PrimarySmtpAddress -like "*contoso.com"}'
 | Get-365Recipient -DetailedReport | Export-Csv .\$RecipientFileNameDetailed -notypeinformation -encoding UTF8
            Import-Csv .\$RecipientFileNameDetailed | Select $RecipientProperties | Export-Csv .\$RecipientFileName -notypeinformation -encoding UTF8
            
            Write-Verbose "Gathering MsolUsers - filtered"
            
            'contoso.com' | Get-365MsolUser -DetailedReport | Export-Csv .\$MsolUserFileNameDetailed -notypeinformation -encoding UTF8
            Import-Csv .\$MsolUserFileNameDetailed | Select $MsolUserProperties | Export-Csv .\$MsolUserFileName -notypeinformation -encoding UTF8

            Write-Verbose "Gathering MsolGroups - filtered"
            Get-MsolGroup -All | Where-Object {$_.proxyaddresses -like "*contoso.com"} | Select -ExpandProperty ObjectId | Get-365MsolGroup | Export-Csv .\$MsolGroupFileName -notypeinformation -encoding UTF8
    
            Write-Verbose "Gathering Distribution & Mail-Enabled Security Groups - filtered"
            Get-DistributionGroup -Filter "emailaddresses -like '*contoso.com*'" -ResultSize Unlimited | Select -ExpandProperty Name | Get-EXOGroup -DetailedReport | Export-Csv .\$EXOGroupFileNameDetailed -notypeinformation -encoding UTF8
            Import-Csv .\$EXOGroupFileNameDetailed | Select $EXOGroupProperties | Export-Csv .\$EXOGroupFileName -notypeinformation -encoding UTF8
    
            Write-Verbose "Gathering Exchange Online Mailboxes - filtered"
            '{emailaddresses -like "*contoso.com"}' | Get-EXOMailbox -DetailedReport | Export-Csv .\$EXOMailboxFileNameDetailed -notypeinformation -encoding UTF8
            Import-Csv .\$EXOMailboxFileNameDetailed | Select $EXOMailboxProperties | Export-Csv .\$EXOMailboxFileName -notypeinformation -encoding UTF8
            
            Write-Verbose "Gathering Exchange Online Archive Mailboxes - filtered"
            '{emailaddresses -like "*contoso.com"}' | Get-EXOMailbox -ArchivesOnly -DetailedReport | Export-Csv .\$EXOArchiveMailboxFileNameDetailed -notypeinformation -encoding UTF8
            Import-Csv .\$EXOArchiveMailboxFileNameDetailed | Select $EXOMailboxProperties | Export-Csv .\$EXOArchiveMailboxFileName -notypeinformation -encoding UTF8

            Write-Verbose "Gathering Exchange Online Resource Mailboxes and Calendar Processing"
            '{emailaddresses -like "*contoso.com"}' | Get-EXOResourceMailbox | Export-Csv .\$EXOResourceMailboxFileName -notypeinformation -encoding UTF8

            Write-Verbose "Gathering Office 365 Licenses - filtered"
            'contoso.com' | Get-CloudLicense
            
            Write-Verbose "Gathering Mailbox Delegate Permissions - filtered" 
            Get-Recipient -Filter {EmailAddresses -like "*contoso.com"} -ResultSize Unlimited | Select -ExpandProperty name | Get-EXOMailboxPerms -Tenant $Tenant -ReportPath .\
                
            Write-Verbose "Gathering Distribution Group Delegate Permissions - filtered"
            Get-Recipient -Filter {EmailAddresses -like "*contoso.com"} -ResultSize Unlimited | Select -ExpandProperty name | Get-EXODGPerms -Tenant $Tenant -ReportPath .\
    
        }

        Write-Verbose "Gathering Retention Polices and linked Retention Policy Tags"
        Get-RetentionLinks | Export-Csv .\$RetentionLinksFileName -notypeinformation -encoding UTF8

        Write-Verbose "Gathering Office 365 Unified Groups"
        Export-AndImportUnifiedGroups -Mode Export -File .\$UnifiedGroupsFileName
    }
    End {
        
    }
}