# encoding: ascii
# api: powershell
# title: Update Subnet Masks
# description: Script to update subnet mask for all devices connected to a specific network.  Specify network and new subnet mask and run on each device.
# version: 10.200
# author: Mitch
# license: CC0
# x-poshcode-id: 3149
# x-archived: 2016-03-03T19:24:37
# x-published: 2012-01-06T15:59:00
#
#
#config
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#NOTE: Does not support IPv6.  If used on a network with static IPv6 addresses,
#they may be lost.
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$network = "10.200.*"
$newSubnet = "255.255.240.0"

#get WMI for network adapters
$nics = Get-WMIObject Win32_NetworkAdapterConfiguration | where { $_.IPEnabled -eq "TRUE" }

#loop over each adapter
foreach ($nc in $nics) 
{ 
    $addresses = [System.Collections.ArrayList]$nc.IPAddress
    $smasks = [System.Collections.ArrayList]$nc.IPSubnet
    $needsChange = $FALSE
    
    write-host ("{0} addresses found" -f $addresses.count)
    
    #loop over each address
    for ($i = 0; $i -lt $addresses.count;)
    {
        $addy = $addresses[$i]
        $sm = $smasks[$i]

        #remove from array all 
        if ($addy -notLike '*.*.*.*')
        {
            $addresses.RemoveRange($i, 1)
            $smasks.RemoveRange($i, 1)
        }    
        #if the address needs to be updated, change it and flag for update
        elseif ($addy -like $network -and $sm -ne $newSubnet)
        {
            write-host ("Updating address {0}/{1}" -f $addy, $sm)
            $smasks[$i] = $newSubnet
            $needsChange = $TRUE
            
            $i++;
        }
        #otherwise, skip it
        else
        {
            write-host ("Skipping address {0}/{1}" -f $addy, $sm)
            
            $i++;
        }
    }
    
    #if we had any ips that needed to be updated, do so now.
    if ($needsChange)
    {
        write-host ("Updating Addresses...")
        $res = [int]($nics.EnableStatic($addresses, $smasks).ReturnValue)
        
        #a nonzero value indicates failure
        if ($res -eq 0) {
            write-host "Updated Successfully!"
        } else {
            write-host ("Updating the IP Address failed with error {0}" -f $res)
        }
    }
    #no addresses changed
    else 
    {
        write-host "No changes needed"
    }
}
write-host 'done '
