Не удается найти процесс iexplorer на основе HWND, когда IE перемещается в локальный файл? - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь найти процесс для Internet Explorer com-объекта, приведенный ниже код работает, когда IE com-объект перемещается по URL-адресу, напримерgoogle.nl, но при переходе к локальному html-файлу это не так.

Некоторая информация о функции:

  1. создает новый com-объект ieplorer
  2. изменяет некоторые свойства для com-объекта iexporer.
  3. использует функцию навигации из com-объекта ieplorer с указанным URL-адресом
  4. , возвращает объект процесса для этого com-объекта.объект, основанный на HWND.

Проблема существует на шаге 4, это простая логика, где:

Get-Process -Name iexplore | Where-Object {$_.MainWindowHandle -eq $ie.HWND}

Я пробовал несколько вещей, даже построение с задержкой, но как-то этоне работает.Если попробовать логику извне функции, напрямую указав HWND, она работает, например:

PS C:\> Start-IELockedDown localhost
HWND = 659256
HWND Type = int
IE Processes:
@{Name=iexplore; MainWindowHandle=919956}
@{Name=iexplore; MainWindowHandle=397090}
@{Name=iexplore; MainWindowHandle=659256} #matching Entry
@{Name=iexplore; MainWindowHandle=0}
@{Name=iexplore; MainWindowHandle=69090}
@{Name=iexplore; MainWindowHandle=0}
IE with correct HWND
#Nothing?
After this comes the RETURN:
#Also Nothing!

PS C:\> Get-Process -Name iexplore | Where-Object {$_.MainWindowHandle -eq 659256}

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    582      42     9656      30940       0,50  10260   2 iexplore

Примеры отладки:

1 Когда я запускаю команду с внешним и работающим веб-сайтом, подобным этомуStart-IELockedDown google.nl это на самом деле работает:

HWND = 921524
IE Processes:
@{Name=iexplore; MainWindowHandle=921524} #Matching entry
@{Name=iexplore; MainWindowHandle=724706}
@{Name=iexplore; MainWindowHandle=69090}
@{Name=iexplore; MainWindowHandle=0}
IE with correct HWND
@{Name=iexplore; MainWindowHandle=921524} #Logic works
After this comes the RETURN:

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    480      31     7092      26848       0,22  18912   2 iexplore

2 Когда я использую путь к файлу вместо внешнего веб-сайта, как это Start-IELockedDown (Get-Item .\blank-page.html | Select-Object -ExpandProperty FullName) логика кажется сломанной:

HWND = 3015698
IE Processes:
@{Name=iexplore; MainWindowHandle=0}
@{Name=iexplore; MainWindowHandle=3015698} #Matching Entry
@{Name=iexplore; MainWindowHandle=1248958}
@{Name=iexplore; MainWindowHandle=69090}
@{Name=iexplore; MainWindowHandle=0}
IE with correct HWND
#Nothing?
After this comes the RETURN:
#Also nothing!

3 Когда я запускаюэто против localhost, который не отвечает, так как у меня нет локального веб-сервера, работающего как этот Start-IELockedDown LocalHost, это дает мне ту же проблему:

HWND = 986890
IE Processes:
@{Name=iexplore; MainWindowHandle=986890} #Matching Entry
@{Name=iexplore; MainWindowHandle=1051034}
@{Name=iexplore; MainWindowHandle=69090}
@{Name=iexplore; MainWindowHandle=2361678}
@{Name=iexplore; MainWindowHandle=0}
IE with correct HWND
#Nothing?
After this comes the RETURN:
#Also Nothing!

Полный код:

function Start-IELockedDown {
    <#
    .SYNOPSIS
        Open IE without navigation controlls.
    .DESCRIPTION
        Long description
    .EXAMPLE
        PS C:\> Invoke-IELockedDown -URL "http://localhost:8080/"
        Opens a Internet Explorer browser window without navigational controlls that navigates to the specified URL.
    .INPUTS
        None
    .OUTPUTS
        InternetExplorer Process Object.
    .NOTES
        General notes
    #>
    [CmdletBinding()]
    param (
        [string] $URL
    )

    # Create IE com object
    $ie = New-Object -com InternetExplorer.Application

    # Turns off the unnecessary menus and tools and sets the window as resizable
    $ie.AddressBar = $false
    $ie.MenuBar = $false
    $ie.ToolBar = $false
    $ie.Resizable = $true
    $ie.StatusBar = $false

    # Sets the size of the window and make it visible
    $ie.Top = 20
    $ie.Left = 20
    $ie.Width = 1280
    $ie.Height = 1024
    $ie.Visible = $true

    ## Navigate the browser to the specified URL.
    $ie.Navigate($URL)        

    # For Debugging / the StackOverflow Guru's
    Write-host "HWND = $($ie.HWND)"
    Write-Host "IE Processes:"
    Get-Process -Name iexplore | Select-Object Name, MainWindowHandle | Write-host
    Write-Host "IE with correct HWND"
    Get-Process -Name iexplore | Select-Object Name, MainWindowHandle | Where-Object {$_.MainWindowHandle -eq $ie.HWND} | Write-Host    
    Write-Host "After this comes the RETURN:"    

    # Return the Process Object for the IE Com Object
    return Get-Process -Name iexplore | Where-Object {$_.MainWindowHandle -eq $ie.HWND}
}

1 Ответ

0 голосов
/ 22 мая 2018

Эта проблема существует только для сеансов PowerShell без повышенных прав.Если вы хотите решить эту проблему, вы можете запустить сеанс PowerShell с повышенными правами (т. Е. Запустить от имени администратора) или захватить HWND, прежде чем перейти к URL-адресу и сослаться на него.

function Start-IELockedDown {
    <#
    .SYNOPSIS
        Open IE without navigation controlls.
    .DESCRIPTION
        Long description
    .EXAMPLE
        PS C:\> Invoke-IELockedDown -URL "http://localhost:8080/"
        Opens a Internet Explorer browser window without navigational controlls that navigates to the specified URL.
    .INPUTS
        None
    .OUTPUTS
        InternetExplorer Process Object.
    .NOTES
        General notes
    #>
    [CmdletBinding()]
    param (
        [string] $URL
    )

    # Create IE com object
    $ie = New-Object -com InternetExplorer.Application
    $HWND = $ie.HWND

    # Turns off the unnecessary menus and tools and sets the window as resizable
    $ie.AddressBar = $false
    $ie.MenuBar = $false
    $ie.ToolBar = $false
    $ie.Resizable = $true
    $ie.StatusBar = $false

    # Sets the size of the window and make it visible
    $ie.Top = 20
    $ie.Left = 20
    $ie.Width = 1280
    $ie.Height = 1024
    $ie.Visible = $true

    ## Navigate the browser to the specified URL.
    $ie.Navigate($URL)        

    # For Debugging / the StackOverflow Guru's
    Write-host "HWND = $($ie.HWND)"
    Write-Host "IE Processes:"
    Get-Process -Name iexplore | Select-Object Name, MainWindowHandle | Write-host
    Write-Host "IE with correct HWND"
    Get-Process -Name iexplore | Select-Object Name, MainWindowHandle | Where-Object {$_.MainWindowHandle -eq $HWND} | Write-Host    
    Write-Host "After this comes the RETURN:"    

    # Return the Process Object for the IE Com Object
    return Get-Process -Name iexplore | Where-Object {$_.MainWindowHandle -eq $HWND}
}
...