Public/Test-IPv4SameSubnet.ps1
<#
.SYNOPSIS Determines if two IP addresses are on the same subnet. .DESCRIPTION This function determines if two IP addresses given in the 'Address/Subnet' or 'Address/MaskLength' format belong to the same subnet, i.e. are able to reach each others without going through the gateway. If the subnet masks are different, the smaller subnet will determine the result. .PARAMETER IPAddress1 First IP address for comparison. .PARAMETER IPAddress2 Second IP address for comparison. .EXAMPLE Test-IPv4SameSubnet -IPAddress1 '10.0.101.22/22' -IPAddress2 '10.0.101.34/22' Returns a complete subnet definition, without geoinformation, for the specified address. .INPUTS None. This cmdlet does not accept pipeline input. .OUTPUTS Boolean #> function Test-IPv4SameSubnet { [CmdletBinding()] Param( [Parameter(Mandatory=$true)] [string]$IPAddress1, [Parameter(Mandatory=$true)] [string]$IPAddress2 ) $IPresolved1 = Resolve-IPv4Address -IPAddress $IPAddress1 if ($null -ne $IPresolved1) { Write-Verbose "IPAddress1 resolved to $($IPresolved1.Subnet)/$($IPresolved1.SubnetMaskLength)" } else { Write-Verbose "IPAddress1 could not be resolved" } $IPresolved2 = Resolve-IPv4Address -IPAddress $IPAddress2 if ($null -ne $IPresolved2) { Write-Verbose "IPAddress2 resolved to $($IPresolved2.Subnet)/$($IPresolved2.SubnetMaskLength)" } else { Write-Verbose "IPAddress1 could not be resolved" } $result = $false if (($null -ne $IPresolved1) -and ($null -ne $IPresolved2)) { if ($IPresolved1.IPAddress -eq $IPresolved2.IPAddress) { Write-Verbose "Samer IP address!" $result = $true } elseif ($IPresolved1.SubnetMaskLength -eq $IPresolved2.SubnetMaskLength) { if ($IPresolved1.Subnet -eq $IPresolved2.Subnet) { Write-VErbose "Same mask length, same subnet" $result = $true } else { Write-VErbose "Same mask length, different subnet" } } else { if ($IPresolved1.SubnetMaskLength -gt $IPresolved2.SubnetMaskLength) { $subnetMaskLength = $IPresolved1.SubnetMaskLength $subnet1 = $IPresolved1.Subnet $subnet2 = (Resolve-IPv4Address "$($IPresolved2.IPAddress)/$subnetMaskLength").Subnet Write-Verbose "Subnet mask 1 is shorter, expanding subnet 2 to $($subnet2)/$subnetMaskLength" } else { $subnetMaskLength = $IPresolved2.SubnetMaskLength $subnet1 = $IPresolved2.Subnet $subnet2 = (Resolve-IPv4Address "$($IPresolved1.IPAddress)/$subnetMaskLength").Subnet Write-Verbose "Subnet mask 2 is shorter, expanding subnet 1 to $($subnet2)/$subnetMaskLength" } if ($subnet1 -eq $subnet2) { Write-Verbose "Subnets match!" $result = $true } } } return $result } |