Jump to content

This site uses cookies. By continuing to browse the site you are agreeing to our use of cookies. Find out more here. X
X


Photo

Remote desktop auto login script I wrote


  • Please log in to reply
1 reply to this topic

#1 gte

gte

    Universalist

  • Active Members
  • PipPipPipPipPip
  • 287 posts

Posted 08 January 2010 - 10:41 PM

I posted here, because I'm looking for help as to how to get around a specific problem of reading the contents of the remote desktop window (specifically the legal banner that pops up, and at what exact millisecond it displays and will accept an input key to close) or to somehow tell from the back end, when the OS you are connecting to tells the legal banner registry key to be read and then for the banner to be displayed




I wrote an auto login script for Remote desktop. I also wrote an installer, but I'll only post that if people want it, as it's semi specific to my environment.

I has a couple features, it can encrypt and cache your credentials into an ini file, or you can call the executable with a " /a" after it and it will take what's on your clipboard and automatically push it to the script to log into it. I've tested it on XP, server 2k and server 2k3. I have not had a chance to thoroughly test the console mode switch.

It has switches for console mode, and for keeping the window open after it calls the remote desktop executable and passes the information to it. It can save certain local account credentials and have them via a drop down menu that can be password protected.

The way that I use it, is that I copy a server name to my clipboard and have an icon in my system tray that I click on to launch it, it will then call the remote desktop executable and it waits for me to hit the left hand ctrl key, which then sends the credentials. I had to code it this way, because I could not figure out a way to read the contents inside of the Remote Desktop window and wait until the warning banner appear (as pictured at the bottom of this post) before it sends the necessary key strokes. Some servers take a second to display that, some take as long as 10. And workstations can take even longer sometimes. If someone can figure out a way to read that window inside of the Remote Desktop window, that would be great and I'd be happy to incorporate it into the code.

I'd recommend tweaking the encryption string, and tweaking or at least being aware of where the files/credentials are saved to.

Two images you'll need to save and point the code to (for atheistic purposes) are


Posted Image

and

The .ico attached file that is attached through the forum in this post

Attached File  remotedesktopicon1.ico   2.4KB   915 downloads


Anyway, let me know what you think and if you have any ideas on how to tell the millisecond (give or take a few) as to when that banner displays the ok button and is ready for a send key input



Plain Text         
#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_icon=..\remote desktop\remotedesktopicon1L.ico #AutoIt3Wrapper_outfile=rdc_config_combined.exe #AutoIt3Wrapper_Res_Comment=Remote desktop auto logon program #AutoIt3Wrapper_Res_Description=Remote desktop program #AutoIt3Wrapper_Res_Fileversion=1.0.0.7 #AutoIt3Wrapper_Res_LegalCopyright=2010 #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include <ButtonConstants.au3> #include <EditConstants.au3> #include <ComboConstants.au3> #include <GUIConstantsEx.au3> #include <GuiComboBox.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #Include <WinAPI.au3> #Include <string.au3> #Include <GuiMenu.au3> #Include <Misc.au3> #include <Array.au3> Opt('GUIResizeMode', $GUI_DOCKALL) Global $default = default Global $hGUI, $Btn_Options Global $Checkbox, $Edit Global $fShow = False Global $clipboardget = ClipGet( ) Global $clipboard = StringLeft($clipboardget, 15) Global Const $DM_SETDEFID = 0x0401 _switches()     ; checks for switches and exetcutes that portion first ConsoleWrite("Now moving beyond the _switches() function, to the while statement ... no switch(es) used" & @CRLF) #Region ### START Koda GUI section ### Form=c:\documents and settings\668692\my documents\work stuff\autoit\testing\autologinrdc.kxf $RemoteDesktopScript = GUICreate("Remote Desktop Connection", 413, 500, 617, 309) $BannerPic1 = GUICtrlCreatePic(@TempDir & "\rdc1.bmp", -1, -32, 412, 100, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS)) GUISetIcon(@TempDir & "\remotedesktopicon1.ico") $ServerNameLabel1 = GUICtrlCreateLabel("Computer:", 8, 80, 52, 21, $WS_TABSTOP) $ServerNameInput1 = GUICtrlCreateCombo($clipboard, 88, 80, 249, 25) $connect = GUICtrlCreateButton("Connect", 88, 112, 75, 25, 0) GUICtrlSetState($connect, $GUI_FOCUS) _SendMessage($RemoteDesktopScript, $DM_SETDEFID, $connect) $cancel = GUICtrlCreateButton("Cancel", 168, 112, 75, 25, 0) $help = GUICtrlCreateButton("Help", 248, 112, 75, 25, 0) $options = GUICtrlCreateButton("Options", 328, 112, 75, 25, 0) $Graphic1 = GUICtrlCreateGraphic(0, 0, 408, 70) $UsernameInput1 = GUICtrlCreateInput("", 96, 240, 241, 21) GUICtrlSetState($UsernameInput1, "blank") $PasswordInput1 = GUICtrlCreateInput("", 96, 272, 241, 21, BitOR($ES_PASSWORD,$ES_AUTOHSCROLL)) GUICtrlSetState($PasswordInput1, "blank") $DomainInput1 = GUICtrlCreateInput("", 96, 304, 241, 21) GUICtrlSetState($DomainInput1, "blank") $User = GUICtrlCreateLabel("User Name", 8, 240, 60, 21) $Password = GUICtrlCreateLabel("Password", 8, 272, 60, 21) $Domain = GUICtrlCreateLabel("Domain", 8, 304, 60, 21) $Checkbox_forsave = GUICtrlCreateCheckbox("", 96, 328, 25, 25) $Save = GUICtrlCreateLabel("Save these credentials for later use?", 120, 336, 175, 21) $Checkbox_fornofullscreen = GUICtrlCreateCheckbox("", 8, 360, 17, 17) $Checkbox_forconsolemode = GUICtrlCreateCheckbox("", 8, 384, 17, 17) $fullscreen = GUICtrlCreateLabel("Select here if you do NOT want full screen mode", 32, 360, 225, 17) $consolemode = GUICtrlCreateLabel("Select here if you want to log in with console mode (win2k3 server only)", 32, 384, 343, 17) $Checkbox_fornoclose = GUICtrlCreateCheckbox("", 8, 408, 17, 17) $programclose = GUICtrlCreateLabel("Select here if you do NOT want this program to close after connecting", 32, 408, 333, 17) $localaccounts = GUICtrlCreateCombo("Choose Local Account Credentials", 95, 192, 241, 25) GUICtrlSetData($localaccounts, "Domain|Other Domain|Another Domain|Etc", "Choose Local Account Credentials") GUISetState(@SW_SHOW) Dim $RemoteDesktopScript_AccelTable[2][2] = [["^n", $connect],["^h", $help]] GUISetAccelerators($RemoteDesktopScript_AccelTable) #EndRegion ### END Koda GUI section ### $decrypted_username = "" $decrypted_password = "" $decrypted_domain = "" $registrylegalpolicy = "" While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit case $cancel Exit case $connect     If Ping(guictrlread($ServerNameInput1)) < 1 Then        ; checks to see if the server is available via a ping         MsgBox(0, "Error", "Server not available via ping")     Else        _connect()      EndIf     case $help         MsgBox(32, "Help Menu", "This program is an auto sign on program." & @crlf & "This program will load up to the first 15 characters of any text on your clipboard." & @crlf & "When you click on options, you can stored an encrypted version of your pin and password." & @crlf & @crlf & "Click on the options button, for more possibilities")         GUICreate("Help", "400", "200", -1, -1, $ws_popup, $WS_EX_CONTEXTHELP, $RemoteDesktopScript)         Case $options     $fShow = Not $fShow                 If $fshow Then         GUICtrlSetData($Btn_Options, '&Hide')         WinMove($RemoteDesktopScript, '', Default, Default, 413, 500)             Else         GUICtrlSetData($Btn_Options, '&Show')         WinMove($RemoteDesktopScript, '', Default, Default, 413, 500)     EndIf Case $localaccounts         $passwordverification = InputBox("Password Verification", "Please enter the password to access this part of the script", "", "*")     If $passwordverification = "setpasswordhere" Then   ; set a password here if you want to password protect stored local login values, if you want them wide open, get rid of the If portion         Select             Case Guictrlread($localaccounts) = "Domain"     ; set this to a local domain for local admin credentials or however your network works                 GUICtrlSetData($UsernameInput1, "")     ; type the user name you want the script to push to the rdp window, in between quotes                 GUICtrlSetData($PasswordInput1, "")     ; type the password you want the script to push to the rdp window, in between quotes                 GUICtrlSetData($DomainInput1, "")       ; type the domain you want the script to push to the rdp window, in between quotes                         Case Guictrlread($localaccounts) = "Other Domain"       ; set this to another domain for local admin credentials                 GUICtrlSetData($UsernameInput1, "")                 GUICtrlSetData($PasswordInput1, "")                 GUICtrlSetData($DomainInput1, "")                 EndSelect             Else         MsgBox(0, "Error", "You can't use this feature unless you were meant to have access")         EndIf EndSwitch     WEnd func _connect()         if FileExists(@TempDir & "\logon.ini") Then     ; if it doesn't exist, it prompts you to go to the config screen if you run with /a         $Decrypt_File = FileRead(@TempDir & "\logon.ini")         $Decrypt_String = _StringEncrypt(0, $Decrypt_File, "putsomethinghere", 7)       ; To encrypt this to whatever you want it to be, replace the "putsomethinghere" with your own strong password like value         $Decrypt_Array = StringSplit($Decrypt_String, ',')         _ArrayDisplay($Decrypt_Array)         $decrypted_username = $Decrypt_Array[1]         $decrypted_password = $Decrypt_Array[2]         $decrypted_domain = $Decrypt_Array[3]     EndIf     if GUICtrlread($Checkbox_forsave) = $GUI_CHECKED Then         FileDelete( @TempDir & "\logon.ini")    ; Deletes the old file first, since it needs to write a new one with new values         FileWrite( @TempDir & "\logon.ini", _StringEncrypt(1,guictrlread($UsernameInput1) & ',' & guictrlread($PasswordInput1) & ',' & guictrlread($DomainInput1),"putsomethinghere", 7))       ; location the login.ini is stored, in XP it's c:\documents and settings\[profilename]\local settings\temp . Make sure your "putsomethinghere" matches your encryption string     EndIf     if GUICtrlRead($Checkbox_fornofullscreen) = $GUI_UNCHECKED then         $screenresolution1 = " /f"     EndIf               if GUICtrlRead($Checkbox_fornofullscreen) = $GUI_CHECKED then         $screenresolution1 = " /w:1200 /h:1000"     EndIf       if GUICtrlRead($Checkbox_forconsolemode) = $GUI_UNCHECKED then          $consolemode1 = ""     EndIf               if GUICtrlRead($Checkbox_forconsolemode) = $GUI_CHECKED then         $consolemode1 = " /console"     EndIf       $ServerNameInput2=GUICtrlRead($ServerNameInput1)     $activewindow = WinGetHandle("[active]")     run( "cmd /c mstsc.exe /v:" & $ServerNameInput2 &$consolemode1 & $screenresolution1, @SystemDir, @SW_HIDE)     ConsoleWrite("cmd /c mstsc.exe /v:" & $ServerNameInput2 &$consolemode1 & $screenresolution1 & @CRLF)     If FileExists(@TempDir & "\logon.ini") OR GUICtrlRead($UsernameInput1) <> 0 Then        ; verifies there is no text in the input fields         $activewindow = WinGetHandle("[active]")                             ConsoleWrite("combo1 - " & $ServerNameInput1 & "combo2 - " & $ServerNameInput2 & @CRLF)         If FileExists(@TempDir & "\logon.ini") Then     ; only tries to decrypt if you have the file there             $Decrypt_File = FileRead(@TempDir & "\logon.ini")   ; location the login.ini is stored, in XP it's c:\documents and settings\[profilename]\local settings\temp             $Decrypt_String = _StringEncrypt(0, $Decrypt_File, "putsomethinghere", 7)   ; To encrypt this to whatever you want it to be, replace the "putsomethinghere" with your own strong password like value             $Decrypt_Array = StringSplit($Decrypt_String, ',')             $decrypted_username = $Decrypt_Array[1]             $decrypted_password = $Decrypt_Array[2]             $decrypted_domain = $Decrypt_Array[3]             ConsoleWrite("logon.ini decrtyped" & @CRLF)         EndIf         Consolewrite("Stored values are " & $decrypted_username & " - " & $decrypted_password & " - " & $decrypted_domain & @CRLF)         ConsoleWrite("Active window is " & $activewindow  & @CRLF)         WinActivate("[CLASS:SysListView32]")         ConsoleWrite("Activated desktop itself" & @CRLF)                             ConsoleWrite("Right before control ispressed" & @CRLF)         Do             ConsoleWrite("Waiting for control to be pressed" & @CRLF)             sleep(50)             If GUIGetMsg() = $cancel OR GUIGetMsg() = $GUI_EVENT_CLOSE Then     ; this allows the user to hit cancel while the script is running                 Exit             EndIf                             Until _IsPressed("11")      ; this looks for the left hand control key         ConsoleWrite("Right after control ispressed" & @CRLF)         WinActivate($ServerNameInput2 & " - Remote Desktop")         Sleep(50)         WinActivate($ServerNameInput2 & " - Remote Desktop")         Sleep(50)         ConsoleWrite("WinActivate done" & @CRLF)         Sleep(50)         BlockInput(1)         Send("{ENTER}")         Sleep(50)         Send("!U")         Sleep(50)             If GUICtrlRead($UsernameInput1) = "" Then             Send($decrypted_username,1)             ConsoleWrite("Sent decrypted username - " & $decrypted_username & @CRLF)             Else             Send(GUICtrlRead($UsernameInput1))             ConsoleWrite("Sent input1 username - " & GUICtrlRead($UsernameInput1) & @CRLF)             EndIf                                 Sleep(50)         Send("{TAB}")         Sleep(50)             If GUICtrlRead($PasswordInput1) = "" Then             Send($decrypted_password,1)             ConsoleWrite("Sent decrypted password - " & $decrypted_password & @CRLF)             Else             Send(GUICtrlRead($PasswordInput1))             ConsoleWrite("Sent input2 password - " & GUICtrlRead($PasswordInput1) & @CRLF)             EndIf                                           Sleep(50)         Send("{TAB}")         Sleep(50)             If GUICtrlRead($DomainInput1) = "" Then             Send($decrypted_domain,1)             ConsoleWrite("Sent decrypted domain - " & $decrypted_domain & @CRLF)             Else             Send(GUICtrlRead($DomainInput1))             ConsoleWrite("Sent input3 domain - " & GUICtrlRead($DomainInput1) & @CRLF)             EndIf                                 Sleep(50)         Send("{TAB}")         Sleep(50)         Send("{ENTER}")             BlockInput(0)         Sleep(1000)         If GUICtrlRead($Checkbox_fornoclose) = $GUI_UNCHECKED then              exit             WinClose("Remote Desktop Connection", "Select here if you do NOT want this program to close after connecting")             ConsoleWrite("Box was selected to close the RDC window" & @CRLF)         EndIf           If GUICtrlRead($Checkbox_fornoclose) = $GUI_CHECKED then             ConsoleWrite("Box selected not to close the RDC window after connection was made" & @CRLF)         EndIf               Sleep(2000)             Else         MsgBox(0,"Error","You need to save your credentials first through the executable, before running from the command prompt with a switch")     EndIf EndFunc     For $i = 1 to 7500 Step 1       ; this polls in case the user wants to use the cancel button while the script is running         Sleep(1)         If GUIGetMsg() = $cancel OR GUIGetMsg() = $GUI_EVENT_CLOSE Then                 Exit         EndIf           Next     if GUICtrlRead($Checkbox_fornoclose) = $GUI_UNCHECKED then          exit         ConsoleWrite("Box was selected to close the RDC window" & @CRLF)     EndIf               if GUICtrlRead($Checkbox_fornoclose) = $GUI_CHECKED then         ConsoleWrite("Box selected not to close the RDC window after connection was made" & @CRLF)     EndIf   Func _switches()     If $CmdLine[0] > 0 Then             If $CmdLine[1] = "/a" Then                 _connectslasha()                            ElseIf  $CmdLine[1] = "/c" Then                 MsgBox(0, 0, "Equals /c")                           elseif $CmdLine[1] = 0 Then                 MsgBox(0, 0, "Equals 0")                            Else                 MsgBox(0, 0, "???")             EndIf     Else ;~      _connectslasha() ; this is here for testing/launching through Scite, since you can't force a command line entry, uncomment the _connectslasha() and comment out the message box below it         MsgBox(0,"Error", "No command line switch was used, eg: ' /a' ")     EndIf EndFunc func _connectslasha()     if FileExists(@TempDir & "\logon.ini") Then     $Decrypt_File = FileRead(@TempDir & "\logon.ini")     $Decrypt_String = _StringEncrypt(0, $Decrypt_File, "putsomethinghere", 7) ; This decrypts the ini file, make sure the "putsomethinghere" matches what you have as a value to encrypt it with     $Decrypt_Array = StringSplit($Decrypt_String, ',')     $decrypted_username = $Decrypt_Array[1]     $decrypted_password = $Decrypt_Array[2]     $decrypted_domain = $Decrypt_Array[3]     Else         MsgBox(0,"Error","You need to save your credentials first through the rdc_config executable, before running this shortcut with the clipboard auto paste switch")         Run("rdc_config.exe", @SystemDir) ; This should be whatever you name your executable as         Exit     EndIf     $screenresolution1 = " /f"     $ServerNameInput2=ClipGet()     ConsoleWrite("Server name from clipboard is " & $ServerNameInput2 & @CRLF)     $activewindow = WinGetHandle("[active]")           run( "cmd /c mstsc.exe /v:" & $ServerNameInput2 & $screenresolution1, @SystemDir, @SW_HIDE)     WinClose("Remote Desktop Connection", "Select here if you do NOT want this program to close after connecting")     ConsoleWrite("Ran mstsc2 here" & @CRLF)         If FileExists(@TempDir & "\logon.ini") Then             $activewindow = WinGetHandle("[active]")                                                 ConsoleWrite("combo2 - " & $ServerNameInput2 & @CRLF)             $Decrypt_File = FileRead(@TempDir & "\logon.ini")             $Decrypt_String = _StringEncrypt(0, $Decrypt_File, "ssadmadsusf", 7)             $Decrypt_Array = StringSplit($Decrypt_String, ',')             $decrypted_username = $Decrypt_Array[1]             $decrypted_password = $Decrypt_Array[2]             $decrypted_domain = $Decrypt_Array[3]             ConsoleWrite("logon.ini decrtyped" & @CRLF)             Consolewrite("Stored values are " & $decrypted_username & " - " & $decrypted_password & " - " & $decrypted_domain & @CRLF)             ConsoleWrite("Active window is " & $activewindow  & @CRLF)             WinActivate("[CLASS:SysListView32]")             ConsoleWrite("Activated desktop itself" & @CRLF)             ConsoleWrite("Right before control ispressed" & @CRLF)             Do                 ConsoleWrite("Waiting for control to be pressed" & @CRLF)                 sleep(50)                             Until _IsPressed("11")             ConsoleWrite("Right after control ispressed" & @CRLF)             WinActivate($ServerNameInput2 & " - Remote Desktop")             Sleep(50)             WinActivate($ServerNameInput2 & " - Remote Desktop")             Sleep(50)             ConsoleWrite("WinActivate done" & @CRLF)             Sleep(50)             BlockInput(1)             Send("{ENTER}")             Sleep(50)             Send("!U")             Sleep(50)             Send($decrypted_username,1)             Sleep(50)             Send("{TAB}")             Sleep(50)             Send($decrypted_password,1)               Sleep(50)             Send("{TAB}")             Sleep(50)             Send($decrypted_domain,1)             Sleep(50)             Send("{TAB}")             Sleep(50)             Send("{ENTER}")                 BlockInput(0)             Sleep(1000)             If GUICtrlRead($Checkbox_fornoclose) = $GUI_UNCHECKED then                  exit                 WinClose("Remote Desktop Connection", "Select here if you do NOT want this program to close after connecting")                 ConsoleWrite("Box was selected to close the RDC window" & @CRLF)             EndIf               If GUICtrlRead($Checkbox_fornoclose) = $GUI_CHECKED then                 ConsoleWrite("Box selected not to close the RDC window after connection was made" & @CRLF)             EndIf                       Sleep(2000)         EndIf                         Exit EndFunc






This is the banner that displays at various times after the remote desktop window displays

Posted Image




Posted Image







#2 gte

gte

    Universalist

  • Active Members
  • PipPipPipPipPip
  • 287 posts

Posted 09 January 2010 - 05:55 PM

9 downloads ... any feedback?


Any ideas on how to read the contents of the remote desktop window?




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users