RustDesk-Client anpassen und portable Version für den Supporter erstellen

Möchte man RustDesk OSS mit bestimmen Voreinstellungen verteilen oder gar eine portable Version bauen, so ist es hilfreich zu Wissen wo was gespeichert wird.

Dieser Beitrag basiert auf Version 1.2.3-1 der Open Source-Ausgabe.

Speicherort der Konfiguration

RustDesk speichert unter Windows seine Einstellungen unter

%APPDATA%\RustDesk\config

bzw. wenn es als Dienst installiert ist unter

C:\Windows\ServiceProfiles\LocalService\AppData\Roaming\RustDesk\config

D.h. man kann bestimmte Konfigurationsdateien (*.toml) hier ablegen bzw. überschreiben um z.B. Voreinstellungen festzulegen. Primär interessant sind hier

RustDesk_local.toml
RustDesk2.toml

denn diese enthalten einen Großteil der eigentlichen Konfiguration (ohne Favoriten, Adressbuch, …). Man sollte keinesfalls alle Dateien aus einer bestehenden Installation bzw. einer vorigen Ausführung von RustDesk verwenden, da mitunter eindeutige Daten wie beispielsweise Schlüssel oder Kennwörter dort hinterlegt sind. Die genannten Dateien können (nach aktuellem Kenntnistand) in der Regel ohne Anpassungen übernommen werden.

Möchte man eine portable Version von RustDesk erstellen, so muss man ebenfalls den genannten Pfad verwenden, da dieser bislang leider nicht verändert werden kann. Dieses Thema schwelt allerdings bereits seit Jahren vor sich hin.

Was kann oder sollte man anpassen

Grundsätzlich gilt alles was man nicht benötigt deaktiviert werden sollte. Nicht die schlechteste Idee ist es die Audio-Übertragung zu deaktivieren oder Stumm zu schalten um ungewollte Übermittlungen zu vermeiden.

Zuträglich für die Sicherheit kann sein, die “LAN-Erkennung” zu deaktivieren und ggf. die IP-Whitelist (nur den eigenen Relay-Server eintragen) zu verwenden.

Für feste Installationen von RustDesk (auch als Dienst, s.u.) kann es sinnvoll sein ein statisches Kennwort zu vergeben.

Baut man eine eigene RustDesk.exe oder verpackt diese um (s.u.) dann sollte “Beim Start auf Softwareaktualisierung prüfen” deaktiviert werden um mögliche Irritationen auf Benutzerseite zu vermeiden.

Server-Adresse und öffentlichen Schlüssel verstecken (für den spontanen Support)

Eine Gegebenheit bei RustDesk ist, das man relativ leicht und ungewollt den eigenen RustDesk Server OSS  samt öffentlichen Schlüssel (Public Key) exponieren kann. Wenn man aber nicht möchte, das jemand so leicht an diese Daten rankommen kann, muss man etwas kreativ werden.

Die offizielle Herangehensweise lautet RustDesk mit Server-Adresse und Key selbst zu kompilieren. Das setzt allerdings voraus das man eine entsprechende Build-Umgebung aufbaut und pflegt. (Imho) Einfacher ist es möglich die ausführbare RustDesk-Datei sozusagen umzuverpacken. Gemeint ist das man ein eigenes selbstentpackendes Archiv erstellt das alle Daten enthält. Unter Windows führt ein Weg über 7-Zip:

  • Die aktuelle RustDesk.exe herunterladen und den Dateinamen um “-host=<IP-oder-FQDN>,key=<PublicKey-des-Servers>,” erweitern.
  • Das aktuelle 7-Zip herunterladen und installieren.
  • Das aktuelle LZMA SDK herunterladen und entpacken.
  • Eine Text-Datei mit dem Namen “config.txt” und folgenden Inhalt erstellen:
    ;!@Install@!UTF-8!
    Title="RustDesk"
    ExecuteFile="rustdesk-host=-host=<IP-oder-FQDN>,key=<PublicKey-des-Servers>,.exe"
    ExecuteParameters=""
    ;!@InstallEnd@!
  • In einer Eingabeaufforderung folgenden Befehl ausführen:
    copy /b lzma2301\bin\7zSD.sfx + config.txt + "rustdesk-host=<IP-oder-FQDN>,key=<PublicKey-des-Servers>,.exe.7z" MyCustomRustDesk.exe

Den Namen der resultierenden *.exe-Datei kann man (natürlich) selbst wählen. Führt man diese Datei aus, wird das Archiv entpackt und RustDesk gestartet. Der Nachteil an dieser Variante ist, das nach wie vor Reste im System zurück bleiben und allem voran das die 7-Zip-Variante immer erhöhte Rechte anfordert. Das ist allerdings unpraktisch wenn ein Benutzer, der eben nur Benutzerrechte hat, RustDesk ausführen können soll.

Daher ist es besser eine Alternative zu verwenden. Während des Schreibens dieser Zeilen wurde nach weiteren Möglichkeiten gesucht, SFX-Dateien zu erstellen. Siehe

Selbstentpackendes Archiv das ein Skript oder eine Anwendung ausführt erstellen

