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:
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.

Verheiratet, Vater von zwei Kindern, eines an der Hand, eines im Herzen. Schon immer Technik-Freund, seit 2001 in der IT tätig und seit über 15 Jahren begeisterter Blogger. Mit meiner Firma IT-Service Weber kümmern wir uns um alle IT-Belange von gewerblichen Kunden und unterstützen zusätzlich sowohl Partner als auch Kollegen.





XING











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
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.
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.
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.
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.
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
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?
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
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
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
Hier die includes für obiges Script, da sind sie irgendwie verloren gegangen.
#include
#include
#include
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”.