backup/Backup-SettingsCatalog.ps1

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

    try {
        $folder = Join-Path $BackupPath 'Settings Catalog'
        $uri = '/beta/deviceManagement/configurationPolicies'
        $items = Invoke-GraphRequest2 -Uri $uri -Token $Token

        foreach ($item in $items) {
            # fetch settings for this policy
            $settingsUri = "/beta/deviceManagement/configurationPolicies/$($item.id)/settings?`&top=1000"
            $settings = Invoke-GraphRequest2 -Uri $settingsUri -Token $Token

            # attach settings to the policy
            if ($settings) {
                $item | Add-Member -MemberType NoteProperty -Name 'settings' -Value $settings -Force
            }

            # construct filename based on technologies
            if ($item.technologies) {
                $technologiesFormatted = $item.technologies -replace ',', '_'
                $fileName = "$($item.name)_$technologiesFormatted"
            }
            else {
                $fileName = $item.name
            }

            $assignments = Resolve-Assignments -AssignmentsUri "/beta/deviceManagement/configurationPolicies/$($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) settings catalog policies to $folder"
    }
    catch {
        Write-Error "failed to backup settings catalog policies: $_"
        return
    }
}

Export-ModuleMember -Function Backup-SettingsCatalog