backup/Backup-AppProtection.ps1

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

    try {
        $folder = Join-Path $BackupPath 'App Protection'
        $uri = '/beta/deviceAppManagement/managedAppPolicies'
        $items = Invoke-GraphRequest2 -Uri $uri -Token $Token

        foreach ($item in $items) {
            # determine assignment URI based on @odata.type
            $odataType = $item.'@odata.type'
            $assignmentUri = $null

            switch ($odataType) {
                '#microsoft.graph.windowsManagedAppProtection' {
                    $assignmentUri = "/beta/deviceAppManagement/windowsManagedAppProtections/$($item.id)/assignments"
                }
                '#microsoft.graph.iosManagedAppProtection' {
                    $assignmentUri = "/beta/deviceAppManagement/iosManagedAppProtections/$($item.id)/assignments"
                }
                '#microsoft.graph.androidManagedAppProtection' {
                    $assignmentUri = "/beta/deviceAppManagement/androidManagedAppProtections/$($item.id)/assignments"
                }
                '#microsoft.graph.mdmWindowsInformationProtectionPolicy' {
                    $assignmentUri = "/beta/deviceAppManagement/mdmWindowsInformationProtectionPolicies/$($item.id)/assignments"
                }
                '#microsoft.graph.windowsInformationProtectionPolicy' {
                    $assignmentUri = "/beta/deviceAppManagement/windowsInformationProtectionPolicies/$($item.id)/assignments"
                }
            }

            # fetch and attach assignments if applicable
            if ($assignmentUri) {
                $assignments = Resolve-Assignments -AssignmentsUri $assignmentUri -Token $Token
                if ($assignments) {
                    $item | Add-Member -MemberType NoteProperty -Name 'assignments' -Value $assignments -Force
                }
            }

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

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

Export-ModuleMember -Function Backup-AppProtection