首页 文章

导航到网页后,PowerShell IE9 ComObject具有所有null属性

提问于
浏览
2

我有一个PowerShell脚本导航到我们内部网上的(可能是)经典ASP页面,以停止在我们的服务器上运行的Windows服务,作为该服务部署过程的一部分(并在部署新文件后重新启动它) . 它运行良好,直到我们最近升级到IE9 . 这是脚本 .

# Open service page in IE
$ie = new-object -comobject InternetExplorer.Application
$ie.visible = $true
$ie.navigate($serviceUrl)
while($ie.busy) { start-sleep 1 }

# Stop service
$ie.Document.getElementById("dropDownActionList").value = "Stop"
$ie.Document.getElementById("buttonTakeAction").click()
while($ie.busy) { start-sleep 1 }

现在,当我运行脚本时,它成功启动IE,但抛出以下错误:

You cannot call a method on a null-valued expression.
At C:\Projects\ABC\Scripts\Deploy.ps1:85 char:28
+ $ie.Document.getElementById <<<< ("dropDownActionList").value = "Stop"
    + CategoryInfo          : InvalidOperation: (getElementById:String) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

当我在PowerShell中进行调查时,我发现如果我创建IE ComObject,它首先具有有效属性,但是当我导航到服务控制页面时,所有属性都为空(几乎就像ComObject消失了一样? ) . 例如,在 HWND 属性具有有效值之前,但现在它为null( $ie.hwnd -eq $null 返回true) . 导航到页面时,PowerShell中没有显示错误 .

我查看了一些similar questions,但是第一个与我的情况不匹配(在我的情况下 Document 属性为null),对于后者,IE9默认为Intranet站点的兼容模式 . 我保存了ASP页面并通过w3c validator运行它并且它抛出了一些错误(虽然没有与我修复的元素相关 . 其他网站似乎没有这个问题 . 对问题可能是什么以及建议有任何疑问在解决方案?

2 回答

  • 8

    我刚刚完成了这个......在我关闭IE中的保护模式之前,我看到了相同的行为 . 这似乎与从一个安全区域提交到下一个安全区域有关 . 所以..假设你的原始页面在互联网区域,启用了保护模式,你提交到受信任区域或内部网或其他任何地方的页面,似乎COM上下文丢失了 . 可能是故意的 . 我将尝试修复区域,并保持保护模式 .

    希望这可以帮助 .

    编辑:如果您在高架模式下运行powershell(以管理员身份运行),这也不是问题

  • 6

    另外:http://msdn.microsoft.com/en-us/library/bb625962.aspx

    此问题是由Internet Explorer 8以来的完整性级别引起的 . 这也是为什么应用程序作为管理员运行良好的原因 .

    由于IE-8以“低完整性”模式运行,因此无法在脚本中自动化IE . 这是因为脚本作为属于“中等完整性”模式的用户运行 . 安全设计使得它可以从中到低的完整性发送指令,但是不能从低到中的完整性接收数据 .

    Update: 以下是如何在不更改任何设置的情况下执行此操作的示例 . 它会找回丢失的com-Object .

    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
    

相关问题