Private/Resolve-WindowsDeviceLinkAccessTokenTenantId.ps1

function Resolve-WindowsDeviceLinkAccessTokenTenantId {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$AccessToken
    )

    try {
        $segments = $AccessToken.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

        if ($claims.tid) { return [string]$claims.tid }
    }
    catch {
        # Tenant extraction is metadata-only and best-effort.
    }

    return $null
}