# RustDesk-Client installieren und an den MHI-Server remote.mhi-solutions.de binden. # Einsatz: ScreenConnect Backstage (läuft als SYSTEM) oder PowerShell als Administrator. # Ohne Parameter wird ein zufälliges dauerhaftes Passwort erzeugt und am Ende ausgegeben. # .\rustdesk-install.ps1 zufälliges Passwort # .\rustdesk-install.ps1 -Password "Geheim1" festes Passwort param([string]$Password = "") $ErrorActionPreference = "Stop" [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $IdServer = "remote.mhi-solutions.de" $Key = "+3Yr93wo45yw9gmAW6CDwNZ8YyZacjv1kYSfOudMBEA=" $ConfigString = "==Qfi0TQFJUTkV3TmNVWrFjdqNWYalXW4olT3R0Q2cVQtdWO3lXN082dzkjcZNzKiojI5V2aiwiIiojIpBXYiwiIlRmLz52bpRXds92ctkGat5SZ09WblJnI6ISehxWZyJCLiUGZuMnbvlGd1x2bz1Sao1mLlR3btVmciojI0N3boJye" $Exe = Join-Path $env:ProgramFiles "RustDesk\rustdesk.exe" if (-not $Password) { $Password = -join ((48..57 + 65..90 + 97..122) | Get-Random -Count 14 | ForEach-Object { [char]$_ }) } # Neueste Version von GitHub laden (64-Bit-Installer) $Release = Invoke-RestMethod "https://api.github.com/repos/rustdesk/rustdesk/releases/latest" -Headers @{ "User-Agent" = "mhi-rustdesk-install" } $Asset = $Release.assets | Where-Object { $_.name -like "rustdesk-*-x86_64.exe" } | Select-Object -First 1 if (-not $Asset) { throw "Kein Windows-Installer im Release gefunden." } $Installer = Join-Path $env:TEMP $Asset.name Write-Host "Lade $($Asset.name) ..." Invoke-WebRequest $Asset.browser_download_url -OutFile $Installer -UseBasicParsing # Startet ein Programm und wartet begrenzt; rustdesk.exe beendet sich nach manchen Aufrufen nicht von selbst function Invoke-Begrenzt([string]$Pfad, [string]$Argumente, [int]$Sekunden) { $p = Start-Process $Pfad -ArgumentList $Argumente -PassThru if (-not $p.WaitForExit($Sekunden * 1000)) { Stop-Process -Id $p.Id -Force -ErrorAction SilentlyContinue } } Write-Host "Installiere ..." $Inst = Start-Process $Installer -ArgumentList "--silent-install" -PassThru $i = 0 while (-not (Test-Path $Exe) -and $i -lt 90) { Start-Sleep -Seconds 2; $i++ } if (-not (Test-Path $Exe)) { throw "Installation fehlgeschlagen, $Exe fehlt." } Start-Sleep -Seconds 5 if (-not $Inst.HasExited) { # Installer bleibt nach der Installation oft als Fenster stehen, daher gezielt beenden if (-not $Inst.WaitForExit(15000)) { Stop-Process -Id $Inst.Id -Force -ErrorAction SilentlyContinue } } if (-not (Get-Service -Name RustDesk -ErrorAction SilentlyContinue)) { Invoke-Begrenzt $Exe "--install-service" 30 Start-Sleep -Seconds 5 } Start-Service RustDesk -ErrorAction SilentlyContinue $i = 0 while ((Get-Service RustDesk).Status -ne "Running" -and $i -lt 20) { Start-Sleep -Seconds 2; $i++ } Write-Host "Server-Konfiguration setzen ..." Invoke-Begrenzt $Exe "--config $ConfigString" 30 Start-Sleep -Seconds 3 # Sicherheitsnetz: Konfiguration zusätzlich direkt ins Dienstprofil schreiben, falls --config nicht gegriffen hat $ServiceCfg = Join-Path $env:windir "ServiceProfiles\LocalService\AppData\Roaming\RustDesk\config" $Toml = Join-Path $ServiceCfg "RustDesk2.toml" if (-not (Test-Path $Toml) -or -not (Select-String -Path $Toml -Pattern $IdServer -Quiet)) { New-Item -ItemType Directory -Force -Path $ServiceCfg | Out-Null @" rendezvous_server = '$IdServer:21116' nat_type = 1 serial = 0 [options] custom-rendezvous-server = '$IdServer' relay-server = '$IdServer' key = '$Key' "@ | Set-Content -Path $Toml -Encoding ASCII Restart-Service RustDesk Start-Sleep -Seconds 5 } Write-Host "Dauerhaftes Passwort setzen ..." Invoke-Begrenzt $Exe "--password $Password" 30 Start-Sleep -Seconds 2 # ID abfragen, begrenzt auf 15 Sekunden, sonst aus der Dienst-Konfiguration lesen $Id = "" $Job = Start-Job -ScriptBlock { param($e) & $e --get-id | Out-String } -ArgumentList $Exe if (Wait-Job $Job -Timeout 15) { $Id = (Receive-Job $Job | Out-String).Trim() } Remove-Job $Job -Force -ErrorAction SilentlyContinue if (-not $Id) { $Main = Join-Path $ServiceCfg "RustDesk.toml" if (Test-Path $Main) { $m = Select-String -Path $Main -Pattern "^id\s*=\s*'(.+)'" | Select-Object -First 1 if ($m) { $Id = $m.Matches[0].Groups[1].Value } } } Remove-Item $Installer -ErrorAction SilentlyContinue Write-Host "" Write-Host "RustDesk bereit" Write-Host " Rechner : $env:COMPUTERNAME" Write-Host " ID : $Id" Write-Host " Passwort: $Password" Write-Host " Server : $IdServer"