Get current IP addresses associated with an Azure ARM VM's set of NICs via Powershell

azure list all public ip addresses
get-azurermvm
get-azvm ip address
az vm list-ip-addresses
get-azurermnetworkinterface
how to export vm details from azure portal
azure vm hostname
azure powershell list all vms in subscription

I'm trying to write some Powershell to get a list of Azure ARM vms (Not classic) and the currently associated IP addresses for their NICs.

In classic, this was part of the VM object, but in ARM it's a seperate object, and I'm struggling to get the Powershell to work in the way I want.

I've got the following code segment:

$nic = (((Get-AzureRmVM).NetworkProfile).NetworkInterfaces).Id
ForEach ($i in $nic) {
  $nicname = $i.substring($i.LastIndexOf("/")+1)
  Get-AzureRmNetworkInterface -Name $nicname -ResourceGroupName RGTEST | Get-AzureRmNetworkInterfaceIpConfig | select-object  PrivateIpAddress,PrivateIpAllocationMethod
}

Which works, but only for VMs in the specified resource group 'RGTEST'.

It seems that Get-AzureRmNetworkInterface can only work when passed in the NIC Name and the ResourceGroupName, but I can't seem to get the RGname from the VM to be passed in.

Probably really easy, but I'm struggling with it!

I use this code to get all my ARM VMs, their private IP address and allocation method, it works across resource groups.

$vms = get-azurermvm
$nics = get-azurermnetworkinterface | where VirtualMachine -NE $null #skip Nics with no VM

foreach($nic in $nics)
{
    $vm = $vms | where-object -Property Id -EQ $nic.VirtualMachine.id
    $prv =  $nic.IpConfigurations | select-object -ExpandProperty PrivateIpAddress
    $alloc =  $nic.IpConfigurations | select-object -ExpandProperty PrivateIpAllocationMethod
    Write-Output "$($vm.Name) : $prv , $alloc"
}

Sample Output: proddc : 10.0.0.4 , Static stagedc : 10.1.0.4 , Static

Reading Azure VM name, IP address, and hostname with , Extracting the guest OS hostname from the Azure ARM VM Now I need to get an IP address, and as it turns out, it is not that simple. interfaces one by one, checking if the Id property of the current VM matches the $nic. all the resources and sub-resources associated if we pass a parent resource name. Public IP addresses. 05/28/2020; 6 minutes to read; In this article. Public IP addresses allow Internet resources to communicate inbound to Azure resources. Public IP addresses enable Azure resources to communicate to Internet and public-facing Azure services. The address is dedicated to the resource, until it's unassigned by you.

Below is the script I used to get the Private and Public IP for an Azure ARM VM. If a VM has more than one NIC or IpConfig it would probably need to use a loop.

$rg = Get-AzureRmResourceGroup -Name "MyResourceGroup01"
$vm = Get-AzureRmVM -ResourceGroupName $rg.ResourceGroupName -Name "MyVM01"
$nic = Get-AzureRmNetworkInterface -ResourceGroupName $rg.ResourceGroupName -Name $(Split-Path -Leaf $VM.NetworkProfile.NetworkInterfaces[0].Id)
$nic | Get-AzureRmNetworkInterfaceIpConfig | Select-Object Name,PrivateIpAddress,@{'label'='PublicIpAddress';Expression={Set-Variable -name pip -scope Global -value $(Split-Path -leaf $_.PublicIpAddress.Id);$pip}}
(Get-AzureRmPublicIpAddress -ResourceGroupName $rg.ResourceGroupName -Name $pip).IpAddress

#Output:    
Name      PrivateIpAddress PublicIpAddress
----      ---------------- ---------------
ipconfig1 10.0.0.10        MyVM01-pip

40.80.217.1

How To Get Azure RM VM IP Addresses Using PowerShell – 250 , Azure Resource Manager (Azure RM) changes the deployment methodology. Take a Note that the IP address is associated to the VM. Azure  $publicIp = Get-AzureRmPublicIpAddress -Name $publicIpName -ResourceGroupName $rgName This command gets a public IP address resource with name $publicIPName in the resource group $rgName.

Here's a script that I use to get relevant VM Private/Public IP Address info used for various tasks. It will run from MAC OS or Windows OS as I've a MAC with a Widows 10 Parallels VM running for compatibility. Use it as you wish.

