Check neighbors for valid guest address when default lookup fails

If the guest address is unavailable via Hyper-V inspection, extract
MAC address of network adapters and check neighbor information for
any currently matching known address.
This commit is contained in:
Chris Roberts 2018-04-26 12:53:52 -07:00
parent 2cdbb1eee7
commit d15ff38d5c
1 changed files with 33 additions and 21 deletions

View File

@ -1,7 +1,7 @@
Param( Param(
[Parameter(Mandatory=$true)] [Parameter(Mandatory=$true)]
[string]$VmId [string]$VmId
) )
# Include the following modules # Include the following modules
$Dir = Split-Path $script:MyInvocation.MyCommand.Path $Dir = Split-Path $script:MyInvocation.MyCommand.Path
@ -10,33 +10,45 @@ $Dir = Split-Path $script:MyInvocation.MyCommand.Path
$vm = Hyper-V\Get-VM -Id $VmId -ErrorAction "Stop" $vm = Hyper-V\Get-VM -Id $VmId -ErrorAction "Stop"
$networks = Hyper-V\Get-VMNetworkAdapter -VM $vm $networks = Hyper-V\Get-VMNetworkAdapter -VM $vm
foreach ($network in $networks) { foreach ($network in $networks) {
if ($network.IpAddresses.Length -gt 0) { if ($network.IpAddresses.Length -gt 0) {
foreach ($ip_address in $network.IpAddresses) { foreach ($ip_address in $network.IpAddresses) {
if ($ip_address.Contains(".")) { if ($ip_address.Contains(".") -And [string]::IsNullOrEmpty($ip4_address)) {
$ip4_address = $ip_address $ip4_address = $ip_address
} elseif ($ip_address.Contains(":")) { } elseif ($ip_address.Contains(":") -And [string]::IsNullOrEmpty($ip6_address)) {
$ip6_address = $ip_address $ip6_address = $ip_address
} }
if (-Not ([string]::IsNullOrEmpty($ip4_address)) -Or -Not ([string]::IsNullOrEmpty($ip6_address))) { }
# We found our IP address! }
break }
}
# If no address was found in the network settings, check for
# neighbor with mac address and see if an IP exists
if (([string]::IsNullOrEmpty($ip4_address)) -And ([string]::IsNullOrEmpty($ip6_address))) {
$macaddresses = $vm | select -ExpandProperty NetworkAdapters | select MacAddress
foreach ($macaddr in $macaddresses) {
$macaddress = $macaddr.MacAddress -replace '(.{2})(?!$)', '${1}-'
$addr = Get-NetNeighbor -LinkLayerAddress $macaddress | select IPAddress
$ip_address = $addr.IPAddress
if ($ip_address.Contains(".")) {
$ip4_address = $ip_address
} elseif ($ip_address.Contains(":")) {
$ip6_address = $ip_address
}
} }
}
} }
if (-Not ([string]::IsNullOrEmpty($ip4_address))) { if (-Not ([string]::IsNullOrEmpty($ip4_address))) {
$guest_ipaddress = $ip4_address $guest_ipaddress = $ip4_address
} elseif (-Not ([string]::IsNullOrEmpty($ip6_address))) { } elseif (-Not ([string]::IsNullOrEmpty($ip6_address))) {
$guest_ipaddress = $ip6_address $guest_ipaddress = $ip6_address
} }
if (-Not ([string]::IsNullOrEmpty($guest_ipaddress))) { if (-Not ([string]::IsNullOrEmpty($guest_ipaddress))) {
$resultHash = @{ $resultHash = @{
ip = $guest_ipaddress ip = $guest_ipaddress
} }
$result = ConvertTo-Json $resultHash $result = ConvertTo-Json $resultHash
Write-Output-Message $result Write-Output-Message $result
} else { } else {
Write-Error-Message "Failed to determine IP address" Write-Error-Message "Failed to determine IP address"
} }