Im Zuge der weiteren Tests wurde dann mit WinRAR gearbeitet. Geschickter ist insgesamt, statt direkt der Exe-Datei ein Skript zu starten, das nach dem Beenden von RustDesk aufräumt und so keine Reste im System zurückbleiben.

Vorbereitung 

Vorab sei angemerkt, es geht nachfolgend nicht um das Installieren von RustDesk, sondern darum ein SFX zu erstellen, das ein vorkonfiguriertes RustDesk für den spontanen Support ausführt.

  • Die aktuelle RustDesk.exe herunterladen und auf einem System ausführen.
  • Die gewünschte Konfiguration vornehmen und RustDesk beenden.
  • Aus dem Ordner “%APPDATA%\RustDesk\config” die Dateien “RustDesk_local.toml” und “RustDesk2.toml” kopieren.

Ein einfaches *.cmd-Skript (nicht empfohlen)

In einen Ordner das nachfolgende Batch-Skript, die RustDesk-Datei mit dem Namen “rustdesk.exe” und einen “config”-Unterordner mit den kopierten Konfigurationsdateien hinterlegen:

@echo off

title RustDesk - Spontaner Support

echo.
echo Die Fernwarnwartung wird gestartet, bitte warten...

rem Konfiguration kopieren

 xcopy /s /i /y "config" "%AppData%\RustDesk\config" >nul

rem RustDesk ausfuehren

 rustdesk.exe

rem Warten bis das RustDesk wirklich beendet ist,
rem andernfalls klappt das Aufraeumen nicht.

 :loop
 tasklist | find "rustdesk.exe" >nul
 if %ERRORLEVEL% equ 0 (
  timeout /t 1 >nul
  goto loop
 )

rem Ordner entfernen

 rmdir "%LocalAppData%\RustDesk" /S /Q >nul
 rmdir "%AppData%\RustDesk" /S /Q >nul

rem Beenden

 exit

Oldschool, i know, aber es läuft 😉Nebenbei bemerkt: PowerShell (statt Batch) habe ich ebenfalls versucht, aber da scheiterte es an der Execution-Policy, die je nach Konfiguration nicht vom gemeinen Benutzer geändert werden kann.

Nun in WinRAR ein neues SFX-Archiv mit folgendem Inhalt

config
rustdesk.exe
rustdesk.cmd

und mindestens diesen Einstellungen erstellen:

Die daraus resultierende *.exe-Datei kann ohne erhöhte Rechte ausgeführt, für den spontanen Support an Kunden gereicht oder auf der eigenen Homepage zum Download angeboten werden.

Die Nachteile an dieser Variante sind, das man ein Fenster der Eingabeaufforderung sieht und wenn der Benutzer Dieses schließt das Skript abgebrochen wird und so Reste im System zurückbleiben.

Wichtig: Diese Variante nimmt aktuell keine Rücksicht auf ein ggf. vorhandenes RustDesk!

Weiteres

In den weiteren Einstellungen von WinRAR lässt sich zudem beispielweise das Icon ändern, ein Text oder eine Lizenz hinterlegen und mehr. Eine Überlegung die man vielleicht anstellen sollte wäre das Setzen eines Kennwort (beim Erstellen des Archivs), so das nicht einfach jeder die Fernwartung starten bzw. erst gar nicht erst entpacken kann. Dies würde die Server-Adresse samt Public Key zusätzlich schützen.

AutoIt – Eine bessere Alternative zum einfachen *.cmd-Skript (empfohlen)

Wie so oft löst (für mich) AutoIt die eine oder andere Unzulänglichkeit (sichtbare Eingabeaufforderung, …) ganz einfach. Anbei der Quellcode für (m)eine “rustdesk-helper.au3”-Datei aus der man dann eine entsprechende *.exe-Datei kompiliert:

; Infobereichssymbol ausblenden

 #NoTrayIcon

; Konfigurationsordner verschieben
; Ziel: "%AppData%\RustDesk"

 DirMove (@WorkingDir & "\config", @AppDataDir & "\RustDesk\config", 0)

; RustDesk ausfuehren
; WICHTIG: Nicht rustdesk.exe verwenden!

 Run ("rustdesk-full.exe", "")

; Warten bis das RustDesk gestartet wurde
; Timeout: 60 Sekunden

 ProcessWait ("rustdesk.exe", 60)

; Warten bis RustDesk beendet wurde

 ProcessWaitClose ("rustdesk.exe", 0)

; Aufräumen
; Unter "%AppData%" und "%LocalAppData%" jeweils den RustDesk-Ordner entfernen

 DirRemove (@AppDataDir & "\RustDesk", 1)
 DirRemove (@LocalAppDataDir & "\rustdesk", 1)

Im *.zip-Archiv ist der oben gezeigte Quellcode und eine daraus kompilierte *.exe-Datei (64-bit) enthalten:

RustDesk-Helper.zip

Diese “rustdesk-helper.exe”-Datei verwendet man anstelle der “rustdesk.cmd” und lässt diese dann von WinRAR (SFX) ausführen. Vor dem Packen ist zu beachten, das man die “rustdesk.exe” in “rustdesk-full.exe” umbenennt!

