Advertisement
Guest User

Untitled

a guest
Apr 20th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.22 KB | None | 0 0
  1. function Get-Subnet {
  2. param (
  3. [parameter(ValueFromPipeline)]
  4. [String]
  5. $IP,
  6.  
  7. [ValidateRange(0, 32)]
  8. [int]
  9. $MaskBits,
  10.  
  11. [switch]
  12. $SkipHosts
  13. )
  14. Begin {
  15. function Convert-IPtoINT64 ($ip) {
  16. $octets = $ip.split(".")
  17. [int64]([int64]$octets[0] * 16777216 + [int64]$octets[1] * 65536 + [int64]$octets[2] * 256 + [int64]$octets[3])
  18. }
  19.  
  20. function Convert-INT64toIP ([int64]$int) {
  21. (([math]::truncate($int / 16777216)).tostring() + "." + ([math]::truncate(($int % 16777216) / 65536)).tostring() + "." + ([math]::truncate(($int % 65536) / 256)).tostring() + "." + ([math]::truncate($int % 256)).tostring() )
  22. }
  23.  
  24. If (-not $IP -and -not $MaskBits) {
  25. $LocalIP = (Get-NetIPAddress | Where-Object {$_.AddressFamily -eq 'IPv4' -and $_.PrefixOrigin -ne 'WellKnown'})
  26.  
  27. $IP = $LocalIP.IPAddress
  28. $MaskBits = $LocalIP.PrefixLength
  29. }
  30. }
  31. Process {
  32. If ($IP -match '/\d') {
  33. $IPandMask = $IP -Split '/'
  34. $IP = $IPandMask[0]
  35. $MaskBits = $IPandMask[1]
  36. }
  37.  
  38. $IPAddr = [Net.IPAddress]::Parse($IP)
  39.  
  40. $Class = Switch ($IP.Split('.')[0]) {
  41. {$_ -in 0..127} { 'A' }
  42. {$_ -in 128..191} { 'B' }
  43. {$_ -in 192..223} { 'C' }
  44. {$_ -in 224..239} { 'D' }
  45. {$_ -in 240..255} { 'E' }
  46.  
  47. }
  48.  
  49. If (-not $MaskBits) {
  50. $MaskBits = Switch ($Class) {
  51. 'A' { 8 }
  52. 'B' { 16 }
  53. 'C' { 24 }
  54. default { Throw 'Subnet mask size was not specified and could not be inferred.' }
  55. }
  56.  
  57. Write-Warning "Subnet mask size was not specified. Using default subnet size for a Class $Class network of /$MaskBits."
  58. }
  59.  
  60. If ($MaskBits -lt 16 -and -not $SkipHosts) {
  61. Write-Warning "It may take some time to calculate all host addresses for a /$MaskBits subnet. Use -SkipHosts to skip."
  62. }
  63.  
  64. $MaskAddr = [Net.IPAddress]::Parse((Convert-INT64toIP -int ([convert]::ToInt64(("1" * $MaskBits + "0" * (32 - $MaskBits)), 2))))
  65.  
  66. $NetworkAddr = New-Object net.ipaddress ($MaskAddr.address -band $IPAddr.address)
  67. $BroadcastAddr = New-Object net.ipaddress (([system.net.ipaddress]::parse("255.255.255.255").address -bxor $MaskAddr.address -bor $NetworkAddr.address))
  68.  
  69. $HostStartAddr = (Convert-IPtoINT64 -ip $NetworkAddr.ipaddresstostring) + 1
  70. $HostEndAddr = (Convert-IPtoINT64 -ip $broadcastaddr.ipaddresstostring) - 1
  71.  
  72. If (-not $SkipHosts) {
  73. $HostAddresses = for ($i = $HostStartAddr; $i -le $HostEndAddr; $i++) {
  74. Convert-INT64toIP -int $i
  75. }
  76. }
  77.  
  78.  
  79. [pscustomobject]@{
  80. IPAddress = $IPAddr
  81. MaskBits = $MaskBits
  82. NetworkAddress = $NetworkAddr
  83. BroadcastAddress = $broadcastaddr
  84. SubnetMask = $MaskAddr
  85. NetworkClass = $Class
  86. Range = "$networkaddr ~ $broadcastaddr"
  87. HostAddresses = $HostAddresses
  88. }
  89. }
  90. End {}
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement