Solved

Infinite AutoIT Loop, Exit Compiled EXE to get Command Prompt Back

Posted on 2013-12-02
7
1,474 Views
Last Modified: 2013-12-03
I am deploying a compiled AutoIT exe script via SCCM, however I have an infinite LOOP incorporated at the end of the script to display a message in the System Tray.  Via a Command Prompt, I have noticed that the EXE is waiting for the loop to complete before returning the Command Prompt back.  Is there a way to have the loop run infinitely and have the EXE return (an Exit Code of 0) and the command prompt with out breaking the loop?

The script with the infinite loop is below:

TraySetIcon("ActionCenter.dll",2)
TraySetToolTip ("Please restart your system")
Break(0) ;Disable break

While 1 = 1
   TrayTip("IT", "Critical updates have been installed on your system. Please save your work and restart your system as soon as possible.", 10, 1)
   Sleep (900000)
WEnd
0
Comment
Question by:rmessing171
  • 3
  • 3
7 Comments
 
LVL 12

Expert Comment

by:mlongoh
Comment Utility
Well if it doesn't exit then it's not going to generate an exit code.  I think you need to just launch it and that's that.  Otherwise, you need to create another autoit script that runs the second, and it shouldn't exit cleanly until you see that the one you want to leave running has started.
0
 

Author Comment

by:rmessing171
Comment Utility
Thank you for your quick response!  I would like to pursue the creation of another autoit script that runs the second.  How would I go about doing this?  Could you provide me a quick example of how I would call the second AutoIT script and script it so it doesn't exit cleanly until I see that the script I wanted has started? Please forgive me, I am new at AutoIT and nesting scripts.
0
 
LVL 29

Accepted Solution

by:
matrixnz earned 500 total points
Comment Utility
Not sure why you're using command prompt, you should be able to just call the script directly.  I created a restart script that may help, it's actually based on Windows Updates and checks the following keys for pending restarts.
HKLM\SOFTWARE\Microsoft\Updates\UpdateExeVolatile  - Flags
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager - PendingFileRenameOperations

You can either use the following syntax:
_FNC_RESTART("Application Name", 1), request restart
_FNC_RESTART("Application Name", 0), check if restart is required.

Script is x86/x64 compatible and tested on Windows XP/7

Pending Restart Detected
#NoTrayIcon

Opt("TrayMenuMode", 1)

#AutoIt3Wrapper_Res_File_Add=Resources\Restart.png,10,IMG_RESTART
#include <Array.au3>
#include <ComboConstants.au3>
#include <Resources.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <StringSize.au3>
#include <WinAPI.au3>

Global $GLB_sGUIFONT = 'Trebuchet MS'
Global $GLB_TRAYSET = 0
Global $VAR_iGUITIME = 0
Global $GUI_hGUINAME
Global $BTN_hGUIEXIT
Global $BTN_hGUIWAIT
Global $BTN_hRESTART

_FNC_RESTART('Enter Application Name Here...')

