PowerShell IE9 ComObject 在导航到网页后具有所有空属性
Posted
技术标签:
【中文标题】PowerShell IE9 ComObject 在导航到网页后具有所有空属性【英文标题】:PowerShell IE9 ComObject has all null properties after navigating to webpage 【发布时间】:2012-12-01 21:55:50 【问题描述】:我有一个 PowerShell 脚本,它导航到我们 Intranet 上的(大概)经典 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
属性具有有效值,但现在它为空($ie.hwnd -eq $null
返回 true)。当我导航到该页面时,PowerShell 中没有显示错误。
我看了一些similarquestions,但第一个不符合我的情况(Document
属性在我的情况下为空),至于后一个,IE9默认为内网兼容模式网站。我保存了 ASP 页面并通过w3c validator 运行它,它抛出了一些错误(尽管与我要处理的元素无关)。不幸的是,我无法解决这些问题。其他网站似乎没有这个问题。对问题可能是什么有任何怀疑以及解决方法的建议?
【问题讨论】:
【参考方案1】:此外: http://msdn.microsoft.com/en-us/library/bb625962.aspx
此问题是由 Internet Explorer 8 以来的完整性级别引起的。 这也是应用程序以管理员身份运行良好的原因。
由于 IE-8 以“低完整性”模式运行,因此无法从脚本中自动执行 IE。这是因为脚本以属于“中等完整性”模式的用户身份运行。安全设计使得它可以发送中等到低完整性的指令,但不能接收低到中等完整性的数据。
更新:这是一个工作示例,如何在不更改任何设置的情况下执行此操作。它取回丢失的 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
【讨论】:
我已经用解决这个问题的方法更新了我的答案。 试过了,但没有找到进程。此外,新进程有不同的 HWND,所以我看不出它如何找到正确的进程。 嗯,对我来说这很好用。你有哪个 IE 版本?我已经用上面的代码重新测试了它。当我在脚本之后打印出$objIE
时,我得到了正确的对象。【参考方案2】:
我刚刚完成了这个.. 有点。在我关闭 IE 中的保护模式之前,我看到了相同的行为。这似乎与从一个安全区域提交到下一个安全区域有关。所以..假设您的原始页面位于 Internet 区域中,并且启用了保护模式,您提交到受信任区域或 Intranet 或其他任何内容中的页面,似乎 COM 上下文丢失了。大概是故意的。我将尝试修复这些区域,并保持保护模式开启。
希望这会有所帮助。
编辑:如果您在提升模式下运行您的 powershell(以管理员身份运行),这也不是问题
【讨论】:
哇,就是这样!在设置中的“安全”选项卡下打开 Internet 区域的保护模式就可以了。但是,由于我会将这个脚本放在其他人的存储库中,因此我可能不得不使用管理技巧。谢谢! @JeffBridgman,您也许还可以将所需站点放在不同的受信任区域中。 但仅限于我,不适合其他人,嗯?该站点位于我的 Intranet 区域中,该区域已经关闭了保护模式。看起来 IE 在启用保护模式的情况下在 Internet 区域中启动。我尝试将我的主页设置为 Intranet 区域中的某个内容,但奇怪的是脚本仍然失败。 哇,你救了我的命!我以为我的代码有错误,但正是这个解决方案有帮助!谢谢楼主:)以上是关于PowerShell IE9 ComObject 在导航到网页后具有所有空属性的主要内容,如果未能解决你的问题,请参考以下文章
powershell 如果在系统上注册了Altiris.AeXClient COMObject,则返回True / False。
Powershell - pwpush.com - 提交按钮