Author Posts

May 11, 2016 at 4:02 pm

I need to use PowerShell to capture the F12 application code/logs for diagnosis purposes from IE and can easily do this with the following code:

>> $oIE=new-object -com internetexplorer.application
>> $oIE.Visible = $true
>> $oIE.navigate2("microsoft.com")
>> $oIE.Document.documentElement | out-file -filepath("c:\users\antho\desktop\IE.txt")

But I then need to be able to do this on a system where I did not start IE, and need to find which browser is pointing to the site I am interested in.

I know I can find IE with the following:

PS C:\Windows\system32> get-process iexplore

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id SI ProcessNa
——- —— —– —– —– —— — — ———
634 43 13524 43236 ...53 4.13 12424 4 iexplore
824 54 53824 71488 474 243.27 74916 4 iexplore
934 59 76052 96608 491 98.11 131556 4 iexplore

However I then want to be able to test each iexplore to see which one is running the web session I am interested in.

I know that I can use $oIE.document.documentElement from above, but what I don't know is how to do this with the three iexplore sessions that I just identified. Ideally I want to be able to test each of the domains or web address and then grab the .documentElement for that browser.

I have spent a couple of days trying to crack this I seem to be running in circles.

Any pointers here would be fabulous.

May 11, 2016 at 5:42 pm

It's a tricky problem. The System.Runtime.InteropServices.Marshal class has a GetActiveObject() method ( https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.getactiveobject%28v=vs.100%29.aspx ), but it will only return the first instance found. COM has something called the running object table that you can use to manage multiple instances, but there's no easy way to do that built into .NET already, and a quick web search seems to indicate that people are having problems with the ROT giving you back the same instance when they're trying to do something similar to what you're describing: http://adndevblog.typepad.com/autocad/2013/12/accessing-com-applications-from-the-running-object-table.html

May 11, 2016 at 9:15 pm

A follow-on question

1. Does the HWND window handle of the l current Internet Explorer window match any of the properties in get-process.

Thanks

May 12, 2016 at 3:40 am

Either option should work for you, but I noticed the size of each text file was inconsistent when testing each address multiple times.

# ComObject Method
$addresses = "www.microsoft.com
www.google.com
www.powershell.org" -split "`n"

# Get all open shell windows
$app = New-Object -ComObject 'shell.application'

# Export each documentElement
foreach ($address in $addresses){
    $ie = New-Object -ComObject 'InternetExplorer.Application'
    $ie.navigate($address)
    $ie.visible = $true
    while ($ie.Busy){Start-Sleep -Seconds 2}
    [void]($address -match "\.(?'name'.*)\.") ; $name = $Matches['name']
    $window = $app.windows() | Where-Object {
        $_.Name -eq 'Internet Explorer' -AND $_.LocationURL -like "*$name*"}
    $window.Document.documentElement | Out-File ".\Desktop\test\$address.txt"
    $window.Quit()
}
# Invoke-WebRequest Method
foreach ($address in $addresses){
    $useragent = '([Microsoft.PowerShell.Commands.PSUserAgent]::InternetExplorer)'
    $request = Invoke-WebRequest -Uri $address -UserAgent $useragent
    $request.ParsedHtml.documentElement | Out-File ".\Desktop\test\$address.txt"
$app = New-Object -ComObject 'shell.application'
$handles = (Get-Process -Name iexplore).MainWindowHandle
foreach ($handle in $handles){
   $window = $app.windows() | Where-Object {$_.HWND -eq $handle}
   $window.Document.documentElement | Out-File ".\Desktop\test\$handle.txt"
}

May 12, 2016 at 10:03 am

Thanks for the direction so far.
I need to identify each instance of Internet Explorer already running and not start new sessions.
I am doing this via
$Test1 = ( get-process | Where-Object {$_.ProcessName -Eq 'iexplore'} | select -ExpandProperty mainWindowHandle )

And this gives me a list of windows handles:
396408
199978
330736
789426

What I then need to do is to get access to the IE document properties such as:
$ie.document.documentElement
At the moment I only know how to do this when you create a new-object:
$ie = New-Object -ComObject 'InternetExplorer.Application'
However, I need to do this for an existing object that I have identified via the windows handle as above.
Thanks 

May 12, 2016 at 12:43 pm

Try the third option on my previous post. Some of the handles and HWND are identical.

May 12, 2016 at 2:07 pm

Thanks this works, I appreciate the help 🙂