Func _FNC_RESTART($PAR_sPRODUCT, $PAR_vRESTART = 1)
  If $PAR_vRESTART = 1 Then
    Local $CHK_iRESTART = 0
    RegRead('HKLM\SOFTWARE\Microsoft\Updates\UpdateExeVolatile', 'Flags')
      If Not @error Then $CHK_iRESTART += 1
    RegRead('HKLM64\SOFTWARE\Microsoft\Updates\UpdateExeVolatile', 'Flags')
      If Not @error Then $CHK_iRESTART += 1
    RegRead('HKLM\SYSTEM\CurrentControlSet\Control\Session Manager', 'PendingFileRenameOperations')
      If Not @error Then $CHK_iRESTART += 1
    RegRead('HKLM64\SYSTEM\CurrentControlSet\Control\Session Manager', 'PendingFileRenameOperations')
      If Not @error Then $CHK_iRESTART += 1
    If $CHK_iRESTART = 0 Then Return
  EndIf

  Local $VAR_POSITION_ARRAY = WinGetPos('[CLASS:Shell_TrayWnd]')
  If $VAR_POSITION_ARRAY[1] = 0  Then
    $VAR_POSITION_ARRAY[0] = @DesktopWidth
    $VAR_POSITION_ARRAY[1] = @DesktopHeight
    $VAR_POSITION_ARRAY[2] = 0
    $VAR_POSITION_ARRAY[3] = 0
  EndIf

  Local $ARR_sMESSAGE[4][3]
    $ARR_sMESSAGE[0][0] = 3
    $ARR_sMESSAGE[1][0] = 'Pending Restart Detected'
    $ARR_sMESSAGE[1][1] = 'Please restart your computer before installing ' & @CRLF & $PAR_sPRODUCT
    $ARR_sMESSAGE[1][2] = $PAR_sPRODUCT & ' has detected that there are pending system changes that require a reboot.  Please save your files, reboot the system and rerun the installation.'
    $ARR_sMESSAGE[2][0] = 'Restart Required'
    $ARR_sMESSAGE[2][1] = 'Please restart your computer to complete the installation of ' & $PAR_sPRODUCT
    $ARR_sMESSAGE[2][2] = $PAR_sPRODUCT & ' has detected that there are pending system changes that require a reboot to complete the installation.  Please save your files and reboot the system.'

  Local $VAR_iBNRSIZE = _StringSize($ARR_sMESSAGE[$PAR_vRESTART][1], 10, 800, 0, $GLB_sGUIFONT)
  ;~ $GUI_iBNRSIZE[0] = Array Count
  ;~ $GUI_iBNRSIZE[1] = x Coordinates
  ;~ $GUI_iBNRSIZE[2] = y Coordinates
  ;~ $GUI_iBNRSIZE[3] = w Width
  ;~ $GUI_iBNRSIZE[4] = h Height
  Local $GUI_iBNRSIZE[5] = [4, 0, 0, 335, 60]
  If $VAR_iBNRSIZE[2] > $GUI_iBNRSIZE[3] Then $GUI_iBNRSIZE[3] = $VAR_iBNRSIZE[2]

  $GUI_hGUINAME = GUICreate($ARR_sMESSAGE[$PAR_vRESTART][0], 60 + $GUI_iBNRSIZE[3] + 10, 200, ($VAR_POSITION_ARRAY[0] + $VAR_POSITION_ARRAY[2]) - (90 + $GUI_iBNRSIZE[3]), $VAR_POSITION_ARRAY[1] - 240)
    GUISetBkColor(0xFFFFFF)
    GUISetFont(8.5, 400, 0, $GLB_sGUIFONT)

  GUICtrlCreateGraphic(0, 0, $GUI_iBNRSIZE[4] + $GUI_iBNRSIZE[3] + 10, $GUI_iBNRSIZE[4])
    GUICtrlSetBkColor(-1, 0xFFCC33)
    GUICtrlSetState(-1, $GUI_DISABLE)

  $GUI_hGUIICON = GUICtrlCreatePic('', 0, 0, $GUI_iBNRSIZE[4] + $GUI_iBNRSIZE[3] + 10, $GUI_iBNRSIZE[4])
    _ResourceSetImageToCtrl($GUI_hGUIICON, 'IMG_RESTART')
    GUICtrlSetState($GUI_hGUIICON, $GUI_DISABLE)
    GUICtrlSetResizing($GUI_hGUIICON, $GUI_DOCKALL)

  $GUI_hLBLNAME = GUICtrlCreateLabel($ARR_sMESSAGE[$PAR_vRESTART][1], $GUI_iBNRSIZE[4], ($GUI_iBNRSIZE[4] - $VAR_iBNRSIZE[3])/2, $GUI_iBNRSIZE[3], $VAR_iBNRSIZE[3])
  GUICtrlSetFont($GUI_hLBLNAME, 10, 800, 0, $GLB_sGUIFONT)
  GUICtrlSetBkColor($GUI_hLBLNAME, $GUI_BKCOLOR_TRANSPARENT )

  GUICtrlCreateLabel($ARR_sMESSAGE[$PAR_vRESTART][2], 60, 65, $GUI_iBNRSIZE[3], 60)

  GUICtrlCreateLabel('Remind me in:', 60 + ($GUI_iBNRSIZE[3] - 250), 125, 100, 25, $SS_CENTERIMAGE)
  $GUI_hGUITIME = GUICtrlCreateCombo('', 60 + ($GUI_iBNRSIZE[3] - 150), 125, 150, 25, $CBS_DROPDOWNLIST)
    GUICtrlSetData($GUI_hGUITIME, '10 minutes|1 hour|4 hours', '10 minutes')

  GUICtrlCreateGraphic(0, 160, $GUI_iBNRSIZE[4] + $GUI_iBNRSIZE[3] + 10, 40)
  GUICtrlSetBkColor(-1, 0xF0F0F0)
  GUICtrlSetColor(-1, 0xDFDFDF)
  GUICtrlSetState(-1, $GUI_DISABLE)

  If $PAR_vRESTART = 1 Then $BTN_hGUIEXIT = GUICtrlCreateButton('Cancel', 60 + ($GUI_iBNRSIZE[3] - 300), 168, 100, 24)
  $BTN_hRESTART = GUICtrlCreateButton('Restart now', 60 + ($GUI_iBNRSIZE[3] - 200), 168, 100, 24)
  $BTN_hGUIWAIT = GUICtrlCreateButton('Postpone', 60 + ($GUI_iBNRSIZE[3] - 100), 168, 100, 24)

  GUISetState()
  AdlibRegister('_FNC_POSTPONE', 1000)
  While 1

    $MSGTRAY = TrayGetMsg()
    Switch $MSGTRAY
      Case $TRAY_EVENT_PRIMARYUP
        If $GLB_TRAYSET = 1 Then
          TraySetState(2)
          GuiSetState(@SW_RESTORE, $GUI_hGUINAME)
          GuiSetState(@SW_SHOW, $GUI_hGUINAME)
          $GLB_TRAYSET = 0
        EndIf
    EndSwitch
    Switch GUIGetMsg()
      Case $BTN_hGUIEXIT
        Exit
      Case $GUI_EVENT_CLOSE
        $VAR_iGUITIME = 600000
        If $GLB_TRAYSET = 0 Then
          GuiSetState(@SW_MINIMIZE, $GUI_hGUINAME)
          GuiSetState(@SW_HIDE, $GUI_hGUINAME)
          TraySetState(1)
          $GLB_TRAYSET = 1
        EndIf
      Case $BTN_hGUIWAIT
        Switch GUICtrlRead($GUI_hGUITIME)
          Case '10 minutes'
            ;~   600000ms = 10 minutes
            $VAR_iGUITIME = 6000
            If $GLB_TRAYSET = 0 Then
              GuiSetState(@SW_MINIMIZE, $GUI_hGUINAME)
              GuiSetState(@SW_HIDE, $GUI_hGUINAME)
              TraySetState(1)
              $GLB_TRAYSET = 1
            EndIf
          Case '1 hour'
          ;~  3600000ms = 1 hour
            $VAR_iGUITIME = 3600000
            If $GLB_TRAYSET = 0 Then
              GuiSetState(@SW_MINIMIZE, $GUI_hGUINAME)
              GuiSetState(@SW_HIDE, $GUI_hGUINAME)
              TraySetState(1)
              $GLB_TRAYSET = 1
            EndIf
          Case '4 hours'
            ;~ 14400000ms = 4 hours
            $VAR_iGUITIME = 14400000
            If $GLB_TRAYSET = 0 Then
              GuiSetState(@SW_MINIMIZE, $GUI_hGUINAME)
              GuiSetState(@SW_HIDE, $GUI_hGUINAME)
              TraySetState(1)
              $GLB_TRAYSET = 1
            EndIf
        EndSwitch
      Case $BTN_hRESTART
        Shutdown(22, $ARR_sMESSAGE[$PAR_vRESTART][0])
    EndSwitch
  WEnd
