Загрузка данных


$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
}