2

我想使用 Powershell 在 Web 控制台上自动配置接入点。

我在 Win8/IE10 上开发,测试代码时一切正常。不幸的是,我在开发/测试后收到了“生产系统”。现在代码应该可以在 Windows Server 2012 R2/IE11 上运行。

这是我连接和登录接入点的代码(简化):

$IE = New-Object -ComObject "InternetExplorer.Application"
$IE.Visible = $true #1#
$IE.Navigate("192.168.0.100")
Write-Host $IE.LocationName

$IE.Document.GetElementByID("login-username").Value = "admin"
$IE.Document.GetElementByID("login-password").Value = "admin"
$IE.Document.GetElementByID("login-btn").Click()
Write-Host $IE.LocationName

出于调试原因,我通常会显示窗口(注释 #1#)。首先,Write-Host 显示正确的位置(“登录”)。在第二个 Write-Host 处,显示了错误的位置(“about:blank”)。在 IE 窗口中,您会看到正确的位置/选项卡名称(“AP”)。似乎 IE 对象变得无法使用,其他属性(如 $IE.Document.*)则不起作用。我必须手动关闭窗口。

我有两种解决方法:

  1. 当我在登录前手动单击 IE 窗口(获取焦点)时,它可以工作。
  2. 当我不显示窗口时($IE.Visible = $false),一切正常。

到目前为止我的场景/测试:

  1. IE ESC 被禁用。
  2. 我从另一台生产机器(2008R2)复制了 C:\Program Files (x86)\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll,所以 $IE.Document 函数可以工作(我的开发机器中的 dll 产生相同的错误)。
  3. 我尝试为每个区域启用/禁用保护模式(Internet 选项 > 安全),但对我不起作用(在reddit上找到)

其他人有尝试的想法吗?调试适用于解决方法,它也适用于(到目前为止)不可见的窗口 - 但我想了解这些麻烦......

谢谢,最好的问候, kvo

4

1 回答 1

0

将脚本部署到在 IE11 上运行的 Windows Server 2012 后,我遇到了这个问题。

造成这种情况的原因是丢失了 Powershell 创建的 IE 对象的处理程序。

我使用了以下代码段,在 PowerShell IE9 ComObject 中编写,在导航到网页后,它具有所有 null 属性以解决此问题。

function ConnectIExplorer() {
    param($HWND)

    $objShellApp = New-Object -ComObject Shell.Application 
    try {
      $EA = $ErrorActionPreference; $ErrorActionPreference = 'Stop'
      $objNewIE = $objShellApp.Windows() | ?{$_.HWND -eq $HWND}
      $objNewIE.Visible = $true
    } catch {
      #it may happen, that the Shell.Application does not find the window in a timely-manner, therefore quick-sleep and try again
      Write-Host "Waiting for page to be loaded ..." 
      Start-Sleep -Milliseconds 500
      try {
        $objNewIE = $objShellApp.Windows() | ?{$_.HWND -eq $HWND}
        $objNewIE.Visible = $true
      } catch {
        Write-Host "Could not retreive the -com Object InternetExplorer. Aborting." -ForegroundColor Red
        $objNewIE = $null
      }     
    } finally { 
      $ErrorActionPreference = $EA
      $objShellApp = $null
    }
    return $objNewIE
  } 




$HWND = ($objIE = New-Object -ComObject InternetExplorer.Application).HWND
$objIE.Navigate("https://www.google.com")
$objIE = ConnectIExplorer -HWND $HWND
于 2017-06-05T01:16:27.193 回答