The following script is an amalgamation of several tools I’ve built up over the last couple of years to work with multiple DHCP scopes on servers. It has 6 basic modes of operation, as detailed below, which allow you to list all scopes on a server, enable all scopes on a server, disable all scopes on a server, change the lease time for all scopes on a server, change the offer delay for all scopes on a server or add reservations to one or more servers. You can use help .\DHCP-Tool.ps1 to get more information on the various switches, though it’s worth pointing out that leasetimes are in seconds while delaytimes are in milliseconds.

Hopefully the new Server 2012 powershell modules for DHCP solve a lot of these problems, but I haven’t had a chance to dig into them yet.

    .\DHCP-Tool.ps1 -Server <String> [-show]
    .\DHCP-Tool.ps1 -Server <String> [-enable]
    .\DHCP-Tool.ps1 -Server <String> [-disable]
    .\DHCP-Tool.ps1 -Server <String> [-lease] -leasetime <String>
    .\DHCP-Tool.ps1 -Server <String> [-delay] -delaytime <Int32>
    .\DHCP-Tool.ps1 -Server <String> [-reserve] -ipscope <String> -ipaddr <String> -mac <String> [-altservers <String>] [-name <String>]
################################################################################################
#This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;    #
#without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     #
#THERE IS NO WARRANTY FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT      #
#WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS PROVIDE THE SOFTWARE "AS IS" WITHOUT   #
#WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE         #
#IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK   #
#AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH YOU. SHOULD THE SOFTWARE PROVE      #
#DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. IN NO EVENT  #
#UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, BE       #
#LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES#
#ARISING OUT OF THE USE OR INABILITY TO USE THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS    #
#OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A    #
#FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER HAS BEEN     #
#ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.                                                   #
################################################################################################

<#
.SYNOPSIS
    DHCP Multitool
.DESCRIPTION
    Provides a variety of functions for making changes to multiple DHCP scopes and/or multiple DHCP servers
.PARAMETER Server
    The hostname or IP address of the DHCP server to work with
.PARAMETER Show
    Action: List current scope configuration
.PARAMETER Enable
  Action: Enable all scopes on server
.PARAMETER Disable
  Action: Disable all scopes on server
.PARAMETER Lease
  Action: Alters lease time on all scopes on server
.PARAMETER LeaseTime
  DHCP Lease time in seconds
.PARAMETER Delay
  Action: Alters offer delay on all scopes on server
.PARAMETER DelayTime
  Offer Delay time in miliseconds
.PARAMETER Reserve
  Action: Add reservation to server
.PARAMETER AltServer
  Additional servers to create reservation on
.PARAMETER IPScope
  Name of scope to work with
.PARAMETER IPAddr
  IP Address to reserve
.PARAMETER MAC
  MAC Address to associated reservation with
.PARAMETER Name
  Comment to add to reservation
.EXAMPLE
    C:\>dhcp-tool.ps1 -server 127.0.0.1 -enable
  Enables all scopes on server 127.0.0.1
.EXAMPLE
    C:\>dhcp-tool.ps1 -server 127.0.0.1 -delay -delaytime 1000
  Sets an offer delay of 1000ms on all scopes on server 127.0.0.1
.NOTES
    Author: Adam Beardwood
    Date: October 12, 2012
  v1.0: Initial Release
  v1.1: Added Better Error Handling and Command Feedback
#>

[CmdletBinding(DefaultParametersetName="showDHCP")]
Param(
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)][String]$Server,

    [Parameter(ParameterSetName='showDHCP')][switch]$show,

    [Parameter(ParameterSetName='enableDHCP')][switch]$enable,

    [Parameter(ParameterSetName='disableDHCP')][switch]$disable,

    [Parameter(ParameterSetName='leaseDHCP')][switch]$lease,
    [Parameter(ParameterSetName='leaseDHCP',Mandatory=$true,ValueFromPipeline=$true)][string]$leasetime,

    [Parameter(ParameterSetName='delayDHCP')][switch]$delay,
    [Parameter(ParameterSetName='delayDHCP',Mandatory=$true,ValueFromPipeline=$true)][ValidateRange(0,1000)][int]$delaytime,

    [Parameter(ParameterSetName='reserveDHCP')][switch]$reserve,
    [Parameter(ParameterSetName='reserveDHCP',Mandatory=$true)][string]$ipscope,
    [Parameter(ParameterSetName='reserveDHCP',Mandatory=$true)][string]$ipaddr,
    [Parameter(ParameterSetName='reserveDHCP',Mandatory=$true)][string]$mac,
    [Parameter(ParameterSetName='reserveDHCP',Mandatory=$false)][string]$altservers = $null,
    [Parameter(ParameterSetName='reserveDHCP',Mandatory=$false)][string]$name
)