EndFunc

Func _FNC_POSTPONE()
  If $VAR_iGUITIME > 0 Then
    $VAR_iGUITIME -= 1000
    Return
  Else
    If $GLB_TRAYSET = 1 Then
      TraySetState(2)
      GuiSetState(@SW_RESTORE, $GUI_hGUINAME)
      GuiSetState(@SW_SHOW, $GUI_hGUINAME)
      $GLB_TRAYSET = 0
    EndIf
  EndIf
EndFunc

Open in new window

Restart.png
0
Top 6 Sources for Identifying Threat Actor TTPs

Understanding your enemy is essential. These six sources will help you identify the most popular threat actor tactics, techniques, and procedures (TTPs).

 

Author Comment

by:rmessing171
Comment Utility
Thank you very much for this script, this is exactly what I require!  Unfortunately, I do not have the Resources.au3 and StringSize.au3 and files in my C:\Program Files (x86)\AutoIt3\Include folder.  Is there another place I can obtain them?
0
 
LVL 29

Expert Comment

by:matrixnz
Comment Utility
Sorry about that, I've attached the versions I have, these were written by other AutoIT members, if you want to try the latest you can use the urls below, although I don't know if any newer changes have been made which could break the script.

Resources.au3 - http://www.autoitscript.com/forum/topic/51103-resources-udf/
StringSize.au3 - http://www.autoitscript.com/forum/topic/114034-stringsize-m23-new-version-16-aug-11/
Resources.txt
StringSize.txt
0
 

Author Comment

by:rmessing171
Comment Utility
Thank you!  This helped me out tremendously!
0
 
LVL 29

Expert Comment

by:matrixnz
Comment Utility
No worries, please note that for testing I did change the variable $VAR_iGUITIME = 600000 to 6000 (6 seconds) so I didn't have to wait for 10 minutes, but forgot to change it back.
Change:
;~   600000ms = 10 minutes
            $VAR_iGUITIME = 6000
To:
;~   600000ms = 10 minutes
            $VAR_iGUITIME = 600000

Cheers
0

Featured Post

Better Security Awareness With Threat Intelligence

See how one of the leading financial services organizations uses Recorded Future as part of a holistic threat intelligence program to promote security awareness and proactively and efficiently identify threats.

Join & Write a Comment

Whether you’re a college noob or a soon-to-be pro, these tips are sure to help you in your journey to becoming a programming ninja and stand out from the crowd.
In this post we will learn how to connect and configure Android Device (Smartphone etc.) with Android Studio. After that we will run a simple Hello World Program.
In this fourth video of the Xpdf series, we discuss and demonstrate the PDFinfo utility, which retrieves the contents of a PDF's Info Dictionary, as well as some other information, including the page count. We show how to isolate the page count in a…
In this fifth video of the Xpdf series, we discuss and demonstrate the PDFdetach utility, which is able to list and, more importantly, extract attachments that are embedded in PDF files. It does this via a command line interface, making it suitable …

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now