Last active
August 5, 2016 19:19
-
-
Save davegreen/f8390efe62c405ca8190d4a48bfeca0b to your computer and use it in GitHub Desktop.
More information can be found at http://tookitaway.co.uk/synchronizing-dhcp-reservations-between-two-dhcp-servers-serving-the-same-scope/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#Requires -Module DHCPServer | |
Function Get-UnmatchedDhcpServerv4Reservation { | |
<# | |
.Synopsis | |
A function gets DHCP IPv4 reservations from a single scope stretched over two DHCP servers. | |
.Description | |
A function gets DHCP IPv4 reservations from a single scope stretched over two DHCP servers | |
.Parameter ReferenceComputerName | |
A DHCP server computer name hosting the ScopeId specified. This parameter is mandatory. | |
.Parameter DifferenceComputerName | |
A DHCP server computer name hosting the ScopeId specified. This parameter is mandatory. | |
.Parameter ScopeId | |
The ScopeID to check over the two servers to make sure that the reservations are equal. This parameter is mandatory. | |
.Parameter IncludeEqual | |
This switch parameter specifies whether to return results that exist on both DHCP servers and are considered equal. | |
.Example | |
Get-UnmatchedDhcpServerv4Reservation -ReferenceComputerName DHCP-Server-1 -DifferenceComputerName DHCP-Server-2 -ScopeId 10.0.0.0 | |
Returns reservation objects (like the one below) that are not specified in both DHCP servers: | |
MissingOnComputer : DHCP-Server-2 | |
Type : Dhcp | |
ComputerName : DHCP-Server-1 | |
Description : | |
ScopeId : 10.0.0.0 | |
Name : ExamplePC.whiteways.tech | |
ClientId : 00-01-23-45-67-89 | |
SideIndicator : <= | |
IPAddress : 10.0.0.6 | |
.Notes | |
Author: Information Services | |
#> | |
[CmdletBinding()] | |
Param( | |
[parameter( | |
Mandatory = $True, | |
Position = 1 | |
)] | |
[string]$ReferenceComputerName, | |
[parameter( | |
Mandatory = $True, | |
Position = 2 | |
)] | |
[string]$DifferenceComputerName, | |
[parameter( | |
Mandatory = $True, | |
Position = 3 | |
)] | |
[string[]]$ScopeId, | |
[parameter( | |
Position = 4 | |
)] | |
[switch]$IncludeEqual | |
) | |
foreach ($Scope in $ScopeId) { | |
$ReferenceScope = Get-DhcpServerv4Scope -ComputerName $ReferenceComputerName -ScopeId $Scope -ErrorAction Stop | |
$DifferenceScope = Get-DhcpServerv4Scope -ComputerName $DifferenceComputerName -ScopeId $Scope -ErrorAction Stop | |
If ($ReferenceScope -and $DifferenceScope) | |
{ | |
$Referencev4Reservation = Get-DhcpServerv4Reservation -ScopeId $ReferenceScope.ScopeId -ComputerName $ReferenceComputerName -ErrorAction Stop | |
$Differencev4Reservation = Get-DhcpServerv4Reservation -ScopeId $DifferenceScope.ScopeId -ComputerName $DifferenceComputerName -ErrorAction Stop | |
$Placeholder = @{ | |
IPAddress = $null | |
ScopeId = $null | |
ClientId = $null | |
Name = $null | |
Type = $null | |
Description = $null | |
} | |
if (-not $Referencev4Reservation) { | |
$Referencev4Reservation = New-Object -TypeName PSObject -Property $Placeholder | |
} | |
if (-not $Differencev4Reservation) { | |
$Differencev4Reservation = New-Object -TypeName PSObject -Property $Placeholder | |
} | |
if ($IncludeEqual) { | |
$Comparison = Compare-Object -ReferenceObject $Referencev4Reservation -DifferenceObject $Differencev4Reservation -Property ClientId, IPAddress -IncludeEqual | |
} | |
else { | |
$Comparison = Compare-Object -ReferenceObject $Referencev4Reservation -DifferenceObject $Differencev4Reservation -Property ClientId, IPAddress, Name, Type, Description | |
} | |
foreach ($Compare in $Comparison) { | |
if (-not $Compare.ClientId) { | |
continue | |
} | |
$ComparisonObject = @{ | |
ComputerName = $null | |
MissingOnComputer = $null | |
IPAddress = $Compare.IPAddress | |
ScopeId = $Scope | |
ClientId = $Compare.ClientId | |
Name = $Compare.Name | |
Type = $Compare.Type | |
Description = $Compare.Description | |
SideIndicator = $Compare.SideIndicator | |
} | |
if ($Compare.SideIndicator -eq '<=') { | |
$ComparisonObject.ComputerName = $ReferenceComputerName | |
$ComparisonObject.MissingOnComputer = $DifferenceComputerName | |
} | |
elseif ($Compare.SideIndicator -eq '=>') { | |
$ComparisonObject.ComputerName = $DifferenceComputerName | |
$ComparisonObject.MissingOnComputer = $ReferenceComputerName | |
} | |
else { | |
$ComparisonObject.ComputerName = 'Both' | |
} | |
New-Object -TypeName PSObject -Property $ComparisonObject | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment