Jump to content

Any other method besides Shell.Windows for creating _IEAttach browser object?

Recommended Posts

I have been working on an script for work now for quite some time and I finally worked through all my bugs and have the script working great on my desktop.  My ultimate goal however is to run this script on top of another web app as part of a Citrix published app.  However it looks like _IEAttach doesn't want to recognize any browser instances when ran as a published app in Citrix.  It runs fine if I login to Citrix and run it from a desktop.  I found this old thread, but it looks like it was never resolved.

'?do=embed' frameborder='0' data-embedContent>>

I have requested authorization to load AutoIT and sciTE on the Citrix server, but I have not heard back from the admin yet.  I do have a folder on the Citrix server where I can copy my EXEs to for testing.  I'm using straight AutoIT help examples below to show the issues I am seeing so that they will be easy to recreate.

When I compile the WinList HelpFile Example and run it from the Citrix server it sees my browser instances as windows:

#include <MsgBoxConstants.au3>


Func Example()
    ; Retrieve a list of window handles.
    Local $aList = WinList()

    ; Loop through the array displaying only visable windows with a title.
    For $i = 1 To $aList[0][0]
        If $aList[$i][0] <> "" And BitAND(WinGetState($aList[$i][1]), 2) Then
            MsgBox($MB_SYSTEMMODAL, "", "Title: " & $aList[$i][0] & @CRLF & "Handle: " & $aList[$i][1])
EndFunc   ;==>Example

But when I compile and run one of the HelpFile _IEAttach examples (below) and run it from the Citrix server, it immediately errors out with:

Line 201 (File "M:StickyNotesIEInstance.exe" ):

Error: Variable must be of type "Object".

#include <IE.au3>
#include <MsgBoxConstants.au3>

Local $aIE[1]
$aIE[0] = 0

Local $i = 1, $oIE
While 1
    $oIE = _IEAttach("", "instance", $i)
    If @error = $_IEStatus_NoMatch Then ExitLoop
    ReDim $aIE[$i + 1]
    $aIE[$i] = $oIE
    $aIE[0] = $i
    $i += 1

MsgBox($MB_SYSTEMMODAL, "Browsers Found", "Number of browser instances in the array: " & $aIE[0])

I am really so close on this and I would really appreciate any help you guys could spare.

Edited by MuffinMan
Link to comment
Share on other sites

  • Moderators

Can you please clarify your methodology? You want to run the IE instance as a published app, and use an AutoIt script to do an IEAttach from the client desktop - is that correct?

Depending on how the app is being published, this may be problematic at best. Whether you're doing it through Citrix or VMWare, the whole point of publishing applications is encapsulation. If your script sits outside the virtualization "bubble" it is going to be nigh impossible to attach to it.

If you're talking about embedding both AutoIt and IE into the published app, however, that is another matter.

"Profanity is the last vestige of the feeble mind. For the man who cannot express himself forcibly through intellect must do so through shock and awe" - Spencer W. Kimball

How to get your question answered on this forum!

Link to comment
Share on other sites

Thanks for the quick response, I'll be glad to clarify.  I have done this before with another script I created, but that script did not have to attach to or interact with IE.  the published app is a batch file that runs the script, runs the webapp in IE and then waits for IE to close to kill the script, like this...

start M:StickyNotesmyscript.exe
"M:Program Files (x86)Internet Exploreriexplore.exe" http://3rdpartyURL

tskill myscript /a

I have tried starting the webapp from the script via _IECreate, which works, but the _IEAttach still kills the script.  The 3rd party app has multiple nested frames that i have to traverse to get at the data I need.  The script works fine from my desktop, works fine from the Citrix server desktop,, but always fails when ran as a published app.

When I compile and run the WinList example, I see all the browsers as windows, so I would think my script is running in the same bubble, right?

Please let me know if you have any other questions or ideas.

Edited by MuffinMan
Link to comment
Share on other sites

So I have continued to work this issue and I still haven't figured out why _IEAttach bombs when running as a Citrix published app. I combined the WinList example with the _IEAttach example to try and attach based on the hwnd, but that didn't work either

Sleep(6000) ; make sure all Citrix browser windows have loaded
Local $aList = WinList()
    ; Loop through the array displaying only visable windows with a title.
    For $i = 1 To $aList[0][0]
        If $aList[$i][0] <> "" And BitAND(WinGetState($aList[$i][1]), 2) AND StringLeft($aList[$i][0],15) = "1st15CharsofWin" Then
            MsgBox(0,"Found Window",$aList[$i][0])
            $oIE = _IEAttach($aList[$i][1], "hwnd")
MsgBox(0,"","Script Finished")

I get the "Found Window" MsgBox, and then I get same error as in my original script


I know not everyone here has access to Citrix, but any help or other possibilities would be greatly appreciated.

Link to comment
Share on other sites

I have been researching this further and finally found an old thread that mentioned you could run the sciTE executable itself without an install so I thought I would give it a try, using the code I posted above.  This is what I got from the output window just running the .au3 file:

>Running AU3Check (  from:\\connect4\c$\Program Files\AutoIt3  input:M:\StickyNotes\winlist.au3
+>15:42:30 AU3Check ended.rc:0
>Running:(\\connect4\c$\Program Files\AutoIt3\autoit3_x64.exe "M:\StickyNotes\winlist.au3"    
--> Press Ctrl+Alt+Break to Restart or Ctrl+Break to Stop
"\\connect4\c$\Program Files\AutoIt3\Include\IE.au3" (381) : ==> Variable must be of type "Object".:
For $o_window In $o_ShellWindows
For $o_window In $o_ShellWindows^ ERROR
->15:42:39 AutoIt3.exe ended.rc:1
+>15:42:39 AutoIt3Wrapper Finished.
>Exit code: 1    Time: 10.32

So does that mean that for some reason AutoIt isn't recognizing those Citrix published IE windows as true browsers?  This is getting way over my head quickly, but I am willing to do whatever it takes to get this working.  If you have any suggestions or can point me in any direction to troubleshoot this further I would be truly thankful.

Link to comment
Share on other sites

OK, another day and another thread bump with my findings.  I added a bunch of MsgBox break points into IE.au3 and I have determined the error I am getting is acually an error with ObjCreate("shell.application") and the ".windows" function that gets the collection of open shell windows.  I will attempt to update the title of the thread (not sure if I can) to reflect this and possibly get some additional help.

This ObjCreate example script (below) works just fine, unless it is ran as a Citrix published app and then it fails...

; Counting the number of open shell windows

Local $oShell = ObjCreate("shell.application") ; Get the Windows Shell Object
Local $oShellWindows = $oShell.windows ; Get the collection of open shell Windows

;If IsObj($oShellWindows) Then <--- REMing out the Object check to force the error
    Local $sString = "" ; String for displaying purposes

    For $oWnd In $oShellWindows ; Count all existing shell windows <---This where the hard error occurs
        $sString &= $oWnd.LocationName & @CRLF

    MsgBox(0, "", "Shell Windows:" & @CRLF & "You have the following shell windows:" & @CRLF & @CRLF & $sString)

So this seems to be some sort of COM issue, which I know nothing about.  Some more Googling revealed this about Published Apps in Citrix:

From: http://support.citrix.com/article/CTX138775

Seamless Published applications differ from regular published applications by appearing as if it is running directly on the local device and not in a windowed session as in the case with a fixed window published application or in a published desktop. Another difference is, the Windows Desktop/Shell is not present in a Seamless session.

i have a call in to our Citrix admin to see if there is a "non-seamless" published option, but I'm guessing not.  I still don't understand why Winlist always sees the running Citrix windows, but the shell functions do not.  Does anyone know of a way I could edit the IE3.au3 to use another method of attaching to IE or perhaps bypass the browser check altogether?  I don't have the programming prowess to do it, but I do know the window I am attaching to is a browser window because it's the only window I am allowing to be opened by Citrix.

This thread hasn't received much love, and I know no one here owes me a darned thing, but if there's any information I am leaving out or something I need to add in order for this to make more sense please let me know.  I am really desperate to get this working.

Link to comment
Share on other sites

I'm bumping this thread again, I've tried every trick I know and still can't get my script to attach to IE when I run the script from the Citrix server as a published app.  Out of desperation, I downloaded a 30 day trial of WinAutomation.  Surprisingly enough, whatever method they use to attach to an IE session also works when ran in Citrix.  Unfortunately, their fill-in-the-blank programming system seems a little clunky and inflexible; I would MUCH rather use AutoIt.

I'm going to update the thread title once again (or should I begin a new thread?) because I guess my real question now becomes is there any other method of creating the object that _IEAttach uses that doesn't involve Shell.Windows?

Link to comment
Share on other sites

  • 2 years later...



I had the same problem (and was pretty much ready to give up - actually it was worse than that).  But I tried another approach.  Let me explain what I am trying to do, and what I found that seems to work.

- I wanted to close all existing open internet explorer windows

; Close all open internet explorer windows
Local $IEWindowList = WinList()
Local $WindowCounter = $IEWindowList[0][0]
While $WindowCounter >= 0
   If 0 <> StringInStr($IEWindowList[$WindowCounter][0], "Internet Explorer") Then
      ConsoleWrite("*** Closing Internet Explorer Applications using WinList approach - " & $IEWindowList[$WindowCounter][0] & @CRLF)
   $WindowCounter = $WindowCounter - 1

- I wanted to use _IEAttach but got the same error that you got (while using citrix iwth autoit installed in portable mode);
  I looked at the line in IE.au3 and found the same problem that you found

- I am guessing that the com object reference created by ObjCreate is the same reference returned by _IEAttach;  I am hoping to verify that soon.  So, I decided to directly create an InternetExplorer.Application com object.  Note that it does not always suceed the first time so I have it in a loop until it does succeed.

; Try to create internet explorer automation object (which I believe to also be a com object)
; - It doesn't always succeed the first time so I repeat until it succeeds
Local $IEWindowComObject = ObjCreate("InternetExplorer.Application")
while @error <> 0
   ConsoleWrite("*** Just attempted to create internet explorer com object " & @error & @CRLF)
   $IEWindowComObject = ObjCreate("InternetExplorer.Application")

; Make it visible and go to ipad and then wait until the window is read
$IEWindowComObject.Visible = true;
If @error then
While 1
   If $IEWindowComObject.readyState = "complete" or $IEWindowComObject.readyState = 4 then ExitLoop

- I needed the title to determine the state the window is open; in my case there are actually two possibilities

; Get window handle, needed to get the title, of new internet explorer window
$IEWindowList = WinList()
$WindowCounter = $IEWindowList[0][0]
Local $IEWindowHandle = 0
While $WindowCounter >= 0 AND $IEWindowHandle = 0
   If 0 <> StringInStr($IEWindowList[$WindowCounter][0], "Internet Explorer") Then
      ConsoleWrite("*** Found Internet Explorer window - " & $IEWindowList[$WindowCounter][0] & @CRLF)
      $IEWindowHandle = $IEWindowList[$WindowCounter][1]
   $WindowCounter = $WindowCounter - 1

; Get window title
Local $IEWindowTitle = ""
IF $IEWindowHandle <> 0 Then
   $IEWindowTitle = WinGetTitle($IEWindowHandle)
ConsoleWrite($IEWindowTitle & @CRLF)

- As I mentioned before, I think that $IEWindowComObject is the value that should have been returned by _IEAttach if it worked.

If I am correct about this, that the com object reference is the reference returned by _IEAttach when it works, it would be extremely helpful if the documentation was modified to indicate this.

All the best . . .

Phil Troy

Edited by JLogan3o13
Added Code Formatting
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Create New...