It will export to CSV and attempt to open in Excel or whatever is registered to the CSV extension. In the example below it was saved as PS_AzureRM_Get_VMs.ps1 or just run it as raw code in PowerShell.

#Login to AZURE from PowerShell
#Below works in MAC/Linux PowerShell 6.0.1+ and Windows WMF 4.0+
#pwsh on MAC OS or powershell_ise.exe on Windows
#Connect-AzureRmAccount (Login-AzureRMAcount and Add-AzureRMAccount are the older Azure cmdlets)
# Goto URL https://microsoft.com/devicelogin and the password it provides example Q9KZ3HGN2
#  You may need to select-azurermsubscription -subscriptionid $SubscriptionID #Define $SubscriptionID = 'replace everything with your actual subscription  xxx-xxxx-xxx'

#Example location using the . way of running a script or just cut and paste to PowerShell
#Example location using the . way of running a script
#MAC PWSH syntax
#. ~/Documents/Scripts/AzureRM/PS_AzureRM_Get_VMs.ps1
#Windows PowerShell.exe/PowerShell_ISE.exe syntax
#. $env:userprofile\Scripts\AzureRM\PS_AzureRM_Get_VMs.ps1

$Project="DevOps"
$clientFilePrefix="AzureRM"
$clientFileCampaign="VMs"

#Get Date Time
$Date = ([DateTime]::Now).ToString("yyyyMMdd")
$Time = ([DateTime]::Now).ToString("HHmmss")
$DateStart=get-date

#Change to Windows Path if running in Windows $env:USERPROFILE
If ($($env:USERPROFILE)) {
  $fldrRoot="$($env:USERPROFILE)\"
  $fldrPathseparator='\'
} Else {
  $fldrRoot="~/"
  $fldrPathseparator='/'
}

# Make Directory if not exist
$fldrPath=$fldrRoot+"Documents"+$fldrPathseparator+$Project+$fldrPathseparator+$clientFilePrefix+$fldrPathseparator+$clientFileCampaign
New-Item -ErrorAction Ignore -ItemType directory -Path $fldrPath

#Make Imports Folder
$fldrPathimports=$fldrPath+$fldrPathseparator+"Imports"
New-Item -ErrorAction Ignore -ItemType directory -Path $fldrPathimports

#Make Exports Folder Directory
$fldrPathexports=$fldrPath+$fldrPathseparator+"Exports"
New-Item -ErrorAction Ignore -ItemType directory -Path $fldrPathexports

#Assign the variable to the export file Prefix
$VMInfo_Export=$fldrPathexports+$fldrPathseparator+$clientFilePrefix+"_"+$Project+"_"+$clientFileCampaign+"_"+$Date+"_"+$Time+".csv"

#Create a Table to use for filtering the results
$VMInfo = New-Object System.Data.DataTable
#Now Add some columns for use later
$VMInfo.Columns.Add((New-Object System.Data.DataColumn 'ResourceGroup',([String])))
$VMInfo.Columns.Add((New-Object System.Data.DataColumn 'VM',([String])))
$VMInfo.Columns.Add((New-Object System.Data.DataColumn 'Location',([String])))
$VMInfo.Columns.Add((New-Object System.Data.DataColumn 'VM_ID',([String])))
$VMInfo.Columns.Add((New-Object System.Data.DataColumn 'VM_NIC',([String])))
$VMInfo.Columns.Add((New-Object System.Data.DataColumn 'IP',([String])))
$VMInfo.Columns.Add((New-Object System.Data.DataColumn 'Public_IP_Name',([String])))
$VMInfo.Columns.Add((New-Object System.Data.DataColumn 'Public_IP',([String])))
$VMInfo.Columns.Add((New-Object System.Data.DataColumn 'IP_MAC',([String])))
$VMInfo.Columns.Add((New-Object System.Data.DataColumn 'Priv_Dyn',([String])))
$VMInfo.Columns.Add((New-Object System.Data.DataColumn 'Status',([String])))
$VMInfo.Columns.Add((New-Object System.Data.DataColumn 'Date_Time',([String])))
$VMInfo_Array_Count=($VMInfo | Measure-Object | Select Count).Count

#List the Array to show it='s empty
Write-Host "Created Array VMInfo with $VMInfo_Array_Count objects"

