vbscriptipnetmask

IP range calculator from IP Address/netmask using VBScript


I hate to ask this question, but am very new to scripting and need help.

I would like to create a calculator using VBS that will accept my input and give me a range of IP address acceptable.

For example:

VBS asks for user input User inputs the IP address/netmask : 214.13.104.128/28

Output: IP Address Range = 214.13.104.129 - 214.13.104.190

I know that there are many online tools you can use, but I will need to use this on systems that cant access the internet.


Solution

  • Not sure if you still need this but for the sake of Informational Science and those who are searching for a solution I'm posting this anyways. I hope it at least helps someone looking for a solution. If not the OP... many other Stack Overflow users.

    CIDRIP = "192.168.0.1/24" 'must be in CIDR Format as no error checking added
    wscript.echo "IP Address Range " & CIDR2IP(CIDRIP, false) & " - " & CIDR2IP(CIDRIP, True)
    
    Function CIDR2IP(ip, high)
        highs = "11111111111111111111111111111111"
        lows = "00000000000000000000000000000000"
        byte0 = Dec2bin(Split(ip, ".")(0))
        byte1 = Dec2bin(Split(ip, ".")(1))
        byte2 = Dec2bin(Split(ip, ".")(2))
        byte3 = Dec2bin(Split(Split(ip, ".")(3), "/")(0))
        Mask = Split(Split(ip, ".")(3), "/")(1)
        bytes = byte0 & byte1 & byte2 & byte3
        rangelow = Left(bytes, Mask) & Right(lows, 32 - Mask)
        rangehigh = Left(bytes, Mask) & Right(highs, 32 - Mask)
        iplow = bin2ip(Left(bytes, Mask) & Right(lows, 32 - Mask))
        iphigh = bin2ip(Left(bytes, Mask) & Right(highs, 32 - Mask))
        If high Then
            CIDR2IP = iphigh
        Else
            CIDR2IP = iplow
        End If
    End Function
    

    Function that converts a 32-bit Binary string into an IP Address

    'expecting input like 00000000000000000000000000000000
    Function bin2ip(strbin)
        ip0 = C2dec(Mid(strbin, 1, 8))
        ip1 = C2dec(Mid(strbin, 9, 8))
        ip2 = C2dec(Mid(strbin, 17, 8))
        ip3 = C2dec(Mid(strbin, 25, 8))
        'combines all of the bytes into a single string
        bin2ip = ip0 & "." & ip1 & "." & ip2 & "." & ip3 
    End Function
    

    Function that converts binary number to a decimal

    'expecting input like 00010101
    Function C2dec(strbin)
        length = Len(strbin)
        dec = 0
        For x = 1 To length
            binval = 2 ^ (length - x)
            temp = Mid(strbin, x, 1)
            If temp = "1" Then dec = dec + binval
        Next
        C2dec = dec
    End Function
    

    Function that converts decimal number into Binary

    'Expecting input 0 thru 255
    Function Dec2bin(dec)
        Const maxpower = 7
        Const length = 8
        bin = ""
        x = cLng(dec)
        For m = maxpower To 0 Step -1
            If x And (2 ^ m) Then
                bin = bin + "1"
            Else
                bin = bin + "0"
            End If
        Next
        Dec2bin = bin
    End Function
    

    Added Bonus - for anyone that knows MYSQL and using IP addresses in MYSQL, they'll immediately recognize the functions.

    'expecting input like 10.120.44.1 and converts to 175647745
    Function INET_NTOA(ip)
        ip0 = Split(ip, ".")(0)
        ip1 = Split(ip, ".")(1)
        ip2 = Split(ip, ".")(2)
        ip3 = Split(ip, ".")(3)
        urlobfs = 0
        urlobfs = ip0 * 256
        urlobfs = urlobfs + ip1
        urlobfs = urlobfs * 256
        urlobfs = urlobfs + ip2
        urlobfs = urlobfs * 256
        urlobfs = urlobfs + ip3
        INET_NTOA = urlobfs
    End Function
    
    'expecting input like 175647745 and converts to 10.120.44.1
    'Bugs will occur for CLng ceiling numbers. +/- 2,147,483,647
    Function INET_ATON(ip)
        Dim ipa()
        ReDim ipa(3)
        n2ip = ip
        For i = 3 To 1 Step -1
            ipa(i) = n2ip Mod 256
            n2ip = n2ip / 256
        Next
        ipa(0) = CInt(n2ip)
        INET_ATON = ipa(0) & "." & ipa(1) & "." & ipa(2) & "." & ipa(3)
    End Function
    

    Update Sept 2021 Popular request demanded returning a usable IP range from a CIDR Address and I had no idea... It's been sitting in my list of random IP functions forever.

    Function CIDR2IPRANGE(cidr)
        ip = cidr
        highs = "11111111111111111111111111111111"
        lows = "00000000000000000000000000000000"
        byte0 = Dec2bin(Split(ip, ".")(0))
        byte1 = Dec2bin(Split(ip, ".")(1))
        byte2 = Dec2bin(Split(ip, ".")(2))
        byte3 = Dec2bin(Split(Split(ip, ".")(3), "/")(0))
        Mask = Split(Split(ip, ".")(3), "/")(1)
        bytes = byte0 & byte1 & byte2 & byte3
        lownetworkrange = Left(bytes, Mask)
        lowhostrange = Right(lows, 31 - Mask) & "1"
        rangelow = lownetworkrange + lowhostrange
        highnetworkrange = Left(bytes, Mask)
        highhostrange = Right(highs, 31 - Mask) & "0"
        rangehigh = highnetworkrange + highhostrange
        iplow = bin2ip(rangelow)
        iphigh = bin2ip(rangehigh)
        CIDR2IP = iplow & " - " & iphigh
    End Function
    

    Cheers!