Expeliarmus
# Adjust the DHCP Server name as needed, or omit if running locally
$DhcpServer = 'YourDhcpServerName'
# We'll collect all CSV rows here
$Output = @()
# Get all scopes
$AllScopes = Get-DhcpServerv4Scope -ComputerName $DhcpServer
foreach ($scope in $AllScopes) {
# 1) SCOPE SECTION
# Row: "SCOPE" label in ColumnA
$Output += [PSCustomObject]@{
ColumnA = 'SCOPE'
ColumnB = ''
ColumnC = ''
ColumnD = ''
ColumnE = ''
ColumnF = ''
ColumnG = ''
}
# Name property
$Output += [PSCustomObject]@{
ColumnA = 'Name'
ColumnB = $scope.Name
ColumnC = ''
ColumnD = ''
ColumnE = ''
ColumnF = ''
ColumnG = ''
}
# SubnetMask
$Output += [PSCustomObject]@{
ColumnA = 'SubnetMask'
ColumnB = $scope.SubnetMask
ColumnC = ''
ColumnD = ''
ColumnE = ''
ColumnF = ''
ColumnG = ''
}
# ScopeId
$Output += [PSCustomObject]@{
ColumnA = 'ScopeId'
ColumnB = $scope.ScopeId
ColumnC = ''
ColumnD = ''
ColumnE = ''
ColumnF = ''
ColumnG = ''
}
# StartRange
$Output += [PSCustomObject]@{
ColumnA = 'StartRange'
ColumnB = $scope.StartRange
ColumnC = ''
ColumnD = ''
ColumnE = ''
ColumnF = ''
ColumnG = ''
}
# EndRange
$Output += [PSCustomObject]@{
ColumnA = 'EndRange'
ColumnB = $scope.EndRange
ColumnC = ''
ColumnD = ''
ColumnE = ''
ColumnF = ''
ColumnG = ''
}
# LeaseDuration
$Output += [PSCustomObject]@{
ColumnA = 'LeaseDuration'
ColumnB = $scope.LeaseDuration
ColumnC = ''
ColumnD = ''
ColumnE = ''
ColumnF = ''
ColumnG = ''
}
# State
$Output += [PSCustomObject]@{
ColumnA = 'State'
ColumnB = $scope.State
ColumnC = ''
ColumnD = ''
ColumnE = ''
ColumnF = ''
ColumnG = ''
}
# 2) EXCLUSIONS SECTION
# Label row
$Output += [PSCustomObject]@{
ColumnA = 'EXCLUSIONS'
ColumnB = ''
ColumnC = ''
ColumnD = ''
ColumnE = ''
ColumnF = ''
ColumnG = ''
}
# Header row for exclusions (ScopeId, StartRange, EndRange)
$Output += [PSCustomObject]@{
ColumnA = 'ScopeId'
ColumnB = 'StartRange'
ColumnC = 'EndRange'
ColumnD = ''
ColumnE = ''
ColumnF = ''
ColumnG = ''
}
$Exclusions = Get-DhcpServerv4ExclusionRange -ComputerName $DhcpServer -ScopeId $scope.ScopeId -ErrorAction SilentlyContinue
foreach ($excl in $Exclusions) {
$Output += [PSCustomObject]@{
ColumnA = $excl.ScopeId
ColumnB = $excl.StartRange
ColumnC = $excl.EndRange
ColumnD = ''
ColumnE = ''
ColumnF = ''
ColumnG = ''
}
}
# 3) ADDRESS LEASES SECTION
# Label row
$Output += [PSCustomObject]@{
ColumnA = 'ADDRESS LEASES'
ColumnB = ''
ColumnC = ''
ColumnD = ''
ColumnE = ''
ColumnF = ''
ColumnG = ''
}
# Header row for leases
$Output += [PSCustomObject]@{
ColumnA = 'IPAddress'
ColumnB = 'ScopeId'
ColumnC = 'HostName'
ColumnD = 'AddressState'
ColumnE = 'ClientType'
ColumnF = 'ClientId'
ColumnG = 'Description'
}
$Leases = Get-DhcpServerv4Lease -ComputerName $DhcpServer -ScopeId $scope.ScopeId -ErrorAction SilentlyContinue
foreach ($lease in $Leases) {
$Output += [PSCustomObject]@{
ColumnA = $lease.IPAddress
ColumnB = $lease.ScopeId
ColumnC = $lease.HostName
ColumnD = $lease.AddressState
ColumnE = $lease.ClientType
ColumnF = $lease.ClientId
ColumnG = $lease.Description
}
}
# 4) RESERVATIONS SECTION
# Label row
$Output += [PSCustomObject]@{
ColumnA = 'RESERVATIONS'
ColumnB = ''
ColumnC = ''
ColumnD = ''
ColumnE = ''
ColumnF = ''
ColumnG = ''
}
# Header row for reservations (IPAddress, ScopeId, AddressState, ClientId, Description)
$Output += [PSCustomObject]@{
ColumnA = 'IPAddress'
ColumnB = 'ScopeId'
ColumnC = 'AddressState'
ColumnD = 'ClientId'
ColumnE = 'Description'
ColumnF = ''
ColumnG = ''
}
$Reservations = Get-DhcpServerv4Reservation -ComputerName $DhcpServer -ScopeId $scope.ScopeId -ErrorAction SilentlyContinue
foreach ($resv in $Reservations) {
$Output += [PSCustomObject]@{
ColumnA = $resv.IPAddress
ColumnB = $resv.ScopeId
ColumnC = $resv.AddressState
ColumnD = $resv.ClientId
ColumnE = $resv.Description
ColumnF = ''
ColumnG = ''
}
}
# 5) Two rows of "#" in columns A–G to separate from next scope
$Output += [PSCustomObject]@{
ColumnA = '#'
ColumnB = '#'
ColumnC = '#'
ColumnD = '#'
ColumnE = '#'
ColumnF = '#'
ColumnG = '#'
}
$Output += [PSCustomObject]@{
ColumnA = '#'
ColumnB = '#'
ColumnC = '#'
ColumnD = '#'
ColumnE = '#'
ColumnF = '#'
ColumnG = '#'
}
}
# Finally, export the entire array to CSV
# Change the path if you like
$Output | Export-Csv -Path 'C:\Temp\DHCP_Export.csv' -NoTypeInformation