# ============================================================================= # RustDesk Setup Script fuer Windows 11 # GUYCOLLE GmbH – Automatische Installation und Konfiguration # Generiert von RustDesk Manager (24.06.2026 23:30) # ============================================================================= #Requires -RunAsAdministrator $ErrorActionPreference = "Stop" $ProgressPreference = "SilentlyContinue" # --- Konfiguration (automatisch aus RustDesk Manager) --- $RustDeskConfig = "=0nI9gzUBlXV1ATcaJGSYx0Rx9EWpVDSrlUS2kTQBhTaNFDV65EUCVWQmRXeqhnI6ISeltmIsIyclNWa2JXZz5SZsx2bjlXdn5yazVGZ0NXdy9yL6MHc0RHaiojIpBXYiwiIzV2YpZnclNnLlxGbvNWe1dmLrNXZkR3c1JnI6ISehxWZyJCLiMXZjlmdyV2cuUGbs92Y5V3Zus2clRGdzVnciojI0N3boJye" $IdServer = "rustdesk.guycolle.services" $RelayServer = "rustdesk.guycolle.services" $ApiServer = "https://rustdesk.guycolle.services" $Key = "xjytfAeBPNzT1Mi8AA96IIkH5iXOqGLXHbZq05UyAS8=" # --- Funktionen --- function Write-Info { param($msg) Write-Host "[INFO] $msg" -ForegroundColor Cyan } function Write-Success { param($msg) Write-Host "[OK] $msg" -ForegroundColor Green } function Write-Warn { param($msg) Write-Host "[WARN] $msg" -ForegroundColor Yellow } function Write-Err { param($msg) Write-Host "[FEHLER] $msg" -ForegroundColor Red; exit 1 } Write-Host "" Write-Host "╔══════════════════════════════════════════════╗" -ForegroundColor Cyan Write-Host "║ RustDesk Setup – GUYCOLLE GmbH ║" -ForegroundColor Cyan Write-Host "╚══════════════════════════════════════════════╝" -ForegroundColor Cyan Write-Host "" # --- 1. Admin-Rechte pruefen --- $isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) if (-not $isAdmin) { Write-Err "Dieses Script muss als Administrator ausgefuehrt werden." } Write-Info "Administrator-Rechte: OK" # --- 2. Bestehende Installation vollstaendig entfernen --- $rustdeskPath = "C:\Program Files\RustDesk\RustDesk.exe" $existing = Test-Path $rustdeskPath if ($existing) { Write-Warn "Bestehende RustDesk-Installation gefunden. Wird vollstaendig entfernt..." # 2a. RustDesk Windows Service stoppen und entfernen (ZUERST, da er Prozesse startet) $service = Get-Service -Name "RustDesk" -ErrorAction SilentlyContinue if ($service) { Stop-Service -Name "RustDesk" -Force -ErrorAction SilentlyContinue Start-Sleep -Seconds 3 sc.exe delete "RustDesk" 2>$null | Out-Null Start-Sleep -Seconds 2 Write-Info " RustDesk-Service gestoppt und entfernt." } # 2b. Alle RustDesk-Prozesse beenden Get-Process -Name "RustDesk" -ErrorAction SilentlyContinue | Stop-Process -Force Start-Sleep -Seconds 2 # Sicherstellen dass wirklich alles beendet ist Get-Process -Name "RustDesk" -ErrorAction SilentlyContinue | Stop-Process -Force Start-Sleep -Seconds 1 # 2c. Uninstaller ausfuehren (falls vorhanden) $uninstaller = "C:\Program Files\RustDesk\uninstall.exe" if (Test-Path $uninstaller) { try { Start-Process -FilePath $uninstaller -ArgumentList "--silent" -Wait -NoNewWindow -ErrorAction SilentlyContinue Start-Sleep -Seconds 3 Write-Info " Uninstaller ausgefuehrt." } catch { Write-Info " Uninstaller fehlgeschlagen, entferne manuell..." } } # 2d. Installationsverzeichnis entfernen (mit Retry bei gesperrten Dateien) if (Test-Path "C:\Program Files\RustDesk") { Remove-Item -Path "C:\Program Files\RustDesk" -Recurse -Force -ErrorAction SilentlyContinue Start-Sleep -Seconds 1 # Retry falls Dateien noch gesperrt waren if (Test-Path "C:\Program Files\RustDesk") { Start-Sleep -Seconds 2 Remove-Item -Path "C:\Program Files\RustDesk" -Recurse -Force -ErrorAction SilentlyContinue } Write-Info " Installationsverzeichnis entfernt." } # 2e. Konfiguration entfernen (alle Benutzerprofile) $userProfiles = Get-ChildItem "C:\Users" -Directory -ErrorAction SilentlyContinue foreach ($profile in $userProfiles) { $configPaths = @( "$($profile.FullName)\AppData\Roaming\RustDesk", "$($profile.FullName)\AppData\Local\RustDesk", "$($profile.FullName)\.rustdesk" ) foreach ($configPath in $configPaths) { if (Test-Path $configPath) { Remove-Item -Path $configPath -Recurse -Force -ErrorAction SilentlyContinue } } } Write-Info " Konfigurationsdaten entfernt." # 2f. Registry-Eintraege entfernen $regPaths = @( "HKLM:\SOFTWARE\Classes\rustdesk", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\RustDesk", "HKCU:\SOFTWARE\RustDesk" ) foreach ($regPath in $regPaths) { if (Test-Path $regPath) { Remove-Item -Path $regPath -Recurse -Force -ErrorAction SilentlyContinue } } Write-Info " Registry-Eintraege entfernt." Write-Success "Bestehende Installation vollstaendig entfernt." } # --- 3. Neueste Version ermitteln --- Write-Info "Ermittle neueste RustDesk-Version..." try { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $release = Invoke-RestMethod -Uri "https://api.github.com/repos/rustdesk/rustdesk/releases/latest" -UseBasicParsing $tag = $release.tag_name $version = $tag -replace '^v', '' } catch { Write-Err "Konnte neueste Version nicht ermitteln. Pruefe die Internetverbindung." } Write-Info "Neueste Version: $version" # --- 4. EXE herunterladen --- $installerUrl = "https://github.com/rustdesk/rustdesk/releases/download/$tag/rustdesk-$version-x86_64.exe" $installerFile = "$env:TEMP\rustdesk-$version-x86_64.exe" Write-Info "Lade herunter: rustdesk-$version-x86_64.exe ..." try { Invoke-WebRequest -Uri $installerUrl -OutFile $installerFile -UseBasicParsing } catch { Write-Err "Download fehlgeschlagen. URL: $installerUrl" } Write-Success "Download abgeschlossen." # --- 5. Silent Installation --- Write-Info "Installiere RustDesk..." try { Start-Process -FilePath $installerFile -ArgumentList "--silent-install" } catch { Write-Err "Installation fehlgeschlagen: $_" } # Warten bis Installation abgeschlossen und EXE vorhanden (max 60s) Write-Info "Warte auf Installation..." $retries = 0 while (-not (Test-Path $rustdeskPath) -and $retries -lt 60) { Start-Sleep -Seconds 1 $retries++ } if (Test-Path $rustdeskPath) { Write-Success "RustDesk installiert (${retries}s)." } else { Write-Err "RustDesk.exe nicht gefunden nach 60 Sekunden." } # --- 6. Aufraeumen --- Remove-Item -Path $installerFile -Force -ErrorAction SilentlyContinue Write-Info "Temporaere Dateien aufgeraeumt." # --- 7. RustDesk stoppen, konfigurieren, neu starten --- Write-Info "Konfiguriere GUYCOLLE-Server..." # 7a. Installer-Prozess abwarten (laeuft noch im Hintergrund) Write-Info " Warte auf Abschluss der Installation..." Start-Sleep -Seconds 8 # 7b. RustDesk komplett stoppen (Service + Prozesse) Write-Info " Stoppe RustDesk fuer Konfiguration..." Stop-Service -Name "RustDesk" -Force -ErrorAction SilentlyContinue Start-Sleep -Seconds 3 Get-Process -Name "RustDesk" -ErrorAction SilentlyContinue | Stop-Process -Force Start-Sleep -Seconds 2 Get-Process -Name "RustDesk" -ErrorAction SilentlyContinue | Stop-Process -Force Start-Sleep -Seconds 1 # 7c. Config-Inhalt vorbereiten $configContent = @" rendezvous_server = '$IdServer`:21116' nat_type = 1 serial = 0 [options] custom-rendezvous-server = '$IdServer' relay-server = '$RelayServer' api-server = '$ApiServer' key = '$Key' "@ # 7d. Hilfsfunktion: Config an einen Pfad schreiben function Write-RustDeskConfig { param($Path) try { $dir = Split-Path $Path -Parent New-Item -Path $dir -ItemType Directory -Force -ErrorAction SilentlyContinue | Out-Null Set-Content -Path $Path -Value $configContent -Encoding UTF8 -Force Write-Success " Config: $Path" } catch { Write-Warn " Config fehlgeschlagen: $Path ($_)" } } # 7e. Config an ALLE moeglichen Orte schreiben Write-Info " Schreibe Config..." # User-Profil (aktueller Admin-User) Write-RustDeskConfig "$env:APPDATA\RustDesk\config\RustDesk2.toml" # Programmverzeichnis (von allen Usern lesbar) Write-RustDeskConfig "C:\Program Files\RustDesk\RustDesk2.toml" # SYSTEM-Service-Account (Service laeuft als LocalSystem) Write-RustDeskConfig "C:\Windows\ServiceProfiles\LocalService\AppData\Roaming\RustDesk\config\RustDesk2.toml" # 7f. RustDesk-Service starten Start-Service -Name "RustDesk" -ErrorAction SilentlyContinue # 7g. Warten, RustDesk stoppen, Config NOCHMALS schreiben (gegen Race Condition) Write-Info " Warte auf RustDesk-Initialisierung..." Start-Sleep -Seconds 5 Stop-Service -Name "RustDesk" -Force -ErrorAction SilentlyContinue Start-Sleep -Seconds 2 Get-Process -Name "RustDesk" -ErrorAction SilentlyContinue | Stop-Process -Force Start-Sleep -Seconds 1 # Config erneut schreiben (RustDesk hat evtl. beim Start ueberschrieben) Write-RustDeskConfig "$env:APPDATA\RustDesk\config\RustDesk2.toml" Write-RustDeskConfig "C:\Program Files\RustDesk\RustDesk2.toml" Write-RustDeskConfig "C:\Windows\ServiceProfiles\LocalService\AppData\Roaming\RustDesk\config\RustDesk2.toml" # Service final starten Start-Service -Name "RustDesk" -ErrorAction SilentlyContinue Start-Sleep -Seconds 2 # Verifizieren $configDir = "$env:APPDATA\RustDesk\config" if ((Test-Path "$configDir\RustDesk2.toml") -and (Select-String -Path "$configDir\RustDesk2.toml" -Pattern "api-server" -Quiet)) { Write-Success "GUYCOLLE-Server konfiguriert (ID, Relay, API, Key)." } else { Write-Warn "Automatische Konfiguration moeglicherweise unvollstaendig." Write-Warn "Bitte pruefe in RustDesk → Einstellungen → Netzwerk:" Write-Warn " ID Server: $IdServer" Write-Warn " Relay Server: $RelayServer" Write-Warn " API Server: $ApiServer" Write-Warn " Key: $Key" } # --- 8. Registry fuer rustdesk:// URL-Scheme --- Write-Info "Registriere rustdesk:// URL-Scheme..." try { $regPath = "HKLM:\SOFTWARE\Classes\rustdesk" New-Item -Path $regPath -Force | Out-Null Set-ItemProperty -Path $regPath -Name "(Default)" -Value "URL:RustDesk Protocol" New-ItemProperty -Path $regPath -Name "URL Protocol" -Value "" -PropertyType String -Force | Out-Null New-Item -Path "$regPath\shell\open\command" -Force | Out-Null Set-ItemProperty -Path "$regPath\shell\open\command" -Name "(Default)" -Value "`"C:\Program Files\RustDesk\RustDesk.exe`" --connect `"%1`"" Write-Success "URL-Scheme registriert." } catch { Write-Warn "Registry-Eintrag konnte nicht gesetzt werden: $_" Write-Warn "Das rustdesk:// URL-Scheme muss manuell konfiguriert werden." } # --- 9. Fertig --- Write-Host "" Write-Host "╔══════════════════════════════════════════════╗" -ForegroundColor Green Write-Host "║ RustDesk erfolgreich eingerichtet! ║" -ForegroundColor Green Write-Host "╚══════════════════════════════════════════════╝" -ForegroundColor Green Write-Host "" if ($existing) { Write-Info "RustDesk wurde neu installiert (Clean Install) und konfiguriert." } else { Write-Info "RustDesk wurde neu installiert und konfiguriert." } Write-Info "Du kannst RustDesk jetzt verwenden." Write-Host ""