# ────────────────────────────────────────────────────────────────────────────── # __ ______ __ _____ ____ __ # / / / / __ \/ / / _/ | / / //_/ # / / / / /_/ / / / // |/ / ,< # / /_/ / ____/ /____/ // /| / /| | # \____/_/ /_____/___/_/ |_/_/ |_| # # # __ ______ _ _____ ________________ # / |/ / | / | / / | / ____/ ____/ __ \ # / /|_/ / /| | / |/ / /| |/ / __/ __/ / /_/ / # / / / / ___ |/ /| / ___ / /_/ / /___/ _, _/ # /_/ /_/_/ |_/_/ |_/_/ |_\____/_____/_/ |_| # # ────────────────────────────────────────────────────────────────────────────── # Uplink Manager Installer # Author: Sam Jage # ────────────────────────────────────────────────────────────────────────────── # ========== SELF‑ELEVATION BLOCK ========== $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) if (-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { Start-Process powershell.exe -Verb RunAs -ArgumentList "-WindowStyle Hidden -NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" exit } # ========================================= # Force 64‑bit execution if running in 32‑bit mode if ($env:PROCESSOR_ARCHITECTURE -ne "AMD64") { $powershell = "$env:WINDIR\Sysnative\WindowsPowerShell\v1.0\powershell.exe" Start-Process $powershell -Verb RunAs -ArgumentList "-WindowStyle Hidden -NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" exit } # ========================================= Add-Type -AssemblyName PresentationFramework Add-Type -AssemblyName PresentationCore Add-Type -AssemblyName WindowsBase Add-Type -AssemblyName System.Windows.Forms # ── Version guard ───────────────────────────────────────────────────────────── if ($PSVersionTable.PSVersion.Major -lt 5) { [System.Windows.MessageBox]::Show( "This installer requires PowerShell 5.1 or higher.`n`nCurrent version: $($PSVersionTable.PSVersion)", "Incompatible PowerShell Version", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Error ) exit 1 } # ── Colors ──────────────────────────────────────────────────────────────────── $BG = "#252830" $SURFACE = "#2e3038" $PANEL = "#404450" $YELLOW = "#fabd2f" $GREEN = "#3d5c3f" $GREEN_LT = "#5a7d5c" $RED = "#fb4934" $TEXT = "#ebdbb2" $TEXT_MUTED = "#a89984" # ── State ───────────────────────────────────────────────────────────────────── $script:SelectedInternet = $null $script:SelectedUplink = $null $script:CurrentPage = 0 $script:NeedsReboot = $false $script:InstallDir = "C:\Program Files\Uplink Manager" # adjust if you use x86 $script:SpinnerTimer = $null $script:SpinnerFrames = @("⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷") $script:SpinnerIndex = 0 $script:ReqJob = $null $script:PrereqJob = $null # ── Helpers (unchanged from your original) ── function Get-Vmxnet3Adapters { Get-NetAdapter | Where-Object { $_.InterfaceDescription -like "*vmxnet3*" -and $_.Status -eq "Up" } | Select-Object -ExpandProperty Name } function Start-BtnSpinner { if ($script:SpinnerTimer) { $script:SpinnerTimer.Stop() } $script:SpinnerIndex = 0 $script:SpinnerTimer = [System.Windows.Threading.DispatcherTimer]::new() $script:SpinnerTimer.Interval = [TimeSpan]::FromMilliseconds(100) $script:SpinnerTimer.Add_Tick({ $script:SpinnerIndex = ($script:SpinnerIndex + 1) % $script:SpinnerFrames.Count $BtnNext.Content = $script:SpinnerFrames[$script:SpinnerIndex] }) $BtnNext.IsEnabled = $false $script:SpinnerTimer.Start() } function Stop-BtnSpinner { if ($script:SpinnerTimer) { $script:SpinnerTimer.Stop(); $script:SpinnerTimer = $null } $BtnNext.IsEnabled = $true $BtnNext.Content = "Next →" } function Test-NatClass { try { Get-CimClass -Namespace root/StandardCimv2 -ClassName MSFT_NetNat -ErrorAction Stop | Out-Null; return $true } catch { return $false } } # ── XAML UI ─────────────────────────────────────────────────────────────────── [xml]$xaml = @"