Private/Get-AzureInstanceAddressData.ps1

function Get-AzureInstanceAddressData {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [object]$VirtualMachine
    )

    $result = @{
        PrivateIpAddress = $null
        PublicIpAddress  = $null
    }

    $networkInterfaces = @($VirtualMachine.NetworkProfile.NetworkInterfaces)
    if (-not $networkInterfaces -or $networkInterfaces.Count -eq 0) {
        return $result
    }

    $canResolveNetworkInterface = Get-Command -Name 'Get-AzNetworkInterface' -ErrorAction SilentlyContinue
    if (-not $canResolveNetworkInterface) {
        return $result
    }

    $canResolvePublicIp = Get-Command -Name 'Get-AzPublicIpAddress' -ErrorAction SilentlyContinue

    function Get-ResourceGroupAndNameFromResourceId {
        param(
            [string]$ResourceId
        )

        if ([string]::IsNullOrWhiteSpace($ResourceId)) {
            return $null
        }

        $segments = @($ResourceId -split '/')
        $resourceGroupIndex = [Array]::IndexOf($segments, 'resourceGroups')
        $providersIndex = [Array]::IndexOf($segments, 'providers')

        if ($resourceGroupIndex -lt 0 -or $resourceGroupIndex + 1 -ge $segments.Count) {
            return $null
        }

        if ($providersIndex -lt 0 -or $providersIndex + 1 -ge $segments.Count) {
            return $null
        }

        [pscustomobject]@{
            ResourceGroupName = $segments[$resourceGroupIndex + 1]
            Name              = $segments[-1]
        }
    }

    foreach ($networkInterfaceRef in $networkInterfaces) {
        if ([string]::IsNullOrWhiteSpace($networkInterfaceRef.Id)) {
            continue
        }

        $networkInterfaceIdentity = Get-ResourceGroupAndNameFromResourceId -ResourceId $networkInterfaceRef.Id
        if (-not $networkInterfaceIdentity) {
            continue
        }

        $networkInterface = Get-AzNetworkInterface `
            -ResourceGroupName $networkInterfaceIdentity.ResourceGroupName `
            -Name $networkInterfaceIdentity.Name `
            -ErrorAction Stop

        $ipConfig = @($networkInterface.IpConfigurations) |
            Where-Object { $_.Primary } |
            Select-Object -First 1

        if (-not $ipConfig) {
            $ipConfig = @($networkInterface.IpConfigurations) | Select-Object -First 1
        }

        if (-not $ipConfig) {
            continue
        }

        if (-not $result.PrivateIpAddress -and $ipConfig.PrivateIpAddress) {
            $result.PrivateIpAddress = $ipConfig.PrivateIpAddress
        }

        $publicIpReference = $ipConfig.PublicIpAddress
        if (-not $result.PublicIpAddress -and $publicIpReference -and $publicIpReference.Id -and $canResolvePublicIp) {
            $publicIpIdentity = Get-ResourceGroupAndNameFromResourceId -ResourceId $publicIpReference.Id
            if ($publicIpIdentity) {
                $publicIpAddress = Get-AzPublicIpAddress `
                    -ResourceGroupName $publicIpIdentity.ResourceGroupName `
                    -Name $publicIpIdentity.Name `
                    -ErrorAction Stop
            }

            if ($publicIpAddress.IpAddress) {
                $result.PublicIpAddress = $publicIpAddress.IpAddress
            }
        }

        if ($result.PrivateIpAddress -and $result.PublicIpAddress) {
            break
        }
    }

    $result
}