#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Icon=Rustdesk-Master.ico #AutoIt3Wrapper_Res_Description=RustDesk Host Inventory Manager #AutoIt3Wrapper_Res_Fileversion=1.0.0.20 #AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y #AutoIt3Wrapper_Res_LegalCopyright=Stefan Kressirer 2024 #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.16.1 Author: Stefan Kressirer - IT Solutions Script Function: Bookmark-Manager for multiple RustDesk-Servers ************************************************************** !!!!! just for RustDesk 1.2.4 and above !!!! ************************************************************** .. put "rustdesk.exe" just in the same directory of de compiled RustDesk-Manager.exe or change Path in Settings #ce ---------------------------------------------------------------------------- #NoTrayIcon Opt("WinTitleMatchMode", 3) Opt("TrayMenuMode", 3) $gvCopyright = "Stefan Kressirer © 2024" ; Script Start - Add your code below here #include #include #include #include #include #include #include #include #include #include #include #include #include $gvProgramPortable = 0 $gvRustDeskMaster_SaveClientPass = False $gvRustDeskMaster_RegPath = "HKEY_CURRENT_USER\Software\RustDesk-Master" If $gvProgramPortable = 1 Then $gvDirData = @ScriptDir & "\Data" Else $gvDirData = @AppDataDir & "\RustDesk-Master\Data" EndIf ; Config-Dir $gvDirConfig = RegRead($gvRustDeskMaster_RegPath, "ConfigDir") if $gvDirConfig = "" Then $gvDirConfigTemp = FileSelectFolder("Please select a Folder for the Config-Files", "") if $gvDirConfigTemp <> "" Then RegWrite($gvRustDeskMaster_RegPath, "ConfigDir", "REG_SZ", $gvDirConfigTemp) $gvDirConfig = RegRead($gvRustDeskMaster_RegPath, "ConfigDir") Else Exit EndIf EndIf ConsoleWrite("Config-Dir: " & $gvDirConfig & @CRLF) ConsoleWrite("File directory: " & $gvDirData & @CRLF) $gvIniSettings = $gvDirConfig & "\RustDesk.ini" $gvIniServer = $gvDirConfig & "\RustDesk-Server.ini" $gvIniClients = $gvDirConfig & "\RustDesk-Clients.ini" ;save Client Passwords ? $gvClientSettings = IniRead($gvIniSettings, "General", "ClientPassSave", "0") if $gvClientSettings = 1 Then $gvRustDeskMaster_SaveClientPass = True Else $gvRustDeskMaster_SaveClientPass = False EndIf ;Rustdesk-Exe $gvExeRustDesk = RegRead($gvRustDeskMaster_RegPath, "RustDeskExe") If FileExists($gvExeRustDesk) = 0 Then $gvExeRustDesk = _fRustDesk_FindRustDeskExe() EndIf ConsoleWrite("RustDesk-Exe: " & $gvExeRustDesk & @CRLF) #Region ### START Koda GUI section ### $fRustDesk = GUICreate("RustDesk-Master", 370, 509) GUISetFont(12, 400, 0, "Trebuchet MS") GUISetBkColor(0xFFFFFF) $btConnect = GUICtrlCreateButton(" connect", 8, 392, 355, 57) $tvList = GUICtrlCreateTreeView(8, 48, 353, 337) $btAddClient = GUICtrlCreateButton(" add Client", 139, 5, 115, 32, $BS_CENTER) $sbStatus = _GUICtrlStatusBar_Create($fRustDesk) $btAddServer = GUICtrlCreateButton(" add Server", 11, 5, 115, 32, $BS_CENTER) $btMakeDonation = GUICtrlCreateButton(" donate via PayPal©", 200, 456, 163, 28, $BS_LEFT) GUICtrlSetFont(-1, 10, 400, 0, "Trebuchet MS") $btSettingsGeneral = GUICtrlCreateButton("", 324, 8, 35, 28, $BS_CENTER) GUICtrlSetImage($btAddServer, "shell32.dll", 14, 0) GUICtrlSetImage($btAddClient, "shell32.dll", 16, 0) GUICtrlSetImage($btConnect, "shell32.dll", 160) GUICtrlSetStyle($btSettingsGeneral, $BS_ICON) GUICtrlSetImage($btSettingsGeneral, "shell32.dll", 16826, 0) GUICtrlSetImage($btMakeDonation, "shell32.dll", 16793, 0) ; defaults to 1 part, no text Local $aParts[2] = [200, -1] _GUICtrlStatusBar_SetParts($sbStatus, $aParts) _GUICtrlStatusBar_SetText($sbStatus, $gvCopyright, 1) $cmTreeViewMenu = GUICtrlCreateContextMenu($tvList) $btTreeViewMenu_EditItem = GUICtrlCreateMenuItem("edit Item", $cmTreeViewMenu) ;GUICtrlSetState(, $GUI_HIDE) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### ; Ask for MasterPassCrypt and check validity $vMsgPass = "please be carefull to enter everytime the same encryption password.. " $gvMasterPass = InputBox("RustDesk-Master", $vMsgPass, "", "*", 220, 150 ) ; exit without MasterPassCrypt $gvMasterPass_FirstLetterCheck = "" if $gvMasterPass = "" Then Exit EndIf $gvProgramCancel = False $gvMasterPassCheck = False Do $gvMasterPass_FirstLetterCheck = StringLeft($gvMasterPass, 1) ;Check validity of MasterpassCrypt $gvTestStringEncrypted = IniRead($gvIniSettings, "General", "TestCrypt", "") if $gvTestStringEncrypted = "" Then IniWrite($gvIniSettings, "General", "TestCrypt", _Crypt_EncryptData($gvMasterPass_FirstLetterCheck, $gvMasterPass, $CALG_RC4)) $gvTestStringEncrypted = IniRead($gvIniSettings, "General", "TestCrypt", "") EndIf $gvTestString = BinaryToString(_Crypt_DecryptData($gvTestStringEncrypted, $gvMasterPass, $CALG_RC4)) ;Check first letter if $gvTestString = $gvMasterPass_FirstLetterCheck Then $gvMasterPassCheck = True Else ;ask again $gvMasterPass = InputBox("RustDesk-Master", "Password seems to be wrong." & @CRLF & @CRLF & $vMsgPass, "", "*", 220, 170) $gvMasterPassCheck = @error EndIf Until $gvMasterPassCheck = True or $gvProgramCancel = True ; input canceled then stop running if $gvProgramCancel = True Then Exit EndIf Local $hImageList = _GUIImageList_Create(16, 16, 5, 3) _GUIImageList_AddIcon($hImageList, "shell32.dll", 164) ; Foreign Server _GUIImageList_AddIcon($hImageList, "shell32.dll", 88) ; Local Server _GUIImageList_AddIcon($hImageList, "shell32.dll", 15) ; Client _GUIImageList_AddIcon($hImageList, "shell32.dll", 112) ; Offline _GUIImageList_AddIcon($hImageList, "shell32.dll", 18) ; Multidisplay _GUIImageList_AddIcon($hImageList, "shell32.dll", 238) ; Connect _GUICtrlTreeView_SetNormalImageList($tvList, $hImageList) ; read values from database _fRustDesk_TreeviewRefresh($tvList) Global $gvTimerHostinfo _Timer_SetTimer($gvTimerHostinfo, 0) Global $gvTimerServerinfo _Timer_SetTimer($gvTimerServerinfo, 0) Global $gvTempSek While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_MINIMIZE ; Hide the GUI GUISetState(@SW_HIDE) ; Show the icon TraySetState(1) Case $GUI_EVENT_CLOSE Exit Case $btConnect GUICtrlSetState($btConnect, $GUI_DISABLE) $gvHost = IniRead($gvIniClients, GUICtrlRead($tvList, 1), "ID", "-") $gvHost = BinaryToString(_Crypt_DecryptData($gvHost, $gvMasterPass, $CALG_RC4)) $gvHost = StringReplace($gvHost," ","") if $gvRustDeskMaster_SaveClientPass = True Then $gvHostPass = IniRead($gvIniClients, GUICtrlRead($tvList, 1), "Password", "-") If $gvHostPass <> "-" Then $gvHostPass = BinaryToString(_Crypt_DecryptData($gvHostPass, $gvMasterPass, $CALG_RC4)) EndIf EndIf $gvServerDisplayName = IniRead($gvIniClients, GUICtrlRead($tvList, 1), "Server", "-") $gvServer = IniRead($gvIniServer, $gvServerDisplayName, "Host", "-") $gvServer = BinaryToString(_Crypt_DecryptData($gvServer, $gvMasterPass, $CALG_RC4)) $gvServerAPIKey = IniRead($gvIniServer, $gvServerDisplayName, "API-Key", "-") $gvServerAPIKey = BinaryToString(_Crypt_DecryptData($gvServerAPIKey, $gvMasterPass, $CALG_RC4)) $gvServerLocal = IniRead($gvIniServer, $gvServerDisplayName, "Local", "0") _GUICtrlStatusBar_SetText($sbStatus, "connect to ID: " & $gvHost, 0) ; start connection _fRustDesk_Connect($gvHost, $gvServer, $gvServerAPIKey, $gvServerLocal) if $gvRustDeskMaster_SaveClientPass = True Then If $gvHostPass <> "-" Then ;InputBox("RustDesk-Master", "Passwort: ", $gvHostPass) ClipPut($gvHostPass) EndIf EndIf Sleep(500) GUICtrlSetState($btConnect, $GUI_ENABLE) Case $btAddServer _fRustDesk_Server_New($tvList) Case $btAddClient _fRustDesk_Client_New($tvList) Case $btSettingsGeneral GUISetState(@SW_HIDE, $fRustDesk) GUISetState(@SW_DISABLE, $fRustDesk) _fRustDesk_FormSettings() GUISetState(@SW_ENABLE, $fRustDesk) GUISetState(@SW_SHOW, $fRustDesk) Case $btMakeDonation ShellExecute("https://www.paypal.com/donate/?hosted_button_id=RJQGH44VGCU7N") Case $btTreeViewMenu_EditItem ; Edit Server or Client ? $gvItemName = GUICtrlRead($tvList, 1) $gvItemHandle = _GUICtrlTreeView_GetSelection($tvList) $gvItemIndex = _GUICtrlTreeView_Index($tvList, $gvItemHandle) $gvItemImageIndex = _GUICtrlTreeView_GetImageIndex($tvList, $gvItemHandle) ;$gvItemHandle = GUICtrlRead($tvList) $gvItemType = 0 ; 1=Server, 2=Client if $gvItemImageIndex = 2 Then; no Parent ? -> Server $gvItemType = 2 ; Client Else $gvItemType = 1 ; Server EndIf ConsoleWrite("Edit Item: " & $gvItemName & ", Handle: " & $gvItemHandle & ", Index: " & $gvItemIndex & ", ImageIdx: " & $gvItemImageIndex & ", Type: " & $gvItemType & @CRLF) GUISetState(@SW_HIDE, $fRustDesk) GUISetState(@SW_DISABLE, $fRustDesk) if $gvItemType <> 0 Then if $gvItemType = 1 Then _fRustDesk_FormServer($gvItemName) ElseIf $gvItemType = 2 Then _fRustDesk_FormClient($gvItemName) EndIf _fRustDesk_TreeviewRefresh($tvList) EndIf GUISetState(@SW_ENABLE, $fRustDesk) GUISetState(@SW_SHOW, $fRustDesk) EndSwitch Switch TrayGetMsg() Case $TRAY_EVENT_PRIMARYDOUBLE GUISetState(@SW_SHOW) ; Hide the icon Opt("TrayIconHide", 1) EndSwitch ;execute all ~5 seconds if mod(@SEC,15) = 0 And $gvTempSek <> @SEC Then _GUICtrlStatusBar_SetText($sbStatus, "", 0) $gvTempSek = @SEC EndIf WEnd Func _fRustDesk_Connect($eHostID, $eServer, $eAPIKey, $eServerLocal) Local $lvParams ; Local means the Remote Client is connected to the same Server-Instance (for external Servers, the API-Key need to be provided when connecting if $eServerLocal = 0 Then $lvParams = "--connect " & $eHostID & "@" & $eServer & "?key=" & $eAPIKey Else $lvParams = "--connect " & $eHostID EndIf ConsoleWrite("Parameter: " & $lvParams & @CRLF) ;Key-Error if RustDesk local Window is running if WinExists("RustDesk") Then ConsoleWrite("Window 'RustDesk' exists -> close it" & @CRLF) WinClose("RustDesk", "FLUTTERVIEW") WinWaitClose("RustDesk", "FLUTTERVIEW") EndIf if FileExists($gvExeRustDesk) Then ; start Connection ShellExecute($gvExeRustDesk, $lvParams) Else _GUICtrlStatusBar_SetText($sbStatus, "'rustdesk.exe' not found.", 0) EndIf EndFunc Func _fRustDesk_Server_New($eTreeView) Local $lvOK = True Local $lvServerDisplayname Local $lvServerDNSorIP Local $lvServerAPIKey Local $lvServerLocal Local $lvServerDisplayname = InputBox("Add Server..", "Displayname:", "", " M", 220, 135) if @error = 0 Then $lvServerDNSorIP = InputBox("Add Server..", "DNS-Name or IP:", "", " M", 220, 135) if @error = 0 Then $lvServerAPIKey = InputBox("Add Server..", "API-Key:", "", " M", 220, 135) if @error = 0 Then $lvServerLocal = InputBox("Add Server..", "for local instance put 1 for external Server (different API-Key than own Client) put 0", "0", " M", 220, 150) if @error > 0 Then $lvOK = False If $lvServerLocal <> 1 Then $lvServerLocal = 0 EndIf ;Abfrage If $lvOK = True Then $return_value = MsgBox(36, "Overview", "Displayname: " & $lvServerDisplayname & @CRLF & _ "DNS or IP: " & $lvServerDNSorIP & @CRLF & _ "API-Key: " & $lvServerAPIKey & @CRLF & _ "Local: " & $lvServerLocal & @CRLF & @CRLF & @CRLF & " .. add ?") If $return_value = 6 Then ;write ini-file IniWrite($gvIniServer, $lvServerDisplayname, "Host", _Crypt_EncryptData($lvServerDNSorIP, $gvMasterPass, $CALG_RC4)) IniWrite($gvIniServer, $lvServerDisplayname, "API-Key", _Crypt_EncryptData($lvServerAPIKey, $gvMasterPass, $CALG_RC4)) IniWrite($gvIniServer, $lvServerDisplayname, "Local", $lvServerLocal) _GUICtrlStatusBar_SetText("Server added: '" & $lvServerDisplayname & "'", "", 0) _fRustDesk_TreeviewRefresh($eTreeView) EndIf EndIf EndFunc Func _fRustDesk_Client_New($eTreeView) Local $lvOK = True Local $lvHostDisplayname Local $lvHostID Local $lvHostPass ;selected TreeView item is servername Local $lvServername = GUICtrlRead($eTreeView, 1) ; Proof if selected Item is a Server Local $lvServerDNSorIP = IniRead($gvIniServer, $lvServername, "Host", "") if $lvServerDNSorIP = "" Then _GUICtrlStatusBar_SetText($sbStatus, "No Server selected.", 0) Else $lvClientDisplayname = InputBox("Add Client..", "Displayname:", "", " M", 220, 135) if @error = 0 Then $lvHostID = InputBox("Add Client..", "ID:", "", " M", 220, 135) if $gvRustDeskMaster_SaveClientPass = True Then $lvClientPass = InputBox("Add Client..", "Passwort (optional):", "", "*", 220, 135) if @error > 0 Then $lvOK = False EndIf Else $lvOK = False EndIf if $lvOK = True Then ;Are you sure ? $return_value = MsgBox(36, "Overview", "Displayname: " & $lvClientDisplayname & @CRLF & _ "ID: " & $lvHostID & @CRLF & @CRLF & @CRLF & " .. add ?") If $return_value = 6 Then ;write ini-file IniWrite($gvIniClients, $lvClientDisplayname, "ID", _Crypt_EncryptData($lvHostID, $gvMasterPass, $CALG_RC4)) IniWrite($gvIniClients, $lvClientDisplayname, "Server", $lvServername) _GUICtrlStatusBar_SetText("Client added: '" & $lvClientDisplayname & "'", "", 0) if $gvRustDeskMaster_SaveClientPass = True Then If $lvClientPass <> "" Then IniWrite($gvIniClients, $lvClientDisplayname, "Password", _Crypt_EncryptData($lvClientPass, $gvMasterPass, $CALG_RC4)) EndIf EndIf _fRustDesk_TreeviewRefresh($eTreeView) EndIf EndIf EndIf EndFunc Func _fRustDesk_TreeviewRefresh($eTreeView) Local $lvServerDisplayname Local $lvClientDisplayname Local $lvServerLocalBool Local $lvServerLocal Local $lvClientServer Local $lvClient Local $lvItem ;clear TreeView _GUICtrlTreeView_DeleteAll($eTreeView) $sectionNamesServer = IniReadSectionNames($gvIniServer) If @error = 0 Then $i = 0 if $sectionNamesServer[0] > 0 Then _ArraySort($sectionNamesServer,0, 1) Do $i = $i + 1 $lvServerDisplayname = $sectionNamesServer[$i] if $lvServerDisplayname <> "" Then _GUICtrlTreeView_BeginUpdate($eTreeView) ConsoleWrite("Add Server: " & $lvServerDisplayname & @CRLF) $lvServerLocal = IniRead($gvIniServer, $lvServerDisplayname, "Local", "0") ; Local Server bekommt anderes Icon if $lvServerLocal = 0 Then $lvItem = _GUICtrlTreeView_AddChild($eTreeView, 0, $lvServerDisplayname, 0, 0) Else $lvItem = _GUICtrlTreeView_AddChild($eTreeView, 0, $lvServerDisplayname, 1, 1) EndIf ;search corresponging clients $sectionNamesClients = IniReadSectionNames($gvIniClients) If @error = 0 Then $j = 0 if $sectionNamesClients[0] > 0 Then _ArraySort($sectionNamesClients,0, 1) Do $j = $j + 1 $lvClientDisplayname = $sectionNamesClients[$j] if $lvClientDisplayname <> "" Then $lvClientServer = IniRead($gvIniClients, $lvClientDisplayname, "Server", "-") ; if client fits to server, then add if $lvClientServer == $lvServerDisplayname Then ConsoleWrite(" .. Client: " & $lvClientDisplayname & @CRLF) $lvSubItem = _GUICtrlTreeView_AddChild($eTreeView, $lvItem, $lvClientDisplayname, 2, 2) EndIf EndIf Until $j = $sectionNamesClients[0] EndIf EndIf _GUICtrlTreeView_EndUpdate($eTreeView) _GUICtrlTreeView_Expand($eTreeView) EndIf Until $i = $sectionNamesServer[0] EndIf EndIf EndFunc Func _fRustDesk_FormClient ($eItemName) $fRustDeskClient = GUICreate("RustDesk-Master Client", 368, 178) GUISetFont(11, 400, 0, "Trebuchet MS") $btClientSave = GUICtrlCreateButton(" save", 24, 144, 75, 25, $BS_CENTER) $btClientDel = GUICtrlCreateButton(" delete", 272, 144, 75, 25, $BS_CENTER) $lbClientName = GUICtrlCreateLabel("Client:", 24, 8, 51, 24) GUICtrlSetFont(-1, 11, 800, 0, "Trebuchet MS") $lbClientID = GUICtrlCreateLabel("ID:", 24, 44, 24, 24) GUICtrlSetFont(-1, 11, 800, 0, "Trebuchet MS") $lbClientServer = GUICtrlCreateLabel("Server:", 24, 112, 57, 24) GUICtrlSetFont(-1, 11, 800, 0, "Trebuchet MS") $ipClientName = GUICtrlCreateInput("", 88, 4, 257, 28) $ipClientID = GUICtrlCreateInput("", 88, 40, 209, 28, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER)) $cbClientServerList = GUICtrlCreateCombo("", 88, 108, 257, 25, BitOR($CBS_DROPDOWNLIST,$CBS_AUTOHSCROLL)) $lbClientPass = GUICtrlCreateLabel("Pass:", 24, 77, 39, 24) GUICtrlSetFont(-1, 11, 800, 0, "Trebuchet MS") $ipClientPass = GUICtrlCreateInput("", 88, 75, 209, 28, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER,$ES_PASSWORD)) $btClientPassShow = GUICtrlCreateButton("", 304, 77, 43, 25, $BS_RIGHT) GUICtrlSetTip(-1, "show password") GUICtrlSetImage($btClientSave, "shell32.dll", 16810, 0) GUICtrlSetImage($btClientDel, "shell32.dll", 16777, 0) GUICtrlSetStyle($btClientPassShow, $BS_ICON) GUICtrlSetImage($btClientPassShow, "shell32.dll", 23, 0) Local $lvClientName = $eItemName Local $lvClientID = IniRead($gvIniClients, $eItemName, "ID", "") Local $lvClientPass = IniRead($gvIniClients, $eItemName, "Password", "") ;check if string is already encrypted if StringLeft($lvClientID,2) = "0x" Then $lvClientID = BinaryToString(_Crypt_DecryptData($lvClientID, $gvMasterPass, $CALG_RC4)) EndIf if StringLeft($lvClientPass,2) = "0x" Then $lvClientPass = BinaryToString(_Crypt_DecryptData($lvClientPass, $gvMasterPass, $CALG_RC4)) EndIf Local $lvClientServer = IniRead($gvIniClients, $eItemName, "Server", "") $lvServerList = _ArrayToString(IniReadSectionNames($gvIniServer), '|', 1) GUICtrlSetData($ipClientName, $lvClientName) GUICtrlSetData($ipClientID, $lvClientID) GUICtrlSetData($ipClientPass, $lvClientPass) GUICtrlSetData($cbClientServerList, $lvServerList, $lvClientServer) if $gvRustDeskMaster_SaveClientPass = False Then GUICtrlSetState($ipClientPass, $GUI_DISABLE) GUICtrlSetState($btClientPassShow, $GUI_DISABLE) EndIf GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE ExitLoop Case $btClientPassShow $lvMasterPassVerify = InputBox("RustDesk-Master", "Please verify masterpassword:", "", "*", 220, 130) if $lvMasterPassVerify = $gvMasterPass Then GUICtrlDelete($ipClientPass) $ipClientPass = GUICtrlCreateInput("", 88, 75, 209, 28, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER)) GUICtrlSetData($ipClientPass, $lvClientPass) Else SplashTextOn("RustDesk-Master", "Wrong masterpassword.", 300, 70) Sleep(800) SplashOff() EndIf Case $btClientSave if GUICtrlRead($cbClientServerList) <> "" Then $lvClientName = GUICtrlRead($ipClientName) If $lvClientName <> $eItemName Then IniDelete($gvIniClients, $eItemName) EndIf IniWrite($gvIniClients, $lvClientName, "ID", _Crypt_EncryptData(GUICtrlRead($ipClientID), $gvMasterPass, $CALG_RC4) ) IniWrite($gvIniClients, $lvClientName, "Server", GUICtrlRead($cbClientServerList)) $lvClientPass = GUICtrlRead($ipClientPass) If $gvRustDeskMaster_SaveClientPass = True and $lvClientPass <> "" Then IniWrite($gvIniClients, $lvClientName, "Password", _Crypt_EncryptData($lvClientPass, $gvMasterPass, $CALG_RC4)) EndIf ExitLoop EndIf Case $btClientDel $lvMsgRe = MsgBox(36, "Delete Item", "Do you want to delete this Item ?") if $lvMsgRe = 6 Then IniDelete($gvIniClients, $eItemName) EndIf ExitLoop EndSwitch WEnd GUIDelete($fRustDeskClient) EndFunc Func _fRustDesk_FormServer($eItemName) $fRustDeskServer = GUICreate("RustDesk-Master Server", 368, 186) GUISetFont(11, 400, 0, "Trebuchet MS") $btServerSave = GUICtrlCreateButton(" save", 24, 152, 75, 25, $BS_CENTER) $btServerDel = GUICtrlCreateButton(" delete", 272, 152, 75, 25, $BS_CENTER) $lbServerName = GUICtrlCreateLabel("Server:", 24, 8, 57, 24) GUICtrlSetFont(-1, 11, 800, 0, "Trebuchet MS") $ipServerName = GUICtrlCreateInput("", 88, 4, 257, 28) GUICtrlSetState(-1, $GUI_DISABLE) $lbServerIPHost = GUICtrlCreateLabel("IP/Host:", 24, 45, 59, 24) GUICtrlSetFont(-1, 11, 800, 0, "Trebuchet MS") $ipServerIPHost = GUICtrlCreateInput("", 88, 41, 209, 28) $lbServerAPI = GUICtrlCreateLabel("API-Key:", 24, 81, 65, 24) GUICtrlSetFont(-1, 11, 800, 0, "Trebuchet MS") $ipServerAPI = GUICtrlCreateInput("", 88, 77, 209, 28) $lbServerLocal = GUICtrlCreateLabel("API-Key:", 23, 118, 65, 24) GUICtrlSetFont(-1, 11, 800, 0, "Trebuchet MS") $cbServerLocal = GUICtrlCreateCheckbox("local Server", 96, 120, 97, 17) GUICtrlSetTip(-1, ".. same API-Key than local RustDesk instance") GUICtrlSetImage($btServerSave, "shell32.dll", 16810, 0) GUICtrlSetImage($btServerDel, "shell32.dll", 16777, 0) Local $lvServerName = $eItemName Local $lvServerIPHost = IniRead($gvIniServer, $lvServerName, "Host", "") ;check if string is already encrypted if StringLeft($lvServerIPHost,2) = "0x" Then $lvServerIPHost = BinaryToString(_Crypt_DecryptData($lvServerIPHost, $gvMasterPass, $CALG_RC4)) EndIf Local $lvServerAPIKey = IniRead($gvIniServer, $lvServerName, "API-Key", "") $lvServerAPIKey = BinaryToString(_Crypt_DecryptData($lvServerAPIKey, $gvMasterPass, $CALG_RC4)) Local $lvServerLocal = IniRead($gvIniServer, $lvServerName, "Local", "0") GUICtrlSetData($ipServerName, $lvServerName) GUICtrlSetData($ipServerIPHost, $lvServerIPHost) GUICtrlSetData($ipServerAPI, $lvServerAPIKey) If $lvServerLocal = "1" Then GUICtrlSetState($cbServerLocal, $GUI_CHECKED) EndIf GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE ExitLoop Case $btServerSave IniWrite($gvIniServer, $lvServerName, "Host", _Crypt_EncryptData(GUICtrlRead($ipServerIPHost), $gvMasterPass, $CALG_RC4)) IniWrite($gvIniServer, $lvServerName, "API-Key", _Crypt_EncryptData(GUICtrlRead($ipServerAPI), $gvMasterPass, $CALG_RC4)) If _fIsChecked($cbServerLocal) Then $tempServerLocal = "1" Else $tempServerLocal = "0" EndIf IniWrite($gvIniServer, $lvServerName, "Local", $tempServerLocal) ExitLoop Case $btServerDel $lvMsgRe = MsgBox(36, "Delete Item", "Do you want to delete this Item ? This will delete also Clients connected to this Server") if $lvMsgRe = 6 Then IniDelete($gvIniServer, $lvServerName) $arrClients = IniReadSectionNames($gvIniClients) if IsArray($arrClients) Then if $arrClients[0] > 0 Then for $i = 1 to $arrClients[0] Step 1 $tempServername = IniRead($gvIniClients, $arrClients[$i], "Server", "") ; is Client connected to this Server ? if $tempServername = $lvServerName Then IniDelete($gvIniClients, $arrClients[$i]) EndIf Next EndIf EndIf EndIf ExitLoop EndSwitch WEnd GUIDelete($fRustDeskServer) EndFunc Func _fRustDesk_FormSettings() $fRustDeskSettings = GUICreate("RustDesk-Master Settings", 780, 164) GUISetFont(11, 400, 0, "Trebuchet MS") $btSettingsSave = GUICtrlCreateButton(" save", 24, 120, 75, 25, $BS_CENTER) $lbConfigPath = GUICtrlCreateLabel("Config-Path:", 24, 8, 92, 24) GUICtrlSetFont(-1, 11, 800, 0, "Trebuchet MS") $lbRustDeskExe = GUICtrlCreateLabel("RustDesk Exe:", 24, 44, 104, 24) GUICtrlSetFont(-1, 11, 800, 0, "Trebuchet MS") $ipConfigPath = GUICtrlCreateInput("", 200, 6, 537, 26) GUICtrlSetFont(-1, 9, 400, 0, "Trebuchet MS") $ipRustDeskExe = GUICtrlCreateInput("", 200, 42, 537, 26) GUICtrlSetFont(-1, 9, 400, 0, "Trebuchet MS") $btConfigPathSel = GUICtrlCreateButton(" ", 740, 7, 35, 25, $BS_CENTER) $btRustDeskExeSel = GUICtrlCreateButton(" ", 740, 43, 35, 25, $BS_CENTER) $cbClientPassSave = GUICtrlCreateCheckbox("Client Password save: ", 24, 80, 193, 17, BitOR($GUI_SS_DEFAULT_CHECKBOX,$BS_RIGHTBUTTON,$BS_LEFT)) GUICtrlSetFont(-1, 11, 800, 0, "Trebuchet MS") GUICtrlSetTip(-1, "check if the Program should save the Client Passwords (encrypted)") GUICtrlSetStyle($btConfigPathSel, $BS_ICON) GUICtrlSetStyle($btRustDeskExeSel, $BS_ICON) GUICtrlSetImage($btSettingsSave, "shell32.dll", 16810, 0) GUICtrlSetImage($btConfigPathSel, "shell32.dll", 4, 0) GUICtrlSetImage($btRustDeskExeSel, "shell32.dll", 37, 0) Local $lvConfigPathReg = RegRead($gvRustDeskMaster_RegPath, "ConfigDir") GUICtrlSetData($ipConfigPath, $lvConfigPathReg) GUICtrlSetData($ipRustDeskExe, RegRead($gvRustDeskMaster_RegPath, "RustDeskExe")) Local $lvClientPassSave = IniRead($gvIniSettings, "General", "ClientPassSave", "0") if $lvClientPassSave = 1 Then GUICtrlSetState($cbClientPassSave, $GUI_CHECKED) EndIf Local $lvConfigPathNew = "" Local $lvExePathNew = "" GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE ExitLoop Case $btSettingsSave ; save Client Passwords (encrypted) If _fIsChecked($cbClientPassSave) Then IniWrite($gvIniSettings, "General", "ClientPassSave", "1") $gvRustDeskMaster_SaveClientPass = True Else IniWrite($gvIniSettings, "General", "ClientPassSave", "0") $gvRustDeskMaster_SaveClientPass = False ; delete all Client Passwords ? $lvMsgRe = MsgBox(36, "RustDesk-Master", "Do you want to clear all client-passwords now ?") if $lvMsgRe = 6 Then if FileExists($gvIniClients) Then _fIni_ClearIniKey($gvIniClients, "Password") EndIf EndIf EndIf ; RustDeskExe-Path changed $lvExePathNew = GUICtrlRead($lvExePathNew) if $lvExePathNew <> "" Then $gvExeRustDesk = $lvExePathNew RegWrite($gvRustDeskMaster_RegPath, "RustDeskExe", "REG_SZ", $gvExeRustDesk) EndIf ; Configpath-Change ? $lvConfigPathNew = GUICtrlRead($ipConfigPath) if $lvConfigPathNew <> $lvConfigPathReg Then $lvMsgRe = MsgBox(36, "New Config Path set", "Do you want to move Library ?") if $lvMsgRe = 6 Then FileMove($lvConfigPathReg & "\*.*", $lvConfigPathNew, 1) RegWrite($gvRustDeskMaster_RegPath, "ConfigDir", "REG_SZ", $lvConfigPathNew) MsgBox(65, "RustDesk-Master", "Program will close now. Please start again to load from new Config-Folder") Exit EndIf EndIf ExitLoop ;change RustDesk-ConfigDir Case $btConfigPathSel $lvConfigPathNew = FileSelectFolder("please select new ConfigPath", $lvConfigPathReg) if @error <> 1 Then GUICtrlSetData($ipConfigPath, $lvConfigPathNew) EndIf ;change RustDesk-ExePath Case $btRustDeskExeSel $lvExePathNew = FileOpenDialog("Please select RustDesk.exe", "", "Exe (*.exe)", $FD_FILEMUSTEXIST) if @error <> 1 Then GUICtrlSetData($ipRustDeskExe, $lvExePathNew) EndIf EndSwitch WEnd GUIDelete($fRustDeskSettings) EndFunc Func _fRustDesk_FindRustDeskExe() Local $lvExeRustDesk = "" Local $lvExeRustDesk_ScriptDir = @ScriptDir & "\rustdesk.exe" Local $lvExeRustDesk_ProgramDir = @ProgramFilesDir & "\RustDesk\rustdesk.exe" Local $lvRustDeskExeCustom = "" ConsoleWrite("Check if exists: " & $lvExeRustDesk_ScriptDir & @CRLF) ConsoleWrite("Check if exists: " & $lvExeRustDesk_ProgramDir & @CRLF) ; if no RustDesk.exe in Script Dir, try to find in "RustDesk-Master"-directory if FileExists($lvExeRustDesk_ScriptDir) = 1 Then $gvExeRustDesk = $lvExeRustDesk_ScriptDir RegWrite($gvRustDeskMaster_RegPath, "RustDeskExe", "REG_SZ", $gvExeRustDesk) ; RustDesk-Exe in Program Dir ? ElseIf FileExists($lvExeRustDesk_ProgramDir) = 1 Then $gvExeRustDesk = $lvExeRustDesk_ProgramDir RegWrite($gvRustDeskMaster_RegPath, "RustDeskExe", "REG_SZ", $gvExeRustDesk) ; no RustDesk-Exe found - please select Else Local $lvRustDeskExeCustom = FileOpenDialog("Please select RustDesk.exe", "", "Exe (*.exe)", $FD_FILEMUSTEXIST) if FileExists($lvRustDeskExeCustom) Then $gvExeRustDesk = $lvRustDeskExeCustom RegWrite($gvRustDeskMaster_RegPath, "RustDeskExe", "REG_SZ", $gvExeRustDesk) EndIf EndIf Return $lvExeRustDesk EndFunc Func _fIsChecked($control) Return BitAnd(GUICtrlRead($control),$GUI_CHECKED) = $GUI_CHECKED EndFunc Func _fIni_ClearIniKey($eIniFile, $eKeyName, $eNewValue="") ;if $eNewValue is empty, the key will be deleted Local $lvReturn ; Get all sections Local $sSections = IniReadSectionNames($eIniFile) If @error Then $lvReturn = False Else ; Loop through each section For $i = 1 To $sSections[0] if $eNewValue = "" Then IniDelete($eIniFile, $sSections[$i], $eKeyName) Else IniWrite($eIniFile, $sSections[$i], $eKeyName, $eNewValue) ; Set key to empty string EndIf Next $lvReturn = True EndIf Return $lvReturn EndFunc