function getDHCPScope($servername, $type) {

  $ips = @()

  $scopes = netsh dhcp server $servername show scope

  if($type -eq "show"){
    foreach($scope in $scopes){
      write-host $scope -foregroundcolor green
    }
  }else{

    $regex = [regex]"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"

    foreach($scope in $scopes){

      $addr = $scope | foreach {$regex.Matches($_) | foreach {$_.Captures[0].Value}}
      if($addr -ne $null){
        $ips += $addr[0]
      }
    }

    return $ips
  }
}

function enableDHCPScope($servername, $ip){
  netsh dhcp server $servername scope $ip set state 1 | out-null
}

function disableDHCPScope($servername, $ip){
  netsh dhcp server $servername scope $ip set state 0 | out-null
}

function leaseDHCPScope($servername, $ip, $leasetime){
  netsh dhcp server $servername scope $ip set optionvalue 51 DWORD $leasetime | out-null
  $leaseinfo = netsh dhcp server $servername scope $ip show optionvalue
  foreach($info in $leaseinfo){if($info -match "OptionId : 51"){write-host "Scope $ip lease length: $($($leaseinfo[$([array]::IndexOf($leaseinfo, $info))+4]).split('=')[1]) seconds" -foregroundcolor green}}
}

function delayDHCPScope($servername, $ip, $leasetime){
  netsh dhcp server $server scope $ip set delayoffer $delaytime | out-null
  $delayinfo = netsh dhcp server $servername scope $ip show delayoffer
  foreach($info in $delayinfo){if($info -match "DelayOffer"){write-host $info -foregroundcolor green}}
}

function reserveDHCPScope($servername, $altservers, $ipscope, $ipaddr, $mac, $name){

  $servers = @($servername)

  foreach($alt in $altservers){
    if(($alt -ne "") -and ($alt -ne $null)){$servers += "\\$alt"}
  }

  write-host "Servers: $servers"

  foreach($server in $servers){

    $result = netsh dhcp server $server scope $ipscope
    if($result -match "The command needs a valid Scope IP Address"){
      write-host "Scope Does Not Exist!"
      exit 1
    }

    $result = netsh dhcp server $server scope $ipscope show clients
    if($result -match $ipaddr){
      write-host "IP Address Already Reserved!"
      exit 1
    }

    $regex = [regex]"([0-9A-Fa-f]{2}[:-]*){5}([0-9A-Fa-f]{2})"
    $result = $mac | foreach {$regex.Matches($_) | foreach {$_.Captures[0].Value}}
    if($result -eq $null){
      write-host "Invalid MAC Address!"
      exit 1
    }

    netsh dhcp server $server scope $ipscope add reservedip $ipaddr $mac $name
  }

}

if($(Get-Service -ComputerName $server -Name DHCPServer -ErrorAction SilentlyContinue) -eq $null){
  write-host "The specified server does not appear to be running DHCP"
  exit 1
}

$servername = "\\$server"

switch ($PsCmdlet.ParameterSetName){
  "showDHCP"{getDHCPScope $servername "show" }
  "enableDHCP"{foreach($ip in $(getDHCPScope $servername)){enableDHCPScope $servername $ip};getDHCPScope $servername "show"}
  "disableDHCP"{foreach($ip in $(getDHCPScope $servername)){disableDHCPScope $servername $ip};getDHCPScope $servername "show"}
  "leaseDHCP"{foreach($ip in $(getDHCPScope $servername)){leaseDHCPScope $servername $ip $leasetime}}
  "delayDHCP"{foreach($ip in $(getDHCPScope $servername)){delayDHCPScope $servername $ip $delaytime}}
  "reserveDHCP"{reserveDHCPScope $servername $altservers $ipscope $ipaddr $mac $name}
}