backup/Backup-ActivationLock.ps1

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

    try {
        $folder = Join-Path $BackupPath 'Activation Lock Bypass Codes'
        
        # get Apple device IDs
        $deviceUri = '/beta/deviceManagement/managedDevices?$select=id&$filter=startsWith(operatingSystem,''macOS'') or startsWith(operatingSystem,''iOS'') or startsWith(operatingSystem,''iPadOS'')'
        $devices = Invoke-GraphRequest2 -Uri $deviceUri -Token $Token

        $devicesWithBypassCode = @()
        foreach ($device in $devices) {
            # fetch full device details
            $fullUri = "/beta/deviceManagement/managedDevices/$($device.id)?`$select=id,deviceName,serialNumber,activationLockBypassCode"
            $fullDevice = Invoke-GraphRequest2 -Uri $fullUri -Token $Token

            if ($fullDevice.activationLockBypassCode) {
                $devicesWithBypassCode += $fullDevice
            }
        }

        # save as a single file with all devices
        if ($devicesWithBypassCode) {
            Save-BackupItem -Item $devicesWithBypassCode -Folder $folder -FileName 'activation_lock_bypass_codes' -ScopeTagMap $ScopeTagMap
            Write-Verbose "backed up $($devicesWithBypassCode.Count) devices with activation lock bypass codes to $folder"
        }
    }
    catch {
        Write-Error "failed to backup activation lock bypass codes: $_"
        return
    }
}

Export-ModuleMember -Function Backup-ActivationLock