Kurzum: (Imho) Einfacher, effizienter, versteckt (kein Fenster sichtbar) und vor allem ganz einfach!

Wichtig: Diese Variante nimmt aktuell keine Rücksicht auf ein ggf. vorhandenes RustDesk!

Hinweis: Um es an dieser Stelle noch mal ganz klar zu formulieren: 100%-ige Sicherheit gibt es nicht. Mit genug Wissen (aus diesem Beitrag), ein paar IT-Grundkenntnisse und einer woher auch immer stammenden angepassten RustDesk.exe kommt man dennoch relativ leicht an die Daten (gemeint ist Server-Adresse oder Public Key) heran. Mit diesen Daten kann jeder den eigenen RustDesk Server OSS nutzen. Dieser Tatsache muss man sich bewusst sein.

Und wenn man doch erhöhte Rechte benötigt?

Während einer Sitzung können erhöhte Rechte angefordert werden:

Zu beachten ist allerdings, wenn man die Daten selbst eingibt, das dennoch auf der entfernten Seite jemand zunächst einmal “Ja” klicken muss.

Ansonsten die via WinRAR-erstellte *.exe-Datei via “Rechtsklick – Als Administrator ausführen” starten um von vornherein erhöhte Rechte zu haben.

RustDesk als Dienst installieren

Im Gegensatz zu manch anderen Fernwartungslösungen gibt es bei RustDesk nur eine ausführbare Datei, die sowohl für die spontane Ausführung als auch für eine Installation verwendet werden kann. Daraus ergibt sich, das man zunächst die aktuelle RustDesk.exe herunterlädt und ausführt, anschließend klickt man links unten auf “Installieren”:

Man bestätigt den Installationspfad, ob Verknüpfungen angelegt werden sollen und stimmt der Lizenz zu. Nach der Installation und dem daraus resultierenden Neustart von RustDesk wird “Installieren” nicht mehr in der Oberfläche angezeigt. Darüber hinaus gibt es nun einen Dienst mit dem Namen “RustDesk Service” und dessen Konfiguration wird unter dem eingangs erwähnten Pfad gespeichert.

Achtung: Beendet man RustDesk über das Infobereichssymbol, wird der Dienst ebenfalls beendet und sogar entfernt!

RustDesk portable machen (für den Supporter)

Wegen der Einschränkung, das RustDesk in die eingangs genannten Ordner die Konfiguration speichert, muss man etwas tricksen um das Programm portable zu machen. Das nachfolgende Batch-Skript zusammen mit der aktuellen “rustdesk.exe” und einer ggf. vorhandenen Konfiguration in einen Ordner kopieren.

@echo off

title RustDesk - portable

echo.
echo RustDesk Portable wird gestartet, bitte warten...

rem Konfiguration kopieren

 xcopy /s /i /y "config" "%AppData%\RustDesk\config" >nul

rem RustDesk ausfuehren

 rustdesk.exe

rem Warten bis das RustDesk wirklich beendet ist,
rem andernfalls klappt das Aufraeumen nicht.

 :loop
 tasklist | find "rustdesk.exe" >nul
 if %ERRORLEVEL% equ 0 (
 timeout /t 1 >nul
 goto loop
 )

rem Die Konfiguration zurueck kopieren

 xcopy /s /i /y "%AppData%\RustDesk\config" "config" /exclude:exclude.txt >nul

rem Ordner entfernen

 rmdir "%LocalAppData%\RustDesk" /S /Q >nul
 rmdir "%AppData%\RustDesk" /S /Q >nul

rem Beenden

 exit

Die “exlude.txt” enthält folgende Einträge:

RustDesk.toml
RustDesk_hwcodec.toml

Startet man nun das Skript wird die Konfiguration nach APPDATA kopiert und RustDesk gestartet. Sobald es beendet wurde, wird die Konfiguration zurück kopiert und aufgeräumt.

Hinweis: Dieses Skript prüft in der aktuellen Form nicht, ob bereits jemand anders die portable Ausgabe ausführt. Darüber hinaus gibt es ein Fenster der Eingabeaufforderung das nicht geschlossen werden darf.

Erfolgreiche Fehlschläge

Zum Thema “Erfolgreicher Fehlschlag” anbei ein paar Ergebnisse aus einigen Test-Reihen was leider nicht funktioniert:

Das Ändern der Umgebungsvariablen um damit den Speicherort der Konfiguration selbst festlegen zu können waren alle samt nicht von Erfolg gekrönt.

Ändert man nur APPDATA ab, wird dies von RustDesk völlig ignoriert, naheliegend ist, das mittels System Call der Pfad ermittelt wird.

Interessanterweise liest und speichert RustDesk überhaupt keine Konfigurationsdateien mehr wenn man die Variable USERPROFILE ändert. Gleiches Spiel mit HOMEPATH.

Vermutlich wäre es schlicht zu einfach gewesen, auf diese Art RustDesk portable zu machen.

Beim Versuch via WinRAR und Batch das Fenster der Eingabeaufforderung wenigstens zu minimieren wurde u.a. der Befehl

cmd /c start /min rustdesk.cmd

versucht, aber das hatte den Nachteil, das ein Ordner unter “TMP” zurückbleibt, was wir natürlich nicht möchten, da in diesem wieder alles drin ist.

Wie geht es weiter?

Die hier gezeigten Skripte sind quasi Version  1, teilweise ist bereits eine Version 2 in Arbeit. In absehbarer Zeit wird es also das eine oder andere Update geben.

12 Kommentare

  1. squat0001

    Danke für diesen netten hilfreichen Blog Eintrag.

    zum Eintrag:
    das 7zip Modul räumt selbst auf wenn man das 7zSD.sfx verwendet, das erstellt ein Temp Verzeichnis und löscht die Daten. In der aktuell RustDesk Version 1.2.3, wenn man die Config in den Filenamen steckt, wird die Config aus dem Config File lokal nicht geladen, nicht geschrieben.

    Bevor für mich ein verändern der lokalen User Config in Frage käme, wozu auch ein verschieben/umbenennen zählt, würde ich den Client selbst bauen mit eigenem AppData Verzeichnis.

    Ich bin also beim Ansatz mit dem 7zip geblieben, habe aber das Manifest angepasst, sodass keine Admin Rechte notwendig sind.

    https://stackoverflow.com/a/27148617/1634374

  2. Flex

    Toller Beitrag, vielen Dank. Noch ein Hinweis. Wenn man ein permanenten Passwort mit in die Konfiguration einbinden möchte, muss auch die Datei RustDesk.toml mit in dem config Ordner sein.

    Für die Supportversion funktioniert das alles so wie beschrieben, ich hab es mit AutoIT Script gemacht.

    Wenn ich jetzt aber die Installationsversion ausführe, dann habe ich noch keine Möglichkeit gefunden, wie ich die config-Daten hier integrieren kann (also ID, Key und permanentes Passwort). Eine Anleitung dafür wäre sehr schön. Danke.

  3. Andy

    Ich habe bei meinen bisherigen Versuchen einfach mein vorkonfiguriertes “Profil” zuerst ans Ziel kopiert und dann erst RD installiert.
    Soweit ich es beurteilen kann, hat das funktioniert.

  4. Flex

    Hallo Andy. Danke für die Antwort. Das hat bei mir leider nicht funktioniert. Wenn ich vor der Installation die drei Dateien im “config” Ordner an den Zielordner in %appdata% und %windir% kopiere, wird es bei der Installation überschrieben.

    Wenn ich die Installation durchführe und abschließe, danach RD beende (auch über das Systemtray und dann die config-Dateien in die o. g. Ordner sind die Einstellungen beim nächsten Start vorhanden.

    Hab aber keine Möglichkeit gefunden, das alles “automatisiert” mit einem Installationsdurchgang umzusetzten, da ist immer manuelle Handarbeit nötig.

  5. Andy

    Hi,

    zum Thema selbst kompilieren. Man muss nicht unbedingt ein eigenes Buildsystem aufsetzen. Die Dateien lassen sich auch super über Actions auf Github kompilieren 🙂

    Ohne Premiumaccount dauert es zwar etwas aber es funktioniert.

    Um ein Fork zu erstellen der Privat ist kann folgender Link genutzt werden:

    https://github.com/new/import

    Danach einfach diese Anleitung befolgen und den Abschnitt für das forken überspringen

    https://rustdesk.com/docs/en/dev/build/all/

    Nun könnte man natürlich trotzdem dein Ansatz nutzen um das System zu bereinigen. Denn die Dateien werden totzdem abgelegt. Darin befinden sich dann aber nur die Server Adresse. Der Key ist nicht zu finden.

  6. blubaa

    2. Kommentarversuch + Ergänzung 🙂

    Vielen Dank für den tollen Beitrag.

    Ich habe dann noch etwas recheriert und herausgefunden, dass man nicht unbedingt eine eigene Buildumgebung aufbauen und pflegen muss. Über Github Action lässt sich der eigene, modifizierte Code compilieren.

    dafür habe ich einen privaten Fork erstellt:
    https://github.com/new/import

    Dann bin ich nach folgender Anleitung vorgegangen. (Absatz für Fork erstellen überspringen)
    https://rustdesk.com/docs/en/dev/build/all/

    nach etwa 40min waren meine releases erstellt.

    Wenn man nun die erstellte exe startet (am besten auf einem System testen, wo noch kein rustdesk installiert war) sind die Einstellungen für Server leer aber die Verbindung ist trotzdem aufgebaut.

    Da aber nun trotzdem Reste beim Kunden auf dem System zurückbleiben würden. Habe ich
    den Helpercode modifiziert und die Zeile zum kopieren der Configdateien entfernt. (wird nicht mehr benötigt) compiliert und wieder eine .exe mit winRAR erstellt. Hier muss man aber nur noch Rustdesk-full.exe (eigenes Build) und Rustdesk-helper.exe packen und ausführbar machen.

    Wenn man nun startet funktioniert alles wie gewohnt. Nach dem beenden werden die Reste aus dem AppData folder gelöscht. Und sollte das mal schieflaufen, findet man in den hinterlassenen dateien maximal die Serveradresse. Der Key ist nicht zu finden.

    beste Grüße Andy

  7. Michael

    Super idee, leider wird die kompilierte ruskdesk-helper.de von windows als virus erkannt 🙁 somit springt dann der defender rein und löscht es wärend dem entpacken per winrar. Mir ist der pro plan für meine Zwecke einfach zu teuer. Wäre es den nicht das einfachste den code von rustdesk vor dem erstelle über github zu ändern? evtl. könnte man rausfinden wo zum einen das “Verbindung aufbauen fenster” eingebaut ist, zum anderen die Einstellungen/Netzwerk wo der der eigene key und server angezeigt wird und beides einfach ausblenden?

  8. Greg

    Danke für den Tweak – das klingt sehr spannend – stehe allerdings auf dem Schlauch.

    Mit der Angabe von Host und PKey im Dateinamen, gibst du in der Syntax fürs CMD auf einmal ….exe.7zip an -> wie kommt das zu Stande? Was fehlt mir hier genau?

    Mit oder ohne 7zip (meine Datei heisst ja noch rustdesk-host=xxx,key=xxx,.exe

    erhalte ich im CMD “Syntax error” -> Powershell meldet:
    Copy-Item: A positional parameter cannot be found that accepts argument ‘+’.

    Danke um Rückmeldung im Voraus

    Gruss

    Greg

  9. Greg

    Pardon, hat sich erledigt. In der Anleitung fehlt die Info, dass aus dem neu-benannten .exe File noch ein 7z draus gepackt werden muss 🙂

    Gruss

  10. Litschi

    Ich bin mit einem AutoIt Script (nicht meine bevorzugte Sprache, deswegen kann der Code bestimmt noch optimiert werden) einmal einen anderen Weg gegangen, der mir schon einiges an Zeit gespart hat. Das Script wird zur EXE kompiliert und den Usern dann zum Download angeboten. Bei etlichen Installationen hat es bisher (fast) problemlos funktioniert, nur bei einigen Systemen wird das permanente Kennwort in der rustdesk.toml einfach wieder überschrieben… Hierfür habe ich noch keine Lösung gefunden. So schlimm ist das aber nicht, denn die Konfiguration kann remote geändert werden, der User muss nur einmal die Sitzung akzeptieren.
    Momentan läuft das Script im Erfolgsfall ohne Meldungen durch, was manchen User irritieren könnte. Da ich es meist in Firmenumgebungen einsetze, informiere ich die Anwender vorher darüber.
    Vielleicht könnt ihr es ja nutzen, nachfolgend das Script mit Kommentaren im Code.
    ————————————–
    ; ==================================================
    ; RustDesk Installer von Litschi [Litschi.de]
    ; Dieses Script steht zur freien Verwendung (Public Domain).
    ; Gebrauch auf eigene Gefahr.
    ; ————————————————–
    ; Vor der Anwendung:
    ; – Passen Sie in Abschnitt 2 und 3 die Werte für Rustdesk.toml und Rustdesk2.toml an.
    ; Die dort gezeigten Werte sind nur Platzhalter.
    ; – Tragen Sie in Abschnitt 4 die URL des RustDesk-Setup-Programms ein.
    ; – In Abschnitt 7 konfigurieren Sie Ihre SMTP-Server-Parameter,
    ; falls Sie eine E-Mail-Benachrichtigung erhalten möchten.
    ; ————————————————–
    ; Funktionsweise:
    ; 1. Das Script erstellt zwei Dateien in %appdata%Rustdeskconfig
    ; und sichert vorhandene Dateien vorher als Backup.
    ; 2. Die erzeugten TOML-Dateien werden schreibgeschützt.
    ; 3. Der RustDesk-Installer wird aus dem Internet heruntergeladen und gestartet.
    ; (Eventuell muss der Benutzer UAC-Berechtigungen bestätigen.)
    ; 4. Nach der Installation entfernt das Script das RustDesk-Desktop-Icon
    ; und löscht die heruntergeladene Installationsdatei.
    ; 5. Anschließend sendet das Script per E-Mail die RustDesk-ID und PC-Informationen.
    ; 6. Der Schreibschutz der beiden TOML-Dateien wird wieder aufgehoben.
    ; 7. Zum Schluss löscht sich die kompiliertierte EXE-Datei selbst.
    ;
    ; Detaillierte Hinweise finden Sie direkt im Quellcode.
    ; ==================================================

    #include
    #include
    #include

    ; Hilfsfunktion: Backup einer vorhandenen Datei mit Zeitstempel
    Func _BackupIfExists($sFilePath)
    If FileExists($sFilePath) Then
    Local $sTimestamp = @YEAR & @MON & @MDAY & “_” & @HOUR & @MIN & @SEC
    Local $sDir = StringRegExpReplace($sFilePath, “(.*\)(.*$)”, “1”)
    Local $sName = StringRegExpReplace($sFilePath, “(.*\)(.*).(.*)$”, “2”)
    Local $sExt = StringRegExpReplace($sFilePath, “(.*\)(.*).(.*)$”, “3”)
    Local $sBackup = $sDir & $sName & “_” & $sTimestamp & “.” & $sExt
    If Not FileMove($sFilePath, $sBackup) Then
    MsgBox($MB_ICONERROR, “Fehler”, “Konnte Backup nicht erstellen:” & @CRLF & $sFilePath)
    Exit
    EndIf
    EndIf
    EndFunc

    ; ==================================================
    ; 1. Config-Verzeichnis anlegen
    ; ==================================================
    Local $sConfigDir = @AppDataDir & “RustDeskconfig”
    If Not FileExists($sConfigDir) Then
    If Not DirCreate($sConfigDir) Then
    MsgBox($MB_ICONERROR, “Fehler”, “Konnte Konfigurationsordner nicht erstellen:” & @CRLF & $sConfigDir)
    Exit
    EndIf
    EndIf

    ; ==================================================
    ; 2. Rustdesk.toml erstellen
    ; ==================================================
    Local $sFile1 = $sConfigDir & “Rustdesk.toml”
    _BackupIfExists($sFile1)
    Local $h1 = FileOpen($sFile1, 1)
    If $h1 = -1 Then
    MsgBox($MB_ICONERROR, “Fehler”, “Schreibfehler: ” & $sFile1)
    Exit
    EndIf

    ; Daten eintragen
    FileWriteLine($h1, “enc_id = ‘EIGENE DATEN EINGEBEN'”)
    FileWriteLine($h1, “password = ‘EIGENE DATEN EINGEBEN'”)
    FileWriteLine($h1, “salt = ‘EIGENE DATEN EINGEBEN'”)
    FileWriteLine($h1, “key_pair = [“)
    FileWriteLine($h1, ” [“)
    Local $a1 = [203,86,132,208,246,219,244,44,23,5,55,104,220,227,202,117,18,62,38,94,97,91,213,21,170,188,248,247,53,228,331,92,239,209,193,93,51,130,154,242,35,125,214,217,10,51,2,255,255,193,143,116,128,190,251,29,22,58,208,72,63,160,91,29]
    For $i In $a1
    FileWriteLine($h1, ” ” & $i & “,”)
    Next
    FileWriteLine($h1, ” ],”)
    FileWriteLine($h1, ” [“)
    Local $a2 = [239,209,193,93,51,130,154,242,35,125,214,217,10,51,2,255,255,193,143,116,128,190,251,29,242,158,208,572,63,160,91,829]
    For $i In $a2
    FileWriteLine($h1, ” ” & $i & “,”)
    Next
    FileWriteLine($h1, ” ]”)
    FileWriteLine($h1, “]”)
    FileWriteLine($h1, “key_confirmed = true”)
    FileWriteLine($h1, “”)
    FileWriteLine($h1, “[keys_confirmed]”)
    FileWriteLine($h1, “rs-cn = true”)
    FileWriteLine($h1, “rs-sg = true”)
    FileWriteLine($h1, “””0.0.0.0:21116″” = true”)
    FileWriteLine($h1, “””0.0.0.0″” = true”)
    FileWriteLine($h1, “rs-ny = true”)
    FileClose($h1)
    ; Datei schreibgeschützt setzen
    FileSetAttrib($sFile1, “+R”)

    ; ==================================================
    ; 3. RustDesk2.toml erstellen
    ; ==================================================
    Local $sFile2 = $sConfigDir & “RustDesk2.toml”
    _BackupIfExists($sFile2)
    Local $h2 = FileOpen($sFile2, 1)
    If $h2 = -1 Then
    MsgBox($MB_ICONERROR, “Fehler”, “Schreibfehler: ” & $sFile2)
    Exit
    EndIf
    ; Inhalte Zeile für Zeile
    FileWriteLine($h2, “rendezvous_server = ‘0.0.0.0:21116′”)
    FileWriteLine($h2, “nat_type = 2”)
    FileWriteLine($h2, “serial = 0”)
    FileWriteLine($h2, “unlock_pin = ””)
    FileWriteLine($h2, “trusted_devices = ‘EIGENE DATEN EINGEBEN'”)
    FileWriteLine($h2, “”)
    FileWriteLine($h2, “[options]”)
    FileWriteLine($h2, “custom-rendezvous-server = ‘0.0.0.0’”)
    FileWriteLine($h2, “av1-test = ‘N'”)
    FileWriteLine($h2, “direct-server = ‘Y'”)
    FileWriteLine($h2, “relay-server = ‘0.0.0.0’”)
    FileWriteLine($h2, “allow-remote-config-modification = ‘Y'”)
    FileWriteLine($h2, “key = ‘EIGENE DATEN EINGEBEN'”)
    FileWriteLine($h2, “local-ip-addr = ‘0.0.0.0’”)
    FileWriteLine($h2, “verification-method = ‘use-permanent-password'”)
    FileClose($h2)
    ; Datei schreibgeschützt setzen
    FileSetAttrib($sFile2, “+R”)
    ; ==================================================
    ; 4. Installer herunterladen und ausführen
    ; ==================================================
    Local $sURL = “https://github.com/rustdesk/rustdesk/releases/download/1.4.0/rustdesk-1.4.0-x86_64.exe”
    Local $sFileName = StringRegExpReplace($sURL, “.*/(.+)$”, “1”)
    Local $sTempFile = @TempDir & “” & $sFileName

    ; Download (ForceReload im Hintergrund)
    Local $hDL = InetGet($sURL, $sTempFile, $INET_FORCERELOAD, $INET_DOWNLOADBACKGROUND)
    If @error Or $hDL = 0 Then
    MsgBox($MB_ICONERROR, “Download-Fehler”, “Konnte Download nicht starten:” & @CRLF & $sURL)
    Exit
    EndIf
    While InetGetInfo($hDL, $INET_DOWNLOADCOMPLETE) = 0
    Sleep(250)
    WEnd
    InetClose($hDL)

    ; Prüfen
    If Not FileExists($sTempFile) Then
    MsgBox($MB_ICONERROR, “Fehler”, “Installationsdatei fehlt:” & @CRLF & $sTempFile)
    Exit
    EndIf

    ; Silent-Install starten und 30 Sekunden warten
    Run(‘”‘ & $sTempFile & ‘” –silent-install’, “”, @SW_HIDE)
    Sleep(30000)

    ; Public-Desktop-Verknüpfung löschen
    Local $sLink = EnvGet(“PUBLIC”) & “Desktoprustdesk.lnk”
    If FileExists($sLink) Then FileDelete($sLink)

    ; Installer selbst löschen
    If FileExists($sTempFile) Then FileDelete($sTempFile)

    ; ==================================================
    ; 5. RustDesk-ID per StdoutRead ermitteln
    ; ==================================================
    ; mögliche Installationspfade ermitteln
    Local $sPath1 = EnvGet(“ProgramW6432”) & “RustDeskrustdesk.exe” ; C:Program FilesRustDesk
    Local $sPath2 = EnvGet(“ProgramFiles(x86)”) & “RustDeskrustdesk.exe” ; C:Program Files (x86)RustDesk
    Local $sExe = “”

    If FileExists($sPath1) Then
    $sExe = $sPath1
    ElseIf FileExists($sPath2) Then
    $sExe = $sPath2
    Else
    MsgBox($MB_ICONERROR, “Fehler”, _
    “RustDesk wurde nicht gefunden. Ich habe gesucht in:” & @CRLF & _
    $sPath1 & @CRLF & $sPath2)
    Exit
    EndIf

    ; Run mit stdout/err Redirect
    Local $iPID = Run(‘”‘ & $sExe & ‘” –get-id’, “”, @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
    If @error Or $iPID = 0 Then
    MsgBox($MB_ICONERROR, “Fehler”, “Konnte RustDesk nicht starten oder Redirect fehlgeschlagen.”)
    Exit
    EndIf

    ; max. 10s warten
    If Not ProcessWait($iPID, 10000) Then
    MsgBox($MB_ICONERROR, “Fehler”, “RustDesk hat nicht in 10 Sekunden geantwortet.”)
    ProcessClose($iPID)
    Exit
    EndIf

    ; Ausgabe einlesen
    Local $sOutput = “”, $sLine
    While True
    $sLine = StdoutRead($iPID)
    If @error Then ExitLoop
    $sOutput &= $sLine
    WEnd

    ; Prozess schließen, falls noch offen
    If ProcessExists($iPID) Then ProcessClose($iPID)

    ; Ergebnis trimmen und prüfen
    Local $rustdesk_id = StringStripWS($sOutput, 3)
    If $rustdesk_id = “” Then
    MsgBox($MB_ICONERROR, “Fehler”, “Keine ID erhalten – Ausgabe war leer.”)
    Exit
    EndIf

    ; $rustdesk_id enthält die ID

    ; ==================================================
    ; 6. Benutzer-, Rechnername und ID in Variable
    ; ==================================================
    Local $sUser = @UserName
    Local $sComputer = @ComputerName

    ; Datei mit Info (wird nur einmal gelesen)
    Local $sInfoFile = @TempDir & “rustdesk_info.txt”
    Local $hInfo = FileOpen($sInfoFile, 2)
    If $hInfo = -1 Then
    MsgBox($MB_ICONERROR, “Fehler”, “Konnte Info-Datei nicht erstellen:” & @CRLF & $sInfoFile)
    Exit
    EndIf
    FileWriteLine($hInfo, “Benutzer: ” & $sUser)
    FileWriteLine($hInfo, “Rechnername: ” & $sComputer)
    FileWriteLine($hInfo, “RustDesk-ID: ” & $rustdesk_id)
    FileClose($hInfo)

    ; Einlesen für Mail-Body und Datei löschen
    Local $rustdesk_info = “”
    Local $hInfoRead = FileOpen($sInfoFile, 0)
    If $hInfoRead -1 Then
    $rustdesk_info = FileRead($hInfoRead)
    FileClose($hInfoRead)
    EndIf
    FileDelete($sInfoFile)

    ; ================================================
    ; 7. E-Mail per PowerShell/.NET-SMTP senden (über .ps1)
    ; ================================================

    ; (a) Konfiguration
    Local $sServer = “SMTP Server eintragen”
    Local $iPort = 587
    Local $bSSL = True
    Local $sUser = “Benutzername (E-Mail) eintragen”
    Local $sPass = “Passwort eintragen”
    Local $sFrom = “Absender E-Mailadresse eintragen”
    Local $sTo = “Empfänger E-Mailadresse eintragen”
    Local $sSubject = “RustDesk installiert bei ” & @ComputerName
    Local $sBody = “Hallo,” & @CRLF & @CRLF & $rustdesk_info & @CRLF

    ; (b) PS1-Datei erzeugen
    Local $sPS1 = @TempDir & “sendmail.ps1”
    Local $hPS1 = FileOpen($sPS1, 2)
    If $hPS1 = -1 Then
    MsgBox($MB_ICONERROR, “Fehler”, “Konnte PS1-Datei nicht erstellen: ” & $sPS1)
    Exit
    EndIf

    ; Powershell-Skript
    FileWriteLine($hPS1, ‘$subject = ‘ & ConvertToPSString($sSubject))
    FileWriteLine($hPS1, ‘$body = ‘ & ConvertToPSString($sBody))
    FileWriteLine($hPS1, ‘$msg = New-Object System.Net.Mail.MailMessage(‘ & _
    ConvertToPSString($sFrom) & ‘,’ & ConvertToPSString($sTo) & ‘,$subject,$body)’)
    FileWriteLine($hPS1, ‘$smtp = New-Object System.Net.Mail.SmtpClient(‘ & ConvertToPSString($sServer) & ‘,’ & $iPort & ‘)’)
    FileWriteLine($hPS1, ‘$smtp.EnableSsl = ‘ & ($bSSL ? ‘$true’ : ‘$false’))
    FileWriteLine($hPS1, ‘$smtp.Credentials = New-Object System.Net.NetworkCredential(‘ & _
    ConvertToPSString($sUser) & ‘,’ & ConvertToPSString($sPass) & ‘)’)
    FileWriteLine($hPS1, ‘$smtp.Send($msg)’)

    FileClose($hPS1)

    ; (c) PS1 aufrufen und Fehlercode + Ausgabe abfangen
    Local $sCmd = @ComSpec & ‘ /C powershell -NoProfile -ExecutionPolicy Bypass -File “‘ & $sPS1 & ‘”‘
    Local $iPID = Run($sCmd, “”, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    Local $sOutput = “”
    While True
    Local $sLine = StdoutRead($iPID)
    If @error Then ExitLoop
    $sOutput &= $sLine
    WEnd
    ProcessWaitClose($iPID)
    Local $iExit = @error

    ; (d) Aufräumen
    FileDelete($sPS1)

    ; (e) Auswertung
    If $iExit = 0 Then
    ;MsgBox($MB_ICONINFORMATION, “Mail versendet”, “E-Mail erfolgreich an ” & $sTo)
    Else
    MsgBox($MB_ICONERROR, “Fehler beim Mailversand”, _
    “PowerShell-Fehlercode: ” & $iExit & @CRLF & “Ausgabe: ” & @CRLF & $sOutput)
    EndIf

    ; Zum Schluss: Schreibschutz der TOML-Dateien wieder aufheben
    FileSetAttrib($sFile1, “-R”)
    FileSetAttrib($sFile2, “-R”)

    ; Hilfsfunktion PowerShell
    Func ConvertToPSString($s)
    ; einfache Single-Quote-Escape: ‘ wird zu ”
    Local $t = StringReplace($s, “‘”, “””)
    Return “‘” & $t & “‘”
    EndFunc

    ; Wir löschen diese EXE einfach vom User PC
    ; Da kann der Virenscanner meckern 🙂
    Local $sMe = ‘”‘ & @ScriptFullPath & ‘”‘ ; Vollständiger Pfad zur laufenden EXE, in Anführungszeichen
    ; Startet einen versteckten CMD-Prozess, wartet mit „ping“ 5 Sekunden und löscht danach die EXE
    Run(@ComSpec & ‘ /C ping -n 5 127.0.0.1 >NUL & del ‘ & $sMe, “”, @SW_HIDE)
    Exit

  11. Litschi

    Hier die includes für obiges Script, da sind sie irgendwie verloren gegangen.

    #include
    #include
    #include

  12. Gerhard Kimmeringer

    Habe jetzt auch ewig herumprobiert. Leider ging der Defender immer davon aus dass es sich um einen Virus handelte und er hat es einfach gelöscht.
    Ich habe das ganze jetzt mit Innosetup verpackt, jetzt wird es halt Fix auf dem Rechner installiert aber es geht jetzt zum Downloaden und Installieren. Einziger Wermutstropfen ist natürlich dass bestätigt werden muss “Trotzdem Downloaden”.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

© 2025 Andy's Blog

Theme von Anders NorénHoch ↑