diff --git a/README.md b/README.md index df7ff0a..fe65020 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,75 @@ -# template_repository +# RustDesk Startscripte – Techniverse Fernwartung +Startscripte für [RustDesk](https://rustdesk.com/), vorkonfiguriert für den **Techniverse Fernwartungsserver**. +Der Endnutzer erhält ein einfaches Script, das RustDesk startet, den Server konfiguriert und nach Beendigung alles sauber aufräumt. +--- +## Scripte im Überblick -Wichtig: Link für Lizenz anpassen. +| Script | Beschreibung | +|---|---| +| `START Rustdesk lokal.cmd` | Startet eine **lokal vorhandene** `rustdesk.exe` mit Techniverse-Serverkonfiguration. | +| `START Rustdesk Online-DL.cmd` | Lädt die **neueste RustDesk-Version** von GitHub herunter, konfiguriert und startet sie. Der Nutzer braucht nur diese eine Datei. | +--- +## Schnellstart + +### Variante 1 – Lokal (offline-fähig) + +1. `rustdesk.exe` neben das Script `START Rustdesk lokal.cmd` legen. +2. Script per Doppelklick starten. +3. Die angezeigte **ID** und das **Einmalpasswort** dem Techniverse-Support mitteilen. +4. RustDesk schließen – das Script räumt automatisch auf. + +### Variante 2 – Online-Download + +1. `START Rustdesk Online-DL.cmd` per Doppelklick starten. +2. Das Script lädt RustDesk automatisch von GitHub herunter. +3. Die angezeigte **ID** und das **Einmalpasswort** dem Techniverse-Support mitteilen. +4. RustDesk schließen – das Script räumt automatisch auf (inkl. Download). + +> **Hinweis:** Für die Online-Variante wird eine Internetverbindung benötigt. + +--- + +## Funktionsweise (Kurzfassung) + +Beide Scripte führen folgende Schritte aus: + +1. Bestehende RustDesk-Konfiguration sichern (Backup) +2. Techniverse-Serverkonfiguration schreiben +3. RustDesk starten +4. Warten, bis der Nutzer RustDesk schließt +5. Konfiguration wiederherstellen / aufräumen + +Technische Details findest du in der [Dokumentation](docs/TECHNIK.md). + +--- + +## Voraussetzungen + +- **Windows 10** oder neuer (ANSI-Farbcodes werden genutzt) +- Online-Variante: PowerShell 5.1+, Internetzugang, TLS 1.2 + +--- + +## Konfiguration anpassen + +Die Serverdaten können in beiden Scripten im Abschnitt **KONFIGURATION** geändert werden: + +| Parameter | Beschreibung | +|---|---| +| `SERVER` / `$srv` | Rendezvous- und Relay-Server-Adresse | +| `KEY` / `$key` | Öffentlicher Schlüssel des Servers | +| `API_SERVER` / `$api` | Optionaler API-Server (leer lassen wenn nicht benötigt) | + +--- + +## Lizenz + +[MIT License](./LICENSE) – © 2026 Patrick Asmus
diff --git a/START Rustdesk Online-DL.cmd b/START Rustdesk Online-DL.cmd
new file mode 100644
index 0000000..621c5b0
--- /dev/null
+++ b/START Rustdesk Online-DL.cmd
@@ -0,0 +1,151 @@
+@echo off
+:: Techniverse Fernwartung - Online Version
+:: Laedt RustDesk direkt von GitHub, konfiguriert den Server und startet
+:: Der Nutzer braucht NUR diese eine Datei.
+title Techniverse Fernwartung - Online
+chcp 65001 >nul 2>&1
+
+set "PS1=%TEMP%\techniverse-starter.ps1"
+
+:: PS1 aus dem eingebetteten Block extrahieren (alles zwischen BEGIN_PS1 und END_PS1)
+setlocal
+set "FOUND="
+(for /f "usebackq delims=" %%a in ("%~f0") do (
+ if defined FOUND (
+ if "%%a"==":: END_PS1" (goto :run_ps1)
+ echo(%%a
+ )
+ if "%%a"==":: BEGIN_PS1" set "FOUND=1"
+)) > "%PS1%"
+
+:run_ps1
+endlocal
+powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%PS1%"
+del "%PS1%" >nul 2>&1
+exit /b
+
+:: BEGIN_PS1
+$ErrorActionPreference = 'Stop'
+$Host.UI.RawUI.WindowTitle = 'Techniverse Fernwartung'
+
+# ========================== KONFIGURATION ===========================
+# Server-Adresse (Rendezvous + Relay)
+$srv = 'fernwartung.techniverse.net'
+# Oeffentlicher Schluessel des Servers
+$key = 'uE3lJCcnk21qN0VUdqtwJG6QAnpahdB5b2gVe40oMbU='
+# API-Server (optional) - Nur setzen wenn ein eigener API-Server vorhanden ist
+# Beispiel: $api = 'api.beispiel.de'
+$api = ''
+# ====================================================================
+
+$tmp = Join-Path $env:TEMP 'techniverse-fernwartung'
+$cfgDir = Join-Path $env:APPDATA 'RustDesk\config'
+$cfg2 = Join-Path $cfgDir 'RustDesk2.toml'
+$cfg2Bak = Join-Path $cfgDir 'RustDesk2.toml.techniverse-bak'
+$installDir = Join-Path $env:LOCALAPPDATA 'rustdesk'
+$hadBackup = $false
+
+try {
+ Write-Host ''
+ Write-Host ' ==============================================' -F DarkCyan
+ Write-Host ' Techniverse Fernwartung (Online)' -F DarkCyan
+ Write-Host ' ==============================================' -F DarkCyan
+ Write-Host ''
+
+ Get-Process rustdesk* -EA 0 | Stop-Process -Force -EA 0
+ Start-Sleep 2
+
+ New-Item -ItemType Directory $tmp -Force | Out-Null
+ $exe = Join-Path $tmp 'rustdesk.exe'
+
+ Write-Host " [1/4] Ermittle aktuelle RustDesk-Version..." -F White
+ [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
+ $ProgressPreference = 'SilentlyContinue'
+ $rel = Invoke-RestMethod -Uri 'https://api.github.com/repos/rustdesk/rustdesk/releases/latest' -UseBasicParsing
+ $ver = $rel.tag_name -replace '^v',''
+ $asset = $rel.assets | Where-Object { $_.name -like 'rustdesk-*-x86_64.exe' } | Select-Object -First 1
+ if (-not $asset) { throw 'Kein passender Download fuer x86_64 im neuesten Release gefunden.' }
+ $url = $asset.browser_download_url
+ Write-Host " Aktuelle Version: $ver" -F DarkGray
+ Write-Host " $url" -F DarkGray
+ Write-Host ' (Das kann einen Moment dauern...)' -F DarkGray
+ Invoke-WebRequest -Uri $url -OutFile $exe -UseBasicParsing
+ $ProgressPreference = 'Continue'
+ if (-not (Test-Path $exe)) { throw 'Download fehlgeschlagen' }
+ $mb = [math]::Round((Get-Item $exe).Length/1MB,1)
+ Write-Host " Heruntergeladen: $mb MB" -F DarkGray
+
+ Write-Host ' [2/4] Sichere bestehende Konfiguration...' -F White
+ New-Item -ItemType Directory $cfgDir -Force | Out-Null
+ if (Test-Path $cfg2) {
+ Copy-Item $cfg2 $cfg2Bak -Force
+ $hadBackup = $true
+ Write-Host ' Backup erstellt.' -F DarkGray
+ } else {
+ Write-Host ' Keine bestehende Konfiguration.' -F DarkGray
+ }
+
+ Write-Host ' [3/4] Konfiguriere Server...' -F White
+ $toml = @"
+rendezvous_server = "$srv"
+nat_type = 1
+serial = 0
+
+[options]
+custom-rendezvous-server = "$srv"
+relay-server = "$srv"
+key = "$key"
+"@
+ if ($api) { $toml += "`napi-server = `"$api`"" }
+ Set-Content -Path $cfg2 -Value $toml -Encoding UTF8
+
+ Write-Host ' [4/4] Starte RustDesk...' -F White
+ Start-Process $exe
+ Write-Host ' Warte auf Start...' -F DarkGray
+ Start-Sleep 8
+ if (-not (Get-Process rustdesk* -EA 0)) { throw 'RustDesk konnte nicht gestartet werden.' }
+
+ Write-Host ''
+ Write-Host ' ==============================================' -F DarkCyan
+ Write-Host ' RustDesk laeuft.' -F White
+ Write-Host ' Teile deine ID mit dem Techniverse-Support.' -F White
+ Write-Host ''
+ Write-Host ' Schliesse RustDesk um die Sitzung zu beenden.' -F DarkYellow
+ Write-Host ' Dieses Fenster NICHT schliessen.' -F Red
+ Write-Host ' ==============================================' -F DarkCyan
+ Write-Host ''
+ Write-Host ' !! ACHTUNG - BETRUGSWARNUNG !!' -F Red
+ Write-Host ' Teile deine ID und dein Einmalpasswort' -F DarkYellow
+ Write-Host ' NUR mit Personen, denen du vertraust!' -F DarkYellow
+ Write-Host ' RustDesk wird haeufig fuer Betrug missbraucht.' -F DarkYellow
+ Write-Host ' Techniverse wird dich NIE unaufgefordert' -F DarkYellow
+ Write-Host ' nach deiner ID oder deinem Passwort fragen.' -F DarkYellow
+ Write-Host ''
+ do { Start-Sleep 2 } while (Get-Process rustdesk* -EA 0)
+
+} catch {
+ Write-Host "`n FEHLER: $_" -F Red
+ Write-Host ' Bitte kontaktiere den Techniverse-Support.' -F DarkYellow
+ Write-Host ''
+ Read-Host ' Druecke Enter zum Beenden'
+} finally {
+ Write-Host "`n Raeume auf..." -F DarkYellow
+ Get-Process rustdesk* -EA 0 | Stop-Process -Force -EA 0
+ Start-Sleep 3
+ if (Test-Path $cfg2Bak) {
+ Copy-Item $cfg2Bak $cfg2 -Force
+ Remove-Item $cfg2Bak -Force -EA 0
+ } elseif (Test-Path $cfg2) {
+ Remove-Item $cfg2 -Force -EA 0
+ }
+ if (Test-Path $installDir) { Remove-Item $installDir -Recurse -Force -EA 0 }
+ if (-not $hadBackup) {
+ $rdAD = Join-Path $env:APPDATA 'RustDesk'
+ if (Test-Path $rdAD) { Remove-Item $rdAD -Recurse -Force -EA 0 }
+ }
+ if (Test-Path $tmp) { Remove-Item $tmp -Recurse -Force -EA 0 }
+ Write-Host ' Aufgeraeumt. Bis zum naechsten Mal.' -F DarkGreen
+ Start-Sleep 3
+}
+:: END_PS1
+
diff --git a/START Rustdesk lokal.cmd b/START Rustdesk lokal.cmd
new file mode 100644
index 0000000..31bca3d
--- /dev/null
+++ b/START Rustdesk lokal.cmd
@@ -0,0 +1,165 @@
+@echo off
+chcp 65001 >nul 2>&1
+title Techniverse Fernwartung
+setlocal
+
+:: ============================================================
+:: Techniverse Fernwartung - RustDesk Portable Starter
+:: Startet RustDesk mit vorkonfiguriertem Server
+:: Räumt nach dem Beenden alles auf
+:: ============================================================
+
+:: ========================== KONFIGURATION ===========================
+:: Server-Adresse (Rendezvous + Relay)
+set "SERVER=fernwartung.techniverse.net"
+:: Öffentlicher Schlüssel des Servers
+set "KEY=uE3lJCcnk21qN0VUdqtwJG6QAnpahdB5b2gVe40oMbU="
+:: API-Server (optional) - Nur setzen wenn ein eigener API-Server vorhanden ist
+:: Beispiel: set "API_SERVER=api.beispiel.de"
+set "API_SERVER="
+:: ====================================================================
+
+:: ANSI-Farbcodes definieren (Windows 10+)
+for /f %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
+set "CYAN=%ESC%[36m"
+set "WHITE=%ESC%[97m"
+set "GRAY=%ESC%[90m"
+set "YELLOW=%ESC%[33m"
+set "RED=%ESC%[91m"
+set "GREEN=%ESC%[32m"
+set "RESET=%ESC%[0m"
+
+set "RUSTDESK_EXE=%~dp0rustdesk.exe"
+set "CONFIGDIR=%APPDATA%\RustDesk\config"
+set "CONFIG2=%CONFIGDIR%\RustDesk2.toml"
+set "CONFIG2_BAK=%CONFIGDIR%\RustDesk2.toml.techniverse-bak"
+set "INSTALLDIR=%LOCALAPPDATA%\rustdesk"
+
+:: Prüfe ob die RustDesk EXE vorhanden ist
+if not exist "%RUSTDESK_EXE%" (
+ echo.
+ echo %RED%FEHLER: rustdesk.exe nicht gefunden.%RESET%
+ echo %YELLOW%Bitte lege diese Datei neben %~nx0%RESET%
+ echo.
+ pause
+ exit /b 1
+)
+
+echo.
+echo %CYAN%══════════════════════════════════════════════%RESET%
+echo %CYAN% Techniverse Fernwartung%RESET%
+echo %CYAN%══════════════════════════════════════════════%RESET%
+echo.
+echo %WHITE%RustDesk wird vorbereitet...%RESET%
+echo.
+
+:: Eventuell laufende RustDesk-Instanzen beenden
+taskkill /f /im rustdesk.exe >nul 2>&1
+timeout /t 2 /nobreak >nul
+
+:: Config-Verzeichnis erstellen falls nicht vorhanden
+mkdir "%CONFIGDIR%" >nul 2>&1
+
+:: Bestehende Config sichern (falls vorhanden)
+echo %WHITE%[1/3] Sichere bestehende Konfiguration...%RESET%
+if exist "%CONFIG2%" (
+ copy /y "%CONFIG2%" "%CONFIG2_BAK%" >nul
+ echo %GRAY%Backup erstellt.%RESET%
+) else (
+ echo %GRAY%Keine bestehende Konfiguration gefunden.%RESET%
+)
+
+:: Server-Konfiguration schreiben
+echo %WHITE%[2/3] Konfiguriere Techniverse-Server...%RESET%
+(
+echo rendezvous_server = "%SERVER%"
+echo nat_type = 1
+echo serial = 0
+echo.
+echo [options]
+echo custom-rendezvous-server = "%SERVER%"
+echo relay-server = "%SERVER%"
+echo key = "%KEY%"
+) > "%CONFIG2%"
+if defined API_SERVER (
+ echo api-server = "%API_SERVER%" >> "%CONFIG2%"
+)
+
+:: RustDesk starten
+echo %WHITE%[3/3] Starte RustDesk...%RESET%
+start "" "%RUSTDESK_EXE%"
+
+:: Warte kurz bis RustDesk sich initialisiert hat
+echo %GRAY%Warte auf RustDesk-Start...%RESET%
+timeout /t 8 /nobreak >nul
+
+:: Prüfe ob RustDesk tatsächlich läuft
+tasklist /fi "imagename eq rustdesk.exe" 2>nul | find /i "rustdesk.exe" >nul
+if errorlevel 1 (
+ echo.
+ echo %RED%FEHLER: RustDesk konnte nicht gestartet werden.%RESET%
+ echo %YELLOW%Versuche es erneut oder kontaktiere den Support.%RESET%
+ echo.
+ pause
+ goto :cleanup
+)
+
+echo.
+echo %CYAN%══════════════════════════════════════════════%RESET%
+echo %WHITE%RustDesk laeuft.%RESET%
+echo %WHITE%Teile deine ID mit dem Techniverse-Support.%RESET%
+echo.
+echo %YELLOW%Schliesse RustDesk um die Sitzung zu beenden.%RESET%
+echo %RED%Dieses Fenster NICHT schliessen.%RESET%
+echo %CYAN%══════════════════════════════════════════════%RESET%
+echo.
+echo %RED% !! ACHTUNG - BETRUGSWARNUNG !!%RESET%
+echo %YELLOW% Teile deine ID und dein Einmalpasswort%RESET%
+echo %YELLOW% NUR mit Personen, denen du vertraust!%RESET%
+echo %YELLOW% RustDesk wird haeufig fuer Betrug missbraucht.%RESET%
+echo %YELLOW% Techniverse wird dich NIE unaufgefordert%RESET%
+echo %YELLOW% nach deiner ID oder deinem Passwort fragen.%RESET%
+echo.
+
+:: Warte bis alle RustDesk-Prozesse beendet sind (Polling-Schleife)
+:waitloop
+timeout /t 2 /nobreak >nul
+tasklist /fi "imagename eq rustdesk.exe" 2>nul | find /i "rustdesk.exe" >nul
+if not errorlevel 1 goto :waitloop
+
+:cleanup
+echo.
+echo %YELLOW%Raeume auf...%RESET%
+
+:: RustDesk Prozesse beenden (falls noch laufend)
+taskkill /f /im rustdesk.exe >nul 2>&1
+timeout /t 3 /nobreak >nul
+
+:: Config wiederherstellen oder aufräumen
+if exist "%CONFIG2_BAK%" (
+ echo %GRAY%Stelle urspruengliche Konfiguration wieder her...%RESET%
+ copy /y "%CONFIG2_BAK%" "%CONFIG2%" >nul
+ del "%CONFIG2_BAK%" >nul 2>&1
+) else (
+ echo %GRAY%Entferne Fernwartungs-Konfiguration...%RESET%
+ del "%CONFIG2%" >nul 2>&1
+)
+
+:: RustDesk-Installation aufräumen (entpackte Dateien)
+if exist "%INSTALLDIR%" (
+ echo %GRAY%Entferne RustDesk-Dateien...%RESET%
+ rmdir /s /q "%INSTALLDIR%" >nul 2>&1
+)
+
+:: RustDesk AppData aufräumen (nur wenn es vorher nicht installiert war)
+if not exist "%CONFIG2_BAK%" (
+ if exist "%APPDATA%\RustDesk" (
+ echo %GRAY%Entferne RustDesk AppData...%RESET%
+ rmdir /s /q "%APPDATA%\RustDesk" >nul 2>&1
+ )
+)
+
+echo %GREEN%Aufgeraeumt. Bis zum naechsten Mal.%RESET%
+echo.
+timeout /t 3 /nobreak >nul
+exit /b 0
diff --git a/docs/TECHNIK.md b/docs/TECHNIK.md
new file mode 100644
index 0000000..7b3711b
--- /dev/null
+++ b/docs/TECHNIK.md
@@ -0,0 +1,101 @@
+# Technische Details
+
+## Ablauf der Scripte
+
+### START Rustdesk lokal.cmd
+
+```
+Batch-Script (.cmd)
+│
+├── Prüfe ob rustdesk.exe neben dem Script liegt
+├── Beende laufende RustDesk-Instanzen (taskkill)
+├── Sichere bestehende RustDesk2.toml → .techniverse-bak
+├── Schreibe Server-Konfiguration in RustDesk2.toml
+├── Starte rustdesk.exe
+├── Warte bis Nutzer RustDesk schließt (Polling-Schleife)
+└── Cleanup
+ ├── Konfiguration aus Backup wiederherstellen (oder löschen)
+ ├── %LOCALAPPDATA%\rustdesk entfernen
+ └── %APPDATA%\RustDesk entfernen (nur wenn vorher nicht vorhanden)
+```
+
+### START Rustdesk Online-DL.cmd
+
+```
+Batch-Wrapper → extrahiert eingebettetes PowerShell-Script
+│
+├── PowerShell-Code wird aus dem .cmd in %TEMP% extrahiert
+├── Ermittle neueste RustDesk-Version via GitHub API
+│ └── GET https://api.github.com/repos/rustdesk/rustdesk/releases/latest
+├── Download von rustdesk-*-x86_64.exe nach %TEMP%\techniverse-fernwartung\
+├── Sichere bestehende RustDesk2.toml → .techniverse-bak
+├── Schreibe Server-Konfiguration in RustDesk2.toml
+├── Starte rustdesk.exe
+├── Warte bis Nutzer RustDesk schließt (Polling-Schleife)
+└── Cleanup (im finally-Block, läuft auch bei Fehler)
+ ├── Konfiguration aus Backup wiederherstellen (oder löschen)
+ ├── %LOCALAPPDATA%\rustdesk entfernen
+ ├── %APPDATA%\RustDesk entfernen (nur wenn vorher nicht vorhanden)
+ └── %TEMP%\techniverse-fernwartung\ entfernen
+```
+
+---
+
+## Dateipfade
+
+| Pfad | Zweck |
+|---|---|
+| `%APPDATA%\RustDesk\config\RustDesk2.toml` | RustDesk-Konfigurationsdatei (Server, Key, etc.) |
+| `%APPDATA%\RustDesk\config\RustDesk2.toml.techniverse-bak` | Backup der originalen Konfiguration |
+| `%LOCALAPPDATA%\rustdesk\` | Von RustDesk entpackte Dateien (wird beim Cleanup entfernt) |
+| `%TEMP%\techniverse-fernwartung\` | Temporärer Download-Ordner (nur Online-Variante) |
+| `%TEMP%\techniverse-starter.ps1` | Temporär extrahiertes PowerShell-Script (nur Online-Variante) |
+
+---
+
+## Generierte Konfiguration (RustDesk2.toml)
+
+```toml
+rendezvous_server = "fernwartung.techniverse.net"
+nat_type = 1
+serial = 0
+
+[options]
+custom-rendezvous-server = "fernwartung.techniverse.net"
+relay-server = "fernwartung.techniverse.net"
+key = "uE3lJCcnk21qN0VUdqtwJG6QAnpahdB5b2gVe40oMbU="
+```
+
+Falls ein API-Server konfiguriert ist, wird zusätzlich `api-server` gesetzt.
+
+---
+
+## Batch/PowerShell-Hybrid (Online-Variante)
+
+Das Online-Script nutzt einen Trick: Die `.cmd`-Datei enthält eingebetteten PowerShell-Code zwischen den Markern `:: BEGIN_PS1` und `:: END_PS1`. Der Batch-Teil extrahiert diesen Code in eine temporäre `.ps1`-Datei und führt sie aus. Dadurch braucht der Nutzer nur eine einzige Datei.
+
+**Ausführung:** `powershell.exe -NoProfile -ExecutionPolicy Bypass -File