IE: URL for specific PID

Show the URL for a given IE process.
This script does not fully support published applications. (Published Apps will not show the actual URL.) You may also get unusual or no results if IE is at a site which uses Unicode characters.
Version 4.5.24
Created on 2014-01-27
Modified on 2014-03-18
Created by Zeev Eisenberg
Downloads: 935

The Script Copy Script Copied to clipboard
<#
.SYNOPSIS
    Show the URL for a given IE process.
.DESCRIPTION
    This script retrieves the URL and web page title for a given PID. It does not fully support published applications. (Published Apps will not show the actual URL.)
    You may also get unusual or no results if IE is at a site which uses Unicode characters.
.PARAMETER Identity
   The name of the server being taken out of maintenance mode - automatically supplied by CU
#>

<#
Credits to: Tome Tanasovski
http://powertoe.wordpress.com/2010/11/10/finding-the-thread-pid-that-belongs-to-a-tab-in-ie-8-with-powershell/
Credits to: Tobias
http://powershell.com/cs/forums/t/8982.aspx
#>

$ErrorActionPreference = "Stop"

If (!(Get-Process iexplore -ErrorAction SilentlyContinue)) {
    Write-Error "IE is not running in this session." -ErrorAction Continue
    Exit 1
}

$iepid = $args[0]

$IEPIDList = @()
$IETabList = @()
$PIDTabList = @()

Function Get-PID()
{

$sig = @"
[DllImport("user32.dll", SetLastError=true)]
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
 
[DllImport("user32.dll")]
public static extern IntPtr GetTopWindow(IntPtr hWnd);
 
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);

public enum GetWindow_Cmd : uint {
    GW_HWNDFIRST = 0,
    GW_HWNDLAST = 1,
    GW_HWNDNEXT = 2,
    GW_HWNDPREV = 3,
    GW_OWNER = 4,
    GW_CHILD = 5,
    GW_ENABLEDPOPUP = 6
}
 
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
 
[DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
public static extern int GetWindowTextLength(IntPtr hWnd);
"@

    Add-Type -MemberDefinition $sig -Namespace User32 -Name Util -UsingNamespace System.Text

    $p=0
    $window = [User32.Util]::GetTopWindow(0)

    while ($window -ne 0) {
        [User32.util]::GetWindowThreadProcessId($window, [ref]$p) | Out-Null
        if ($iepid -eq $p) {
            $length = [User32.Util]::GetWindowTextLength($window)
            if ($length -gt 0) {
                $string = New-Object System.Text.Stringbuilder 1024
                [User32.Util]::GetWindowText($window,$string,($length+1)) | Out-Null
                if ($string.tostring() -notmatch '^MSCTFIME UI$|^Default IME$|^SysFader$|^MCI command handling window$|^Msg$|^ToolTip$|^DDE Server Window|^Dummy$|GDI\+ Window' ) {
                    $script:IEPIDList += $(new-object psobject -Property @{PID = $p;Title = $string.tostring()})
                }
            }
        }
        $window = [User32.Util]::GetWindow($window, 2)
    }
}

Function Get-URL()
{
    Try {
        $shell = New-Object -ComObject Shell.Application
        $shell.Windows() | Where-Object { $_.Type -eq 'HTML Document' } |
            Select-Object LocationName, LocationURL | ForEach-Object { $script:IETabList += $_ }
    } Catch {
        Write-Host "This is likely a published application and not supported in this script. Here is all the information we could gather:"
        $IEPIDList | fl
        Exit 1
    }
}


# Main

Get-PID
Get-URL

Foreach ($Tab in $IETabList)
{
    Foreach ($Process in $IEPIDList)
    {
        If ($Process.Title -match [regex]::escape($Tab.LocationName))
        {
            $PIDTabList += $(new-object psobject -Property @{PID = $Process.PID;URL = $Tab.LocationURL;Title = $Tab.LocationName})
        }
    }
}

If ($PIDTabList) {
    $PIDTabList | fl
    If ($IEPIDList.Count -ne $PIDTabList.Count) {
        Write-Host "There is at least one URL for which we are not able to determine from the PID."
        Write-host "Here is the complete tab list for your inspection."
        $IETabList | fl
        Write-Host "PID List:"
        $IEPIDList | fl
    }
}
Else {
    Write-Host "There is no match by title. This may be due to Unicode characters in the tab title."
    Write-Host "The complete output of the tables is below for inspection:"
    Write-Host "Tab List: " 
    $IETabList | fl
    Write-Host "PID List: "
    $IEPIDList | fl
    Exit 1
}