Загрузка данных
$Server = "RUKLGDC01.pcmarus.loc"
$Stamp = Get-Date -Format "yyyyMMdd_HHmmss"
$RemoteScriptLocal = "C:\Windows\Temp\DHCP_Extend_$Stamp.ps1"
$RemoteOutLocal = "C:\Windows\Temp\DHCP_Extend_$Stamp.txt"
$RemoteDoneLocal = "C:\Windows\Temp\DHCP_Extend_$Stamp.done"
$RemoteScriptUNC = "\\$Server\C$\Windows\Temp\DHCP_Extend_$Stamp.ps1"
$RemoteOutUNC = "\\$Server\C$\Windows\Temp\DHCP_Extend_$Stamp.txt"
$RemoteDoneUNC = "\\$Server\C$\Windows\Temp\DHCP_Extend_$Stamp.done"
$ScriptBody = @'
$ErrorActionPreference = "Stop"
Import-Module DhcpServer
$Stamp = Get-Date -Format "yyyyMMdd_HHmmss"
$BackupDir = "C:\DHCP_Backup\ExtendRanges_$Stamp"
$BackupFile = Join-Path $BackupDir "DHCP_Config.xml"
$Scopes = @(
@{ ScopeId = "10.182.150.0"; Start = "10.182.150.1"; End = "10.182.150.249" },
@{ ScopeId = "10.182.151.0"; Start = "10.182.151.1"; End = "10.182.151.249" },
@{ ScopeId = "10.182.152.0"; Start = "10.182.152.1"; End = "10.182.152.249" },
@{ ScopeId = "10.182.153.0"; Start = "10.182.153.1"; End = "10.182.153.249" },
@{ ScopeId = "10.182.154.0"; Start = "10.182.154.1"; End = "10.182.154.249" },
@{ ScopeId = "10.182.155.0"; Start = "10.182.155.1"; End = "10.182.155.249" }
)
& {
Write-Output "============================================================"
Write-Output " DHCP SCOPE EXTENSION"
Write-Output "============================================================"
Write-Output "Server: $env:COMPUTERNAME"
Write-Output "Date: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"
New-Item -ItemType Directory -Path $BackupDir -Force | Out-Null
Write-Output "`n=== DHCP BACKUP ==="
Export-DhcpServer `
-ComputerName localhost `
-File $BackupFile `
-Leases `
-Force
Write-Output "Backup created: $BackupFile"
Write-Output "`n=== BEFORE CHANGE ==="
foreach ($Item in $Scopes) {
Get-DhcpServerv4Scope -ScopeId $Item.ScopeId |
Select-Object ScopeId,Name,State,StartRange,EndRange,SubnetMask,LeaseDuration |
Format-List
Get-DhcpServerv4ScopeStatistics -ScopeId $Item.ScopeId |
Select-Object ScopeId,PercentageInUse,InUse,Free,Reserved,Pending |
Format-List
}
Write-Output "`n=== APPLY CHANGES ==="
foreach ($Item in $Scopes) {
Write-Output "Changing $($Item.ScopeId): $($Item.Start) - $($Item.End)"
Set-DhcpServerv4Scope `
-ScopeId $Item.ScopeId `
-StartRange $Item.Start `
-EndRange $Item.End
Write-Output "Completed: $($Item.ScopeId)"
}
Write-Output "`n=== AFTER CHANGE ==="
foreach ($Item in $Scopes) {
Get-DhcpServerv4Scope -ScopeId $Item.ScopeId |
Select-Object ScopeId,Name,State,StartRange,EndRange,SubnetMask,LeaseDuration |
Format-List
Get-DhcpServerv4ScopeStatistics -ScopeId $Item.ScopeId |
Select-Object ScopeId,PercentageInUse,InUse,Free,Reserved,Pending |
Format-List
}
Write-Output "`n=== DHCP SERVICE ==="
Get-Service DHCPServer |
Select-Object Name,Status,StartType |
Format-List
Write-Output "`nCHANGE COMPLETED SUCCESSFULLY"
} 2>&1 |
Out-String -Width 300 |
Set-Content -LiteralPath "__OUT__" -Encoding UTF8
New-Item -ItemType File -Path "__DONE__" -Force | Out-Null
'@
$ScriptBody = $ScriptBody.Replace("__OUT__", $RemoteOutLocal)
$ScriptBody = $ScriptBody.Replace("__DONE__", $RemoteDoneLocal)
try {
Write-Host "Копирование скрипта на DHCP-сервер..." -ForegroundColor Cyan
Set-Content `
-LiteralPath $RemoteScriptUNC `
-Value $ScriptBody `
-Encoding UTF8 `
-Force
$CommandLine = "powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -File `"$RemoteScriptLocal`""
$ProcessClass = [wmiclass]"\\$Server\root\cimv2:Win32_Process"
$Result = $ProcessClass.Create($CommandLine)
if ($Result.ReturnValue -ne 0) {
throw "Не удалось запустить процесс. WMI ReturnValue: $($Result.ReturnValue)"
}
Write-Host "Процесс запущен. PID: $($Result.ProcessId)" -ForegroundColor Green
$Deadline = (Get-Date).AddMinutes(5)
while (
-not (Test-Path $RemoteDoneUNC) -and
(Get-Date) -lt $Deadline
) {
Start-Sleep -Seconds 2
}
if (-not (Test-Path $RemoteDoneUNC)) {
throw "Операция не завершилась за 5 минут."
}
Write-Host "`n=== РЕЗУЛЬТАТ ===`n" -ForegroundColor Green
Get-Content $RemoteOutUNC
}
catch {
Write-Host "Ошибка: $($_.Exception.Message)" -ForegroundColor Red
if (Test-Path $RemoteOutUNC) {
Write-Host "`n=== ЧАСТИЧНЫЙ ВЫВОД ===`n" -ForegroundColor Yellow
Get-Content $RemoteOutUNC
}
}
finally {
Remove-Item $RemoteScriptUNC -Force -ErrorAction SilentlyContinue
Remove-Item $RemoteOutUNC -Force -ErrorAction SilentlyContinue
Remove-Item $RemoteDoneUNC -Force -ErrorAction SilentlyContinue
}