$Date_Time=([DateTime]::Now).ToString("yyyy/MM/dd")+" "+([DateTime]::Now).ToString("HH:mm:ss")
#Check the OS type
If ($($ENV:OS)) {$OSTYPE="WINDOWS";Write-Host "The OS is"$OSTYPE" Based"} Else {$OSTYPE="LINUX";Write-Host "The OS is"$OSTYPE" Based"}
#Get the VM's
$VMs = Get-AzureRmVM
$VMstatus = Get-AzureRmVM -Status
#Get the NIC and their properties for matching against the VMs
$NICs = get-azurermnetworkinterface | where VirtualMachine -NE $null #skip NICs with no VM
#Get the Public IPs for matching against the VMs
#Public IPs work only if the naming convention starts with the VM Name used in Azure
$PublicIPs=Get-AzureRmPublicIpAddress | Select-Object Name,ResourceGroupName,IpAddress

#Now Loop through the NICs in Azure and match against the VMs and the Public IPs
ForEach ($nic in $NICs)
{
    #Get the VM Info
    $VM = $VMs | where-object -Property Id -EQ $nic.VirtualMachine.id
    $VM_Name = $($VM.name)
    $VM_Location = $($VM.Location)
    $VM_Resourcegroup = $($VM.ResourceGroupName)
    $VM_ID = $($VM.VMid)
    $VM_NIC = $nic.Name -Join ';'
    $VM_Status = (($VMstatus | Where {$_.ResourceGroupName -eq $VM_Resourcegroup -and $_.Name -eq $VM_Name}).PowerState).Replace('VM ', '')
    $VM_IP =  ($nic.IpConfigurations | select-object -ExpandProperty PrivateIpAddress) -Join ';'
    $VMPIPName = ($nic.IpConfigurations.PublicIpAddress.Id -Split '/')[-1]
    $VM_PublicIP =  ($PublicIPs | Where-Object {$_.ResourcegroupName -eq $VM_Resourcegroup -and $_.Name -like "$VMPIPName"} | Select IpAddress).IpAddress
    $VM_IP_MAC =  (($nic | Select MacAddress).MacAddress) -Join ';'
    $VM_Alloc =  $nic.IpConfigurations | select-object -ExpandProperty PrivateIpAllocationMethod

    #Uncomment this to check the values before going into the Array $VMINFO
    #Write-Output "$($VM.ResourceGroupName), $($VM.Name), $($VM.VMid), $($VM.Location), $VM_IP, $VM_PublicIP, $VM_IP_MAC, $VM_Alloc"

    #Now populate the $VMInfo array
    $row = $VMInfo.NewRow()
    $row.'ResourceGroup'=$VM_Resourcegroup
    $row.'VM'=$VM_Name
    $row.'VM_ID'=$VM_ID
    $row.'VM_NIC'=$VM_NIC
    $row.'Location'=$VM_Location
    $row.'IP'=$VM_IP
    $row.'Public_IP_Name'=$VMPIPName
    $row.'Public_IP'=$VM_PublicIP
    $row.'IP_MAC'=$VM_IP_MAC
    $row.'Priv_Dyn'=$VM_Alloc
    $row.'Status'=$VM_Status
    $row.'Date_Time'=$Date_Time
    $VMInfo.Rows.Add($row)
}
cls
$TotalTime=(NEW-TIMESPAN –Start $DateStart –End $(GET-DATE))
Write-Host "Script Ran in $($TotalTime.Hours) hours and $($TotalTime.Minutes) minutes and $($TotalTime.Seconds) seconds"

#Export the Info
Write-Host "Exporting VMINFO Report to `n`t$($VMInfo_Export)"
$VMInfo | Export-CSV -NoTypeInformation -Path $VMInfo_Export

#Depending on OS run the Open/Start command for the CSV Export
If ($OSTYPE -eq "LINUX") {open $VMInfo_Export} `
ElseIf ($OSTYPE -eq "WINDOWS") {start $VMInfo_Export} `
Else {Write-Host "Unknown OS"}

break

#####     ######     #####
#######     ######     #####
##     Extra Tasks to Filter the Exports
#####     ######     #####
#######     ######     #####

#Get the Array Size
$VMInfo_Array_Count=($VMInfo | Measure-Object | Select Count).Count

#ECHO the Array size
Write-Host "`n`n*****     *****"
Write-Host "Array VMInfo has $VMInfo_Array_Count objects"
Write-Host "*****     *****"

