|
function ConvertFrom-CidrToIPvNetwork |
|
{ |
|
[CmdletBinding()] |
|
param( |
|
[Parameter(Mandatory, ValueFromPipeline)] |
|
[string] $vlsm |
|
) |
|
|
|
$convertToIpAddress = { |
|
param( |
|
[int] $byteRange, |
|
[System.Numerics.BigInteger]$bigInt |
|
) |
|
|
|
$bytes = $bigInt.ToByteArray() |
|
$null = [System.Array]::Reverse($bytes, 0, $byteRange) |
|
$null = [System.Array]::Resize([ref] $bytes, $byteRange) |
|
[System.Net.IpAddress]::new($bytes) |
|
} |
|
|
|
$ipAddress, $prefix = $vlsm -split '/' |
|
$ipAddressIP = [System.Net.IPAddress]::Parse($ipAddress) |
|
|
|
|
|
if ($ipAddressIP.AddressFamily -eq 'InterNetwork') { |
|
# use V4 |
|
$byteRange = 4 |
|
} else { |
|
# Use V6 |
|
$byteRange = 16 |
|
} |
|
|
|
$ipAddress = [System.Numerics.BigInteger]::new( $ipAddressIP.GetAddressBytes()[($byteRange-1)..0]) |
|
#$ipAddress = [bigint]::new( ([byte[]]$ipAddressIP.GetAddressBytes()[($byteRange-1)..0]), $true, $true ) |
|
$broadcastAddress = ( [System.Numerics.BigInteger]1 -shl ($byteRange* 8) ) - 1 |
|
$subnetMask = $broadcastAddress -shl (($byteRange*8) - $prefix) |
|
$networkAddress = $ipAddress -band $subnetMask |
|
$networkBroadcast = $networkAddress -bor (-bnot $subnetMask) |
|
$startIPAddress = $networkAddress + 1 |
|
$endIPAddress = $networkBroadcast - 1 |
|
$total = [System.Numerics.BigInteger]::Pow(2, (($byteRange*8)- $prefix)) - 2 |
|
|
|
[PSCustomObject][Ordered]@{ |
|
IpAddress = $ipAddressIP |
|
AddressFamily = $ipAddressIP.AddressFamily |
|
Prefix = $prefix |
|
Network = & $convertToIpAddress $byteRange $networkAddress |
|
SubnetMask = & $convertToIpAddress $byteRange $subnetMask |
|
BroadcastAddress = & $convertToIpAddress $byteRange $broadcastAddress |
|
|
|
Range = [PSCustomObject][Ordered]@{ |
|
Start = & $convertToIpAddress $byteRange $startIPAddress |
|
End = & $convertToIpAddress $byteRange $endIPAddress |
|
Total = $total |
|
} |
|
} |
|
} |
|
|
|
function Test-IpAddressinNetwork { |
|
[CmdletBinding()] |
|
param( |
|
[Parameter(Mandatory, ValueFromPipeline)] |
|
[string] $ipAddress, |
|
[Parameter(Mandatory, ValueFromPipeline)] |
|
[string] $vlsm |
|
) |
|
|
|
$ipAddressIP = [System.Net.IPAddress]::Parse($ipAddress) |
|
$vlsmNetwork = ConvertFrom-CidrToIPvNetwork -vlsm $vlsm |
|
|
|
if ($ipAddressIP.AddressFamily -eq 'InterNetwork') { |
|
# use V4 |
|
$byteRange = 4 |
|
} else { |
|
# Use V6 |
|
$byteRange = 16 |
|
} |
|
|
|
$ipAddress = [System.Numerics.BigInteger]::new( $ipAddressIP.GetAddressBytes()[($byteRange-1)..0]) |
|
$networkAddress = [System.Numerics.BigInteger]::new( $vlsmNetwork.Network.GetAddressBytes()[($byteRange-1)..0]) |
|
$subnetMask = [System.Numerics.BigInteger]::new( $vlsmNetwork.SubnetMask.GetAddressBytes()[($byteRange-1)..0]) |
|
|
|
return ($ipAddress -band $subnetMask) -eq ($networkAddress -band $subnetMask) |
|
} |