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 post
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 post
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 post
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 post
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 post
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 post
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 post
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 post
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
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By walec
      I have problem with Set Value for control slider on webside.
      Anyone have any idea for a solution?
      I tried but it doesn't work.
      Local $Strength = _IEGetObjById($oIE_Strona, "strength_value") Local $oText = _IEFormElementGetObjByName($Strength, "valuee") _IEFormElementSetValue($oText, "6") or
      _IENavigate ($oIE_Strona, "https://guantanamo.prisonwarsonline.com/gym/") Local $oDiv = $oIE_Strona.Document.GetElementByID("strength_value") Local $oAttribute = $oDiv.getAttribute("valuee") If IsObj ( $oAttribute ) Then $oAttribute.value = "6" EndIf Best Regards
    • By Mariog2000
      I've tried for a few days to simply open a url in IE and click an IE object that I can't "TAB" to and don't want to use a mouse-click if at all possible.  I've read up on things like using IEAction and IETagNameGetCollection to find the object but not smart enough to figure out how that works with my url or how to tell if my url is "basic" or a "form", "frameset", "iframe", etc.
      The other problem is I've tried using the "Run" and "ShellExecute" commands to open the browser, which works, but it opens it in a way that doesn't include my currently logged in user account.  For example, if I just click IE or Chrome for that matter and open my default homepage of google, the page that opens knows I'm logged in.  When I use "Send" "ShellExecute" or "_IE_Create" they always open pages generically which would require a login.
      So questions are, if I have a URL I'm trying to open, that's passes the currently logged on users credentials when opening the page (no clue where that happens)
      1.  Are there any code examples someone is willing to share that opens my IE maximized, with logged in credentials, and
      2.  Once that works, can someone suggest a technique a non-developer can find which IE Objects I need to send a "click" to so it opens the correct menu, pop-up, url, etc., associated with that object.  I've copied what doesn't work and sure I'm way off but it's not for a lack of effort. I'll keep trying and post updates but not looking good 🙂
      #include <IE.au3>
      Call ("selection")
      Func selection ()
      Global $oIE = _IECreate ("https://internal-webpage.aspx")
      Local $selectid = _IEGetObjByName ($oIE, "signageNo")
      Local $button = _IEGetObjByName ($oIE, "GO")

      _IEFormElementOptionSelect ($selectid, "3")
      _IEAction ($button,"click")
      #include <IE.au3> Call ("selection") Func selection () Global $oIE = _IECreate ("https://internal-webpage.aspx") Local $selectid = _IEGetObjByName ($oIE, "signageNo") Local $button = _IEGetObjByName ($oIE, "GO") _IEFormElementOptionSelect ($selectid, "3") _IEAction ($button,"click") EndFunc 1. 
    • By PoojaKrishna
      I am trying to print items from Outlook in a Citrix machine. I am printing the items into PDF files using ‘Microsoft Print to PDF option’. I am using OutlookEX.au3 for printing items.
      Everything is working fine except handling the ‘Save Print Output As’ dialog appearing while trying to print the file to PDF.
      I have set the default printer to ‘Microsoft Print to PDF’ from the control panel ( Control Panel\All Control Panel Items\Devices and Printers) and using the following method to print the item.
      _OL_ItemPrint($oOutlook, $OL_Item) ;print item I am not able to handle the ‘Save Print Output As’ dialog initiated by the print statement in the Citrix machine. The WinActive method always returns false. I have tried with ControlSetText, ControlClick and Send methods also.
      Can anyone please help?
      Func _SavePDF($sFilePath) WinActivate ( "Save Print Output As", "") WinWaitActive ( "Save Print Output As", "",5 ) If WinActive("Save Print Output As") Then sleep(500) Send($sFilePath) sleep(500) Send("{ENTER}") sleep(500) EndIf EndFunc;=>_SavePDF  
    • By zuladabef
      I want to set the value of a input, but I only have the input name and input id.  I cannot find a form in the source.  Form collection does not return any results.  
      Is there a way to use FormElementSetValue without a form name? Can I use _IEGetObjByName or _IEGetObjById?  If so, how do I set the value once I have the object? Where do I go from here? Local $oIE = _IEAttach("[Website Goes Here"]) Local $oForm = _IEFormGetCollection($oIE, 1) Local $oQuery = _IEFormElementGetCollection($oForm, 4) _IEFormElementSetValue($oQuery, "Set it to this")  
    • By Seminko
      Hey there,
      below function returns an "object collection" (not sure if that's the correct term) of 'a' elements grabbed from within //*[@id="J_DetailMeta"].
      However, I need the returned collection not to include objects with 'aria-disabled = true'. Is there a way of removing specific objects from such a collection?
      Func GetObjectList($sPicker) $oDetailMeta = _IEGetObjById($oIE, "J_DetailMeta") If Not @error Then $tags = $oDetailMeta.GetElementsByTagName("ul") For $tag in $tags $data_ID_value = $tag.GetAttribute("data-property") If $sPicker = "color" Then If $data_ID_value = '????' Or $data_ID_value = "????" Then $oReturnList = $tag.GetElementsByTagName("a") EndIf ElseIf $sPicker = "network" Then If $data_ID_value = '????' Then $oReturnList = $tag.GetElementsByTagName("a") EndIf ElseIf $sPicker = "storage" Then If $data_ID_value = '????' Then $oReturnList = $tag.GetElementsByTagName("a") EndIf EndIf Next EndIf Return $oReturnList EndFunc $oColorList = GetObjectList("color") For $oColor In $oColorList If StringInStr($oColor.GetAttribute("aria-disabled"), "true") <= 0 Then ; remove object from the collection ??? EndIf Next  
  • Create New...