backup/Backup-Applications.ps1

#Requires -Version 7.0
function Backup-Applications {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)] [string]$BackupPath,
        [Parameter(Mandatory)] [SecureString]$Token,
        [hashtable]$ScopeTagMap = @{}
    )

    try {
        $baseFolder = Join-Path $BackupPath 'Applications'
        $uri = '/beta/deviceAppManagement/mobileApps?$filter=(microsoft.graph.managedApp/appAvailability) eq null or (microsoft.graph.managedApp/appAvailability) eq ''lineOfBusiness'' or isAssigned eq true'
        $items = Invoke-GraphRequest2 -Uri $uri -Token $Token

        foreach ($item in $items) {
            # determine platform subfolder
            $odataType = $item.'@odata.type'
            if ($odataType -like '*ios*' -or $odataType -like '*iOS*') {
                $platform = 'iOS'
            }
            elseif ($odataType -like '*macOS*' -or $odataType -like '*macos*') {
                $platform = 'macOS'
            }
            elseif ($odataType -like '*android*' -or $odataType -like '*Android*') {
                $platform = 'Android'
            }
            elseif ($odataType -like '*webApp*' -or $odataType -like '*Web*') {
                $platform = 'Web App'
            }
            elseif ($odataType -like '*officeSuite*' -or $odataType -like '*Office*') {
                $platform = 'Office Suite'
            }
            else {
                $platform = 'Windows'
            }

            $folder = Join-Path $baseFolder $platform

            # construct filename
            $appType = $odataType -replace '#microsoft\.graph\.', ''
            $fileName = "$($item.displayName)_$appType"

            # remove description before saving
            $item | Add-Member -MemberType NoteProperty -Name 'description' -Value $null -Force

            $assignments = Resolve-Assignments -AssignmentsUri "/beta/deviceAppManagement/mobileApps/$($item.id)/assignments" -Token $Token
            if ($assignments) {
                $item | Add-Member -MemberType NoteProperty -Name 'assignments' -Value $assignments -Force
            }

            $clean = Remove-VolatileKeys -InputObject $item
            Save-BackupItem -Item $clean -Folder $folder -FileName $fileName -ScopeTagMap $ScopeTagMap
        }
        Write-Verbose "backed up $($items.Count) applications to $baseFolder"
    }
    catch {
        Write-Error "failed to backup applications: $_"
        return
    }
}

Export-ModuleMember -Function Backup-Applications