Private/Get-EntraIDAzureVMMSIAccessToken.ps1

function Get-EntraIDAzureVMMSIAccessToken {
    [CmdletBinding(DefaultParameterSetName = "default")]

    Param(
        [Parameter(Mandatory = $true)]
        $AccessTokenProfile,

        [Parameter(Mandatory = $false, ParameterSetName = "resource")]
        [String] $Resource = $null
    )

    Process {       
        # TODO: Understand why documentation is pointing to http://localhost:50342/oauth2/token - https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-sign-in
        $uri = "http://169.254.169.254/metadata/identity/oauth2/token"

        $_resource = [String]::IsNullOrEmpty($Resource) ? $AccessTokenProfile.Resource : $Resource
        $response = Invoke-WebRequest -Uri "$($uri)?resource=$([System.Uri]::EscapeDataString($_resource))&api-version=2018-02-01" -Headers @{Metadata = "true" } -UseBasicParsing

        if ($response.StatusCode -ne 200) {
            throw "Error getting access token from Azure VM MSI endpoint: $($response.StatusCode) $($response.StatusDescription) $($response.Content)"
        }

        ConvertFrom-Json $response.Content  
    }
}