break
#Shows Configured Resource Group Names
$VMInfo_ResourceGroupNames=($vminfo | Select ResourceGroup -Unique).ResourceGroup

#ECHO Configured Resource Group Names
Write-Host "`n`n*****     *****"
Write-Host "*****     List of Groups*****"
Write-Host "*****     *****"
$($VMInfo_ResourceGroupNames)

break
#Get DC's from resource Group Name
$VM_Environment="dtdaily"
$VMInfo_GetDCs=$vminfo | where {$_.ResourceGroup -eq $VM_Environment -and $_.VM -like "*dc*"}

#ECHO DC's from resource Group Name
Write-Host "`n`n*****     *****"
Write-Host "*****     List of DC's"
Write-Host "*****     *****"
$($VMInfo_GetDCs)

break
#Get Public IP VMs
$VMInfo_PublicIPs=$vminfo | Where {$_.Public_IP -like "*.*"}

#ECHO Public IP VMs
Write-Host "`n`n*****     *****"
Write-Host "*****     *****"
Write-Host "*****     List of Public IP VMs"
Write-Host "*****     *****"
$($VMInfo_PublicIPs)

break
#ECHO All VMs
$VMInfo

Break

Get-AzureRmPublicIpAddress (AzureRM.Network), I'm trying to write some Powershell to get a list of Azure ARM vms (Not classic) and the currently associated IP addresses for their NICs. In classic, this was part of  Note that the IP address is associated to the VM. As noted in the previous post we could use something like the below to get a list of all the VMs and their associated IP addresses in a given Cloud Service: Get-AzureVM -ServiceName TailspinToysCanada | Select-Object Name, *IP* | Format-Table –AutoSize

For those that are looking for a solution that works across multiple subscriptions in a tenant, here's a script that loops through each subscription and reports on each private IP, NIC, VM, Resource Group and associated subscription. The output is in object format and is exported to a CSV file.

<#
    .SYNOPSIS
        Returns IP addresses and associated network interfaces and virtual machines across all Azure subscriptions the
        user has access to.

    .DESCRIPTION
        This script returns all private IP addresses, the IP configuration resources they are associated with, the network interfaces and virtual
        machines across all subscriptions. This script requires:

        1. The Azure module to be installed (https://docs.microsoft.com/en-us/powershell/azure/install-az-ps?view=azps-2.8.0)
        2. The user to be logged in to an Azure account using Connect-AzAccount / Connect-AzureRmAccount
        3. The user must have subscription wide read permissions assigned for each subscription being queried

    .PARAMETER FileName
        Optional. Specify the file name and path for a CSV export.

    .EXAMPLE
        Get-IpAddressAllocation.ps1 -FileName .\AzureIpAddressReport.csv
#>

<#
    .AUTHOR
        Michael Wheatfill

    .LICENSEURI
        https://github.com/mwheatfill/mwheatfill.github.io/blob/master/LICENSE.txt
#>

#region Parameters
[CmdletBinding()]
param (
    [Parameter(Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [String]
    $FileName
)
#endregion Parameters

#region Initializations
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
#endregion Initializations

#region Functions
function Get-IpAddresses {
    param ()

    $networkInterfaces = Get-AzNetworkInterface | Where-Object {$_.VirtualMachine -ne $null}
    $virtualMachines = Get-AzVM
    $results = @()

    foreach($interface in $networkInterfaces) {
        $ipConfigurations = $interface.IpConfigurations

        foreach($ipConfig in $ipConfigurations) {
            $vm = $virtualMachines | Where-Object {$_.Id -eq $interface.VirtualMachine.Id}

            $ipDetails = [pscustomobject]@{
                PrivateIpAddress = $ipConfig.PrivateIpAddress
                VMName = $vm.Name
                NetworkInterface = $interface.Name
                IpConfigName = $ipConfig.Name
                Primary = $ipConfig.Primary
                ResourceGroup = $vm.ResourceGroupName
                Subscription = $subscription.Name
            }
            $results += $ipDetails
        }
    }
    return $results
}
#endregion Functions

#region Main
$subscriptions = Get-AzSubscription | Select-Object
$ipAddressesInAllSubscriptions = @()
$progressCount = 0

foreach ($subscription in $subscriptions) {
    $progressCount++
    $progressComplete = ($progressCount / $subscriptions.count * 100)
    $progressMessage = "Gathering IP address informtion for subscription $progressCount of $($subscriptions.Count)"
    Write-Progress -Activity $progressMessage -Status ($subscription.Name) -PercentComplete $progressComplete

    $subscription | Select-AzSubscription > $null
    $ipAddressesInSubscription = Get-IpAddresses -SubscriptionObject $subscription
    $ipAddressesInAllSubscriptions += $ipAddressesInSubscription
}

$ipAddressesInAllSubscriptions | Sort-Object -Property Subscription, VMName, NetworkInterface, IpConfigName, Primary | Format-Table
$ipAddressesInAllSubscriptions | Export-Csv -Path $FileName -NoTypeInformation
#endregion Main

PowerTip: Get the public IP of an Azure VM with PowerShell , The Get-AzureRmPublicIPAddress cmdlet gets one or more public IP addresses in a resource group. Syntax; Description; Examples; Parameters; Inputs; Outputs; Related Links. Syntax. PowerShell. Copy. Get-AzureRmPublicIpAddress [-Name <String>] [-ResourceGroupName Virtual Machine Network Interface Name. ARM: Public IP addresses – Static or Dynamic: The first 5 “static” public IP addresses in a region are free. This is applicable irrespective of the type of resource (VM or Load-balancer) to which the IP address is associated. All others are charged at $0.004 /hr. ASM/Classic: Cloud Service VIP: Every Cloud Service gets a free public VIP.

I have searched a lot and finally succeeded. Using resource group name and azure vm name, you can retrieve private or public ip address:

$Resourcegroup=""

$VmName=""

$VmNetworkdetails= (((Get-AzureRmVM -ResourceGroupName $Resourcegroup -Name $VmName).NetworkProfile).NetworkInterfaces).Id

$nicname = $VmNetworkdetails.substring($VmNetworkdetails.LastIndexOf("/")+1)

$privateIp =(Get-AzureRmNetworkInterface -Name $nicname -ResourceGroupName $Resourcegroup)|Select-Object -ExpandProperty IPConfigurations 

write-host $privateIp.PrivateIpAddress

Configure IP addresses for an Azure network interface, How can I get the public IP address information for an Azure Resource Manager virtual machine (VM)?. Hey, Scripting Guy! Answer All you need  And the public IP in Azure is an individual resource associated with the network interface, not the VM. As you see, there no parameter for VM name to get the public IP in that document. But you can get the public IP through a PowerShell script just with the VM name and resource group name.

Public IP Addresses, Private IP addresses assigned to a network interface enable a virtual machine to communicate with other resources in an Azure virtual network and connected networks. Run Get-Module -ListAvailable Az to find the installed version. Manually add secondary private IP addresses to the virtual machine  I have seen this a couple of times before. If you want to get the IP address immediately, then you need to use static for the "publicIPAllocationMethod" property.. If you do not want to use static (Reserved IPs), then you need to put a dependency on the Virtual Machine that is attached to the Public IP (the address will be allocated then).

Create, change, or delete an Azure public IP address, Gets the specified public IP address in a specified resource group. GET https://​management.azure.com/subscriptions/{subscriptionId}/ The current provisioning state. Contains FQDN of the DNS record associated with the public IP Whether this is a primary network interface on a virtual machine. I have VM with name es-client-node1, es-client-node2, es-master-node1, es-data-node1 & es-data-node1. I want to get IP address of just client node or VM's name matches with es-client-node*, similarly for datanode & master node into different variable. any idea how to do this in powershell ?

Export Azure IaaS VM properties, including NIC IP address to CSV , Learn how to create, change, or delete a public IP address. For example, a virtual machine can communicate outbound to the Internet Run Get-Module -​ListAvailable Az to find the installed version. If the address is associated to a resource, you may not be able to change the assignment method. An Azure Virtual Machine (VM) has one or more network interfaces (NIC) attached to it. Any NIC can have one or more static or dynamic public and private IP addresses assigned to it. Assigning multiple IP addresses to a VM enables the following capabilities:

Comments
  • good :-) would be better to filter by IP but it's not tricky to implement !
  • Tameem, Can you please tell me how to get the public IP address of my virtual machine. currently i deployed my virtual machine using ARM template.
  • This script didn't work for me - seems like wrong syntax