# Скрипт: radmin-install.ps1 # Версия: 1.0.0 # Дата: 2026-05-27 # Описание: Установка Radmin Server с авто-определением последней версии # на сервере gper.ru. После установки опционально запускает # регистрацию (radmin-register.ps1). # # Использование (онлайн): # irm https://ps.gper.ru/ext/radmin-install.ps1 | iex # # Использование (локально): # . .\radmin-install.ps1 # # Требования: PowerShell 5.0+, права администратора. $ErrorActionPreference = 'Stop' # ==================== КОНФИГУРАЦИЯ ==================== $GPER_BASE_URL = 'https://#SCRIPT#gper.ru' $RADMIN_URL_DIR = "$GPER_BASE_URL" -replace '#SCRIPT#','' # autoindex # $RADMIN_FILE_RX = '^rserver_v\d+\.msi$' # маска поиска $RADMIN_FILE_RX = '^rserver_v\d+\.\d+\.\d+\.msi$' $RADMIN_SERVICE = 'RServer3' $REGISTER_URL = "$GPER_BASE_URL/ext/radmin-register.ps1" -replace '#SCRIPT#','ps.' $TEMP_DIR = Join-Path $env:TEMP 'gper-radmin' # ====================================================== # ==================== ХЕЛПЕРЫ ==================== function Test-IsAdmin { $id = [Security.Principal.WindowsIdentity]::GetCurrent() $pr = New-Object Security.Principal.WindowsPrincipal($id) return $pr.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) } function Get-RadminInstallPath { # Возвращает каталог установки или $null $svc = Get-Service -Name $RADMIN_SERVICE -ErrorAction SilentlyContinue; $svc if (-not $svc) { return $null } try { $EXT = Split-Path -Path $svc.BinaryPathName -Extension if (!($EXT)) { $RESULT = (Split-Path -Path (Split-Path -Path $svc.BinaryPathName -Parent) -Parent) -replace "`"","";$RESULT } if (!($RESULT)) { $exe = $svc.BinaryPathName -replace '^"?([^"]+\.exe).*$', '$1' ; $exe $RESULT = Split-Path -Path "$exe" -Parent } return $RESULT # $imagePath = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\$RADMIN_SERVICE" -ErrorAction Stop).ImagePath # if (-not $imagePath) { return $null } # $exe = $imagePath -replace '^"?([^"]+\.exe).*$', '$1' # if (Test-Path -LiteralPath $exe) { # return (Split-Path $exe -Parent) # } } catch {} return $null } function Get-LatestRadminUrl { Write-Host "[i] Получаю список с $RADMIN_URL_DIR" -ForegroundColor Cyan try { $resp = Invoke-WebRequest -Uri "$RADMIN_URL_DIR/" -UseBasicParsing -ErrorAction Stop } catch { Write-Host "[X] Не удалось получить список: $($_.Exception.Message)" -ForegroundColor Red return $null } # $files = $resp.Links | # Where-Object { $_.href -match $RADMIN_FILE_RX } | # ForEach-Object { $_.href } | # Sort-Object -Descending -Unique $files = $resp.Links | Where-Object { $_.href -match $RADMIN_FILE_RX } | ForEach-Object { $_.href } | Sort-Object { # Извлекаем строку версии и приводим к типу [version] [version]($_ -replace '.*?_v([\d.]+)\.msi', '$1') } -Descending | Select-Object -First 1 if (-not $files) { Write-Host "[X] Не найдено файлов по маске $RADMIN_FILE_RX" -ForegroundColor Red return $null } $latest = $files | Select-Object -First 1 Write-Host "[OK] Последняя версия: $latest" -ForegroundColor Green return "$RADMIN_URL_DIR/$latest" } function Invoke-Download { param([string]$Url, [string]$OutFile) if (-not (Test-Path $TEMP_DIR)) { New-Item -ItemType Directory -Path $TEMP_DIR -Force | Out-Null } Write-Host "[i] Скачиваю: $Url" -ForegroundColor Cyan try { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 Invoke-WebRequest -Uri $Url -OutFile $OutFile -UseBasicParsing -ErrorAction Stop $sizeMb = [math]::Round((Get-Item $OutFile).Length / 1MB, 2) Write-Host "[OK] Загружено: $OutFile ($sizeMb MB)" -ForegroundColor Green return $true } catch { Write-Host "[X] Ошибка загрузки: $($_.Exception.Message)" -ForegroundColor Red return $false } } function Uninstall-Radmin { Write-Host '[i] Удаление текущей установки Radmin Server...' -ForegroundColor Cyan try { Stop-Service -Name $RADMIN_SERVICE -Force -ErrorAction SilentlyContinue # Поиск через WMI $apps = Get-WmiObject -Class Win32_Product -ErrorAction SilentlyContinue | Where-Object { $_.Name -like '*Radmin Server*' } foreach ($app in $apps) { Write-Host " [-] $($app.Name) v$($app.Version)" -ForegroundColor Yellow $null = $app.Uninstall() } Start-Sleep -Seconds 3 Write-Host '[OK] Удаление завершено' -ForegroundColor Green return $true } catch { Write-Host "[X] Ошибка удаления: $($_.Exception.Message)" -ForegroundColor Red return $false } } function Install-RadminMsi { param([string]$MsiPath) if (-not (Test-Path -LiteralPath $MsiPath)) { Write-Host "[X] Файл не найден: $MsiPath" -ForegroundColor Red return $false } Write-Host '[i] Запуск тихой установки MSI...' -ForegroundColor Cyan $logFile = Join-Path $env:TEMP "radmin_install_$(Get-Date -Format 'yyyyMMdd_HHmmss').log" $args = @( '/i', "`"$MsiPath`"" '/qn', '/norestart' 'REBOOT=ReallySuppress' '/l*v', "`"$logFile`"" ) try { $p = Start-Process -FilePath 'msiexec.exe' -ArgumentList $args -Wait -PassThru -NoNewWindow switch ($p.ExitCode) { 0 { Write-Host '[OK] Установлено успешно' -ForegroundColor Green; return $true } 1638 { Write-Host '[!] Уже установлено (код 1638)' -ForegroundColor Yellow; return $true } 3010 { Write-Host '[OK] Установлено (нужна перезагрузка, код 3010)' -ForegroundColor Green; return $true } default { Write-Host "[X] Ошибка установки, код $($p.ExitCode). Лог: $logFile" -ForegroundColor Red return $false } } } catch { Write-Host "[X] Ошибка запуска msiexec: $($_.Exception.Message)" -ForegroundColor Red return $false } } function Set-RadminRecovery { Write-Host '[i] Настройка восстановления службы (2 перезапуска)...' -ForegroundColor Cyan try { & sc.exe failure $RADMIN_SERVICE reset= 86400 actions= restart/60000/restart/60000// | Out-Null if ($LASTEXITCODE -eq 0) { Write-Host '[OK] Recovery настроен' -ForegroundColor Green } else { Write-Host "[!] sc.exe вернул код $LASTEXITCODE" -ForegroundColor Yellow } } catch { Write-Host "[!] Не удалось настроить recovery: $($_.Exception.Message)" -ForegroundColor Yellow } } function Invoke-RadminRegister { Write-Host '' Write-Host '[i] Запуск регистрации Radmin...' -ForegroundColor Cyan try { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $wc = New-Object System.Net.WebClient $wc.Encoding = [System.Text.Encoding]::UTF8 $code = $wc.DownloadString($REGISTER_URL) Invoke-Expression $code } catch { Write-Host "[X] Не удалось выполнить регистрацию: $($_.Exception.Message)" -ForegroundColor Red } } # ==================== MAIN ==================== Write-Host '' Write-Host '╔════════════════════════════════════════╗' -ForegroundColor Cyan Write-Host '║ Radmin Server — установка ║' -ForegroundColor Cyan Write-Host '╚════════════════════════════════════════╝' -ForegroundColor Cyan Write-Host '' if (-not (Test-IsAdmin)) { Write-Host '[X] Требуются права администратора. Перезапустите PowerShell от имени админа.' -ForegroundColor Red return } # 1. Проверка существующей установки $existing = Get-RadminInstallPath if ($existing) { Write-Host "[!] Radmin Server уже установлен: $existing" -ForegroundColor Yellow Write-Host '' Write-Host ' [1] Удалить и установить заново' Write-Host ' [2] Только зарегистрировать (патч)' Write-Host ' [3] Выход' Write-Host '' $choice = Read-Host 'Выбор' switch ($choice) { '1' { if (-not (Uninstall-Radmin)) { return } } '2' { Invoke-RadminRegister return } default { Write-Host '[i] Выход без изменений' -ForegroundColor DarkGray return } } } # 2. Получение URL $url = Get-LatestRadminUrl if (-not $url) { return } # 3. Скачивание $fileName = Split-Path $url -Leaf $msiPath = Join-Path $TEMP_DIR $fileName if (-not (Invoke-Download -Url $url -OutFile $msiPath)) { return } # 4. Установка if (-not (Install-RadminMsi -MsiPath $msiPath)) { Write-Host "[X] Установка не выполнена. Файл оставлен: $msiPath" -ForegroundColor Red return } Start-Sleep -Seconds 3 # 5. Recovery Set-RadminRecovery # 6. Удаление установщика try { Remove-Item -Path $msiPath -Force -ErrorAction Stop Write-Host "[OK] Удалён установщик: $msiPath" -ForegroundColor DarkGray } catch { Write-Host "[!] Не удалось удалить $msiPath" -ForegroundColor DarkYellow } # 7. Регистрация Write-Host '' $reg = Read-Host 'Выполнить регистрацию сейчас? (Y/N)' if ($reg -match '^[YyНн]') { Invoke-RadminRegister } Write-Host '' Write-Host '[OK] Готово.' -ForegroundColor Green