The DHCP PowerShell script will dump the “raw” DHCP data to a text file for each Active Directory-aware DHCP server. The file is saved to “C:\DHCP-Backup\SERVERNAME-YYYYMMDD.txt.” This can be easily changed within the last few lines of the script itself.
##########################################################
# Get-DHCPServerBackup.ps1
#---------------------------------------------------------
# Author: Kevin M. Sparenberg
# Revision History:
# 1.0 - 2010-12-10: Initial Release
##########################################################
# Create a file location for temporary storage of the DHCP Servers
$DHCPFile = $env:temp + "DHCP_Servers.txt"
# Write the contents to the file
netsh dhcp show server > $DHCPFile
# Text File Format:
#----------------------------------------------------------------------------
# XX Servers were found in the directory service:
#
# Server [dhcpserver1.fully.qualified.domain] Address [XXX.XXX.XXX.XXX] Ds location: cn=dhcpserver1.fully.qualified.domain
#
# Server [dhcpserver2.fully.qualified.domain] Address [XXX.XXX.XXX.XXX] Ds location: cn=dhcpserver2.fully.qualified.domain
#
# [ --------------------------------------------- TRUNCATED FOR SPACE --------------------------------------------- ]
#
# Server [dhcpserverN-1.fully.qualified.domain] Address [XXX.XXX.XXX.XXX] Ds location: cn=dhcpserverN-1.fully.qualified.domain
#
# Server [dhcpserverN.fully.qualified.domain] Address [XXX.XXX.XXX.XXX] Ds location: cn=dhcpserverN.fully.qualified.domain
#
#/
# Get the content from text file
$DHCPFileContent = Get-Content -Path $DHCPFile
# Delete the file (no need for it after Get-Content command
Remove-Item $DHCPFile
# Creative way to skip the last two and first four lines - save to same variable
$DHCPFileContent = $DHCPFileContent | `
Select-Object -Last ( $DHCPFileContent.Count - 2 ) | `
Select-Object -First ( $DHCPFileContent.Count - 4 )
# Create new collection for processing the file
$DHCPClean = @()
# Split the string (array of characters) at each tab marker.
# If the line length is zero (empty line) skip it
ForEach ($Line in $DHCPFileContent)
{
if ( $Line.Trim.Length -ne 0 )
{
$DHCPClean += $Line.Split("`t ")
}
}
# Create new Collection for further processing
$DHCP = @()
# Break apart the line based on the hard open bracket ("[") character
For ( $i = 0 ; $i -le ( $DHCPClean.Length - 1 ) ; $i++ )
{
if ( $DHCPClean[$i].StartsWith("[") )
{
$DHCP += $DHCPClean[$i]
}
}
# Build new collection for the "real" data.
$colDHCPServers = @()
For ( $i = 0 ; $i -le ( $DHCP.Length - 1 ) ; $i++ )
{
# Create PowerShell Object for the Information
$DHCPServer = New-Object PSObject
# Add Server's Fully Qualified Domain Name as the first element in the object
$DHCPServer | Add-Member -MemberType NoteProperty -Name ServerFQDN -Value ($DHCP[$i].Replace("[", "")).Replace("]", "")
# Add Server's IP Address as the second element in the object
$DHCPServer | Add-Member -MemberType NoteProperty -Name IPAddress -Value ($DHCP[++$i].Replace("[", "")).Replace("]", "")
# Add the object to the collection
$colDHCPServers += $DHCPServer
}
# Variable Cleanup
#--------------------------------------------------------------------------------
Remove-Variable DHCPFileContent # Contains file content
Remove-Variable DHCPClean # Contains formatted file content
Remove-Variable DHCP # Contains still further formatted file content
# Begin the real backup process
ForEach ( $DHCPServer in $colDHCPServers )
{
# Create string with the output location for the backup files
$OutputPath = "C:\DHCP-Backup\" + $DHCPServer.ServerFQDN.Split(".")[0].ToUpper() + "-" + (Get-Date -Format "yyyyMMdd") + ".txt"
# Notify User of current process
Write-Host Creating $OutputPath
# Use "netsh" command to dump the DHCP information to the local computer
netsh dhcp server $DHCPServer.IPAddress dump > $OutputPath
}