Jump to content

RdpShadow utility 0.2018.12.10

   (0 reviews)

argumentum

1 Screenshot

About This File

..so I have to help someone and remember how to get the session ID,
then remember how to shadow. All from a command prompt. Not cool.

So I wrote this,

Is coded for Windows in English. May work in other languages too.
( as long as "qwinsta" runs, this should work )

For this to work as intended, uncheck "noPrompt", or make the changes
 to the group policy, only if you know what you are doing.
( I will not aid anyone on how what, as I'm not qualified )

This is for when all works as you wish, but have to use the
 command line to shadow a user ( and everyone is in a hurry ).
This gives you a list of users to just click to help the
user on a remote session, by guiding them ( view ) or
interacting with the desktop ( control ).

I do not advise to change anything on your system, nor to use this,
but if you find it useful, then, it is a very practical utility.

  I did not post in the examples forum as is not an example worth posting.
  It grabs the text out of qwinsta and runs mstsc. Not a noteworthy example.


What's New in Version 0.2018.12.10

Released

Added an INI file to save the selected settings ( it's annoying when the script does not remember the settings )

What's New in Version 0.2018.12.6
Added support for Server 2003

What's New in Version 0.2018.12.5
Removed "English only" limitation as the fields may land on the same positions for other languages too.
 

 




User Feedback

You may only provide a review once you have downloaded the file.

There are no reviews to display.

  • Similar Content

    • FMS
      By FMS
      Hello,
      At this moment I'm trying to make a RDP tool to make multiple connections and switch between them.
      Curently I'm having troubles in making multiple connections and got some error's.
      I know why I get the error's  (trying to change a active connection) but I'm not sure how to solve this.
      Does somebody know a cleaver way to make it scalable into more connections in the same embeded window?
      Also I'm open for sugestions for making this code better
      Below the code I'm working on at the moment:
       
      #include <ButtonConstants.au3> #include <ComboConstants.au3> #include <GUIConstantsEx.au3> #include <WinAPI.au3> #include <WindowsConstants.au3> #include <Array.au3> #include <File.au3> #Include <GuiComboBoxEx.au3> Global $configfile = @ScriptDir & "\config.rto" Global $configarray[0][0] Global $RDP_id = False Global $RDP_name = False Global $RDP_ip = False Global $RDP_usr = False Global $RDP_dom = False Global $RDP_pass = False $Form1 = GUICreate("Form1",952, 675, -1, -1, $WS_OVERLAPPEDWINDOW + $WS_CLIPSIBLINGS + $WS_CLIPCHILDREN) $Combo1 = GUICtrlCreateCombo("Combo1", 8, 8, 145, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL)) $Button1 = GUICtrlCreateButton("Connect", 160, 8, 75, 25) $Button2 = GUICtrlCreateButton("Disconnect", 240, 8, 75, 25) $Button3 = GUICtrlCreateButton("Button3", 320, 8, 75, 25) $oRDP = ObjCreate("MsTscAx.MsTscAx.10") $oRDP_Ctrl = GUICtrlCreateObj($oRDP, 64, 44, 800, 600) GUICtrlSetResizing(-1, $GUI_DOCKALL) GUICtrlSetStyle($oRDP_Ctrl , $WS_VISIBLE) GUISetState(@SW_SHOW) fetch_config() While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $Combo1 set_config(GUICtrlRead($Combo1)) Case $Button1 $oRDP.DesktopWidth = 800 $oRDP.DesktopHeight = 600 $oRDP.Fullscreen = False $oRDP.ColorDepth = 16 $oRDP.AdvancedSettings3.SmartSizing = True $oRDP.Server = $RDP_ip $oRDP.UserName = $RDP_usr $oRDP.Domain = $RDP_dom $oRDP.AdvancedSettings2.ClearTextPassword = $RDP_pass $oRDP.ConnectingText = "Connecting to " & $RDP_ip $oRDP.DisconnectedText = "Disconnected from " & $RDP_ip $oRDP.StartConnected = True $oRDP.Connect() Case $Button2 $oRDP.Disconnect() Case $Button3 WinSetState($oRDP_Ctrl, "", @SW_HIDE) EndSwitch WEnd Func cmdkey() ;cmdkey /generic:TERMSRV/ip1 /user:dom1\usr1 /pass:pass1 EndFunc Func set_config($selected = GUICtrlRead($Combo1)) Local $found = False Local $found_id = False $RDP_id = False $RDP_name = False $RDP_ip = False $RDP_usr = False $RDP_dom = False $RDP_pass = False For $x = 1 To UBound($configarray,1) -1 If $selected = $configarray[$x][1] Then ;~ ConsoleWrite ($configarray[$x][0]& @CRLF & $configarray[$x][1]& @CRLF & $configarray[$x][2]& @CRLF & $configarray[$x][3]& @CRLF & $configarray[$x][4]& @CRLF & $configarray[$x][5]& @CRLF) $found_id = $x $found = True EndIf Next If $found Then $RDP_id = $configarray[$found_id][0] $RDP_name = $configarray[$found_id][1] $RDP_ip = $configarray[$found_id][2] $RDP_usr = $configarray[$found_id][3] $RDP_dom = $configarray[$found_id][4] $RDP_pass = $configarray[$found_id][5] Return True Else Return False EndIf EndFunc Func fetch_config() If FileExists($configfile) Then ;~ ReDim $configarray[0][0] If _FileReadToArray($configfile, $configarray , 0 , "|") Then _GUICtrlComboBox_ResetContent($Combo1) _GUICtrlComboBox_BeginUpdate($Combo1) ;~ _GUICtrlComboBox_AddString($Combo1, "") For $i = 1 To UBound($configarray,1) -1 _GUICtrlComboBox_AddString($Combo1, $configarray[$i][1]) Next _GUICtrlComboBox_EndUpdate($Combo1) _GUICtrlComboBox_SetCurSel($Combo1, 0) If set_config(GUICtrlRead($Combo1)) Then Return True Else Return False EndIf Else Return False EndIf Else If Not _FileCreate($configfile) Then Return False Else Local $LC_fileSetTime = FileSetTime($configfile, @YEAR & @MON & @MDAY , $FT_CREATED) If $LC_fileSetTime = 0 Then Return False Else Local $set_rights = Run(@ComSpec & " /c icacls " & $configfile & " /grant Users:F" , "" , @SW_HIDE) If Not $set_rights Then Return False Else Local $file = FileOpen($configfile, 1) If $file = -1 Then Return False Else FileWrite($file, "ID|name|IP|username|domain|pass" & @CRLF) FileWrite($file, "1|name1|ip1|name1|dom1|pass1" & @CRLF) FileWrite($file, "2|name2|ip2|name2|dom2|pass2" & @CRLF) EndIf FileClose($file) fetch_config() Return True EndIf EndIf EndIf EndIf EndFunc  
      edit :
      error at reuse connection :
       
      (51) : ==> The requested action with this object has failed.: $oRDP.Connect() $oRDP^ ERROR >Exit code: 1 Time: 13.73  
    • Piotr_Hodl
      By Piotr_Hodl
      Hi guys,
       
      My post is more architecture related than the actual autoit script.
      Currently I have a java tool that makes a connection to a azure Windows VM using WINRM.
      Then I "grep" the session ID of RDP and using psexec I execute my autoit script on the session ID of the RDP (This assumes that I need to have already a RDP connection established).
      The script runs perfectly when I have a RDP session maximized/opened. If I minimize the RDP window some commands do not work, as for example the Send command.
      I do understand that it has to do with the window not being active, even though the script is executed remotely.
      https://www.autoitscript.com/wiki/FAQ#Why_doesn.27t_my_script_work_on_a_locked_workstation.3F
       
      My goal is to be able to run the autoit scripts with no limitations, like I was running in my local machine.
       
      One important thing, all the flow is being triggered from a linux machine with no GUI. So that is why, I am using a jar file to start the winrm connection.
       
      So to sum up:
      starting server: centos with no GUI
      remote server: azure win 10
      goal: from starting server, launch autoit script that is on remote server
       
      Thanks
      Piotr
       
       
       
    • digitalexpl0it
      By digitalexpl0it
      I am trying to use the example code from 
      But when I try it I get the GUi loaded then it closes. Is there a new way to load RDP on windows 10/2016 with AutoIT?
       
      #include <GUIConstants.au3> #include <Array.au3> $width = 1024 $height = 768 $oRDP = ObjCreate("MsTscAx.MsTscAx.10") $GUI = GUICreate("Embedded RDP control Test", $width+20, $height+20, 0, -1, $WS_OVERLAPPEDWINDOW + $WS_VISIBLE + $WS_CLIPSIBLINGS) $GUIActiveX = GUICtrlCreateObj($oRDP, 10, 10, $width, $height) GUICtrlSetResizing ($GUIActiveX,$GUI_DOCKAUTO) GUISetState() ; connect to the server. if this is not done first, the child controls are not rendered. ; which is a problem, because we have to change their styles to prevent clipping $oRDP.Server = "" $oRDP.Domain = "" $oRDP.UserName = "" $oRDP.Connect() ; Determine the class name of the ATL control - it seems to be random from system to system Opt("WinTitleMatchMode", 4) ;1=start, 2=subStr, 3=exact, 4=advanced, -1 to -4=Nocase Opt("WinSearchChildren", 1) ;0=no, 1=search children also $sATLClass = "" $aClasses = StringSplit(WinGetClassList($GUI,""),@LF) For $i = 1 To $aClasses[0] If StringLeft($aClasses[$i],4) = "ATL:" Then $sATLClass = $aClasses[$i] ExitLoop EndIf Next ; get the handles to the controls that must have their styles modified $hUIContainerClass = ControlGetHandle($GUI, "", "[CLASS:UIContainerClass]") $hUIMainClass = ControlGetHandle($GUI, "", "[CLASS:UIMainClass]") $hATL = ControlGetHandle($GUI, "", "[CLASS:"&$sATLClass&"]") ConsoleWrite("$hUIContainerClass (should not be 0 or blank):" & $hUIContainerClass & @crlf) ConsoleWrite("$hUIMainClass (should not be 0 or blank):" & $hUIMainClass & @crlf) ConsoleWrite("$hATL (should not be 0 or blank):" & $hATL & @crlf) ; modify the styles of the child controls to match those set by the offical client application ; this prevents clipping problems - though, I don't know why Const $WS_EX_NOPARENTNOTIFY1 = 0x4 Const $WS_EX_NOINHERITLAYOUT1 = 0x100000 $hUIContainerClassStyle = BitOR($WS_CHILD, $WS_CLIPCHILDREN, $WS_CLIPSIBLINGS, $WS_VISIBLE) ; 0x56000000 $hUIContainerClassStyleEx = BitOR($WS_EX_NOINHERITLAYOUT1, $WS_EX_NOPARENTNOTIFY1) ; 0x00100004 $hUIMainClassStyle = BitOR($WS_CHILD, $WS_CLIPCHILDREN, $WS_CLIPSIBLINGS, $WS_SYSMENU, $WS_VISIBLE) ; 0x56080000 $hUIMainClassStyleEx = 0x0 $hATLStyle = BitOR($WS_CHILD, $WS_CLIPCHILDREN, $WS_CLIPSIBLINGS, $WS_VISIBLE) ; 0x56000000 $hATLStyleEx = 0x0 $guiStyle = BitOR($WS_BORDER, $WS_CAPTION, $WS_CLIPCHILDREN, $WS_CLIPSIBLINGS, $WS_DLGFRAME, $WS_GROUP, $WS_MAXIMIZE, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_SYSMENU, $WS_TABSTOP, $WS_THICKFRAME, $WS_VISIBLE) ; 0x17CF0100 $guiStyleEx = $WS_EX_WINDOWEDGE ; 0x00000100 _SetStyle($hUIContainerClass,$hUIContainerClassStyle,$hUIContainerClassStyleEx) _SetStyle($hUIMainClass,$hUIMainClassStyle,$hUIMainClassStyleEx) _SetStyle($hATL,$hATLStyle,$hATLStyleEx) _SetStyle($gui,$guiStyle,$guiStyleEx) Func _SetStyle($hwnd,$style,$exstyle) DllCall("user32.dll", "long", "SetWindowLong", "hwnd", $hwnd, "int", -16, "long", $style) DllCall("user32.dll", "long", "SetWindowLong", "hwnd", $hwnd, "int", -20, "long", $exstyle) EndFunc ; $WS_EX_NOPARENTNOTIFY and $WS_EX_NOINHERITLAYOUT seem to be fairly important ; This may still be important for other projects with similar problems. AdlibRegister ( "checkconn", 1000) Func checkconn() If $oRDP.Connected = 0 Then msgbox(0,"RDP","You got Disconnected: " & $oRDP.Connected) ;_arraydisplay($oRDP) Exit EndIf EndFunc While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE ExitLoop EndSelect WEnd GUIDelete() Exit  
    • BigDaddyO
      By BigDaddyO
      I have a bunch of scripts that I need to run on systems that are either accessed from RDP or Citrix.
      The problem I have had all along is that if you close the RDP or Citrix screen then the scripts will fail even if the user is still logged into the system you were connected to.
      I finally found something that will tell me if the session is still active but it's a command line tool called qwinsta.exe.  I prefer not to do stdoutread if there is any other way so I'm wondering if anyone has an idea on how to get the session state for the currently logged in user as this script does but not using stdoutread?
      $RunFrom = EnvGet("Sessionname") ConsoleWrite("Active SessionName = " & $RunFrom & @CRLF & @CRLF) Local $iPID = Run('"C:\Windows\System32\qwinsta.exe" ' & @UserName, "", @SW_HIDE, 2) ProcessWaitClose($iPID) ;Need to wait for it to finish before we get the StdOutput values $sOutput = StdoutRead($iPID) ;Retrieve whatever returned ConsoleWrite("Active StdOutRead = " & @CRLF & $sOutput & @CRLF & @CRLF) ;---------------------------------------------------------------------------------------- Sleep(15000) ;Need to disconnect at this point so we can see what happens next!!! ;---------------------------------------------------------------------------------------- $RunFrom = EnvGet("Sessionname") ConsoleWrite("Disconnected SessionName = " & $RunFrom & @CRLF & @CRLF) ;After Lock, again get session name and session state and write to console Local $iPID = Run('"C:\Windows\System32\qwinsta.exe" ' & @UserName, "", @SW_HIDE, 2) ProcessWaitClose($iPID) ;Need to wait for it to finish before we get the StdOutput values $sOutput = StdoutRead($iPID) ;Retrieve whatever returned ConsoleWrite("Disconnected StdOutRead = " & @CRLF & $sOutput & @CRLF)  
      Below is what i'm seeing returned by the script.  What I need is just the STATE field.
      From RDP:
      Active SessionName = RDP-Tcp#0 Active StdOutRead = SESSIONNAME USERNAME ID STATE TYPE DEVICE >rdp-tcp#0 MyUsername 3 Active rdpwd Disconnected SessionName = RDP-Tcp#0 Disconnected StdOutRead = SESSIONNAME USERNAME ID STATE TYPE DEVICE > MyUsername 3 Disc  
       
      From Citrix:
      Active SessionName = ICA-CGP#9 Active StdOutRead = SESSIONNAME USERNAME ID STATE TYPE DEVICE >ica-cgp#9 MyUsername 43 Active wdica Disconnected SessionName = ICA-CGP#9 Disconnected StdOutRead = SESSIONNAME USERNAME ID STATE TYPE DEVICE > MyUsername 43 Disc  
      Thanks,
      Mike
    • Valiante
      By Valiante
      Hi,
      I've searched but can only find posts from people with the opposite problem (asking how to get their GUI to display on top of a full-screen app, usually a game.
      I've created a toolbar which I use in a work environment, creating the GUI with the following styles;
      $hwnd = GUICreate($title, $toolbarWidth, $height, $left, $top, $WS_POPUPWINDOW, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))   I want it to have a TOPMOST style as it's supposed to behave like the Windows taskbar (which it does in all but one scenario).   If I start a full-screen RDP session, I can still see my toolbar and have to close it.  Is there a way I can make it appear on top of all windows *except* full-screen apps (in the same way the taskbar allows full-screen apps on top of it)?   Thanks in advance.   Val.
×