AutoIt Script für eine erweiterte RustDesk Installation unter Windows

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%\Rustdesk\config
; 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 <MsgBoxConstants.au3>
#include <InetConstants.au3>
#include <AutoItConstants.au3>

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

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

; ==================================================
; 2. Rustdesk.toml erstellen
; ==================================================
Local $sFile1 = $sConfigDir &amp; "\Rustdesk.toml"
_BackupIfExists($sFile1)
Local $h1 = FileOpen($sFile1, 1)
If $h1 = -1 Then
MsgBox($MB_ICONERROR, "Fehler", "Schreibfehler: " &amp; $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, " " &amp; $i &amp; ",")
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, " " &amp; $i &amp; ",")
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 &amp; "\RustDesk2.toml"
_BackupIfExists($sFile2)
Local $h2 = FileOpen($sFile2, 1)
If $h2 = -1 Then
MsgBox($MB_ICONERROR, "Fehler", "Schreibfehler: " &amp; $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 &amp; "" &amp; $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:" &amp; @CRLF &amp; $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:" &amp; @CRLF &amp; $sTempFile)
Exit
EndIf

; Silent-Install starten und 30 Sekunden warten
Run('"' &amp; $sTempFile &amp; '" --silent-install', "", @SW_HIDE)
Sleep(30000)

; Public-Desktop-Verknüpfung löschen
Local $sLink = EnvGet("PUBLIC") &amp; "\Desktop\rustdesk.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") &amp; "\RustDesk\rustdesk.exe" ; C:\Program Files\RustDesk
Local $sPath2 = EnvGet("ProgramFiles(x86)") &amp; "\RustDesk\rustdesk.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:" &amp; @CRLF &amp; _
$sPath1 &amp; @CRLF &amp; $sPath2)
Exit
EndIf

; Run mit stdout/err Redirect
Local $iPID = Run('"' &amp; $sExe &amp; '" --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 &amp;= $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 &amp; "\rustdesk_info.txt"
Local $hInfo = FileOpen($sInfoFile, 2)
If $hInfo = -1 Then
MsgBox($MB_ICONERROR, "Fehler", "Konnte Info-Datei nicht erstellen:" &amp; @CRLF &amp; $sInfoFile)
Exit
EndIf
FileWriteLine($hInfo, "Benutzer: " &amp; $sUser)
FileWriteLine($hInfo, "Rechnername: " &amp; $sComputer)
FileWriteLine($hInfo, "RustDesk-ID: " &amp; $rustdesk_id)
FileClose($hInfo)

; Einlesen für Mail-Body und Datei löschen
Local $rustdesk_info = ""
Local $hInfoRead = FileOpen($sInfoFile, 0)
If $hInfoRead &lt;&gt; -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 " &amp; @ComputerName
Local $sBody = "Hallo," &amp; @CRLF &amp; @CRLF &amp; $rustdesk_info &amp; @CRLF

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

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

FileClose($hPS1)

; (c) PS1 aufrufen und Fehlercode + Ausgabe abfangen
Local $sCmd = @ComSpec &amp; ' /C powershell -NoProfile -ExecutionPolicy Bypass -File "' &amp; $sPS1 &amp; '"'
Local $iPID = Run($sCmd, "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
Local $sOutput = ""
While True
Local $sLine = StdoutRead($iPID)
If @error Then ExitLoop
$sOutput &amp;= $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 " &amp; $sTo)
Else
MsgBox($MB_ICONERROR, "Fehler beim Mailversand", _
"PowerShell-Fehlercode: " &amp; $iExit &amp; @CRLF &amp; "Ausgabe: " &amp; @CRLF &amp; $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 "'" &amp; $t &amp; "'"
EndFunc

; Wir löschen diese EXE einfach vom User PC
; Da kann der Virenscanner meckern :-)
Local $sMe = '"' &amp; @ScriptFullPath &amp; '"' ; 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 &amp; ' /C ping -n 5 127.0.0.1 &gt;NUL &amp; del ' &amp; $sMe, "", @SW_HIDE)
Exit

Kommentar verfassen

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

Nach oben scrollen