Private/Resolve-WindowsDeviceLinkTokenAccountName.ps1

function Resolve-WindowsDeviceLinkTokenAccountName {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$Token
    )

    try {
        $segments = $Token.Split('.')
        if ($segments.Count -lt 2) { return $null }

        $payload = $segments[1].Replace('-','+').Replace('_','/')
        switch ($payload.Length % 4) {
            2 { $payload += '==' }
            3 { $payload += '=' }
        }

        $claims = [System.Text.Encoding]::UTF8.GetString(
            [Convert]::FromBase64String($payload)
        ) | ConvertFrom-Json -ErrorAction Stop

        foreach ($claimName in @('preferred_username','upn','unique_name')) {
            $claimValue = [string]$claims.$claimName
            if (-not [string]::IsNullOrWhiteSpace($claimValue)) { return $claimValue }
        }
    }
    catch {
        # Account extraction is metadata-only and best-effort.
    }

    return $null
}