Powershell System .__ ComObject.document属性不再适用于IE 9

时间:2012-10-04 18:06:12

标签: powershell internet-explorer-9

我一直在编写一个使用Web浏览器界面运行某些服务器功能的脚本。我使用Internet Explorer 8在Windows 7上编写了脚本,它运行正常。 一旦我将它移动到运行带有Internet Explorer 9的Windows 2008的生产服务器,它就会中断。最后追溯它的失败点,但我有点难过如何解决它。 以下是导致问题的代码:

$ie = new-object -com "InternetExplorer.Application"
$ie.navigate("http://www.google.com")
$ie.visible = $True
$doc = $ie.document
$Object1 = $doc.getElementByID("pocs")

这会弹出一个IE窗口,它应该能够按ID搜索元素。麻烦的是,现在我收到了错误

  

“无法找到”getElementById“和参数计数的重载:   “1”。“

我对此错误的了解非常少。实际问题实际上是变量$ doc。如果我在IE 9上做“$ doc | get-member”,我会得到:

TypeName: System.__ComObject#{c59c6b12-f6c1-11cf-8835-00a0c911e8b2}

但是在IE 8下我得到了:

  TypeName: mshtml.HTMLDocumentClass

因此,基本上,当我调用$ ie.document时,IE 9 / Windows 2008无法加载Web文档内容。我已经尝试将IE9设置为兼容模式,但没有运气。

$ ie.document | get-member确实显示了以下方法:“getElementById Method Variant getElementById()”所以它就在那里,但是没有文件要解析它。

非常感谢任何想法。

3 个答案:

答案 0 :(得分:3)

我同样感到惊讶,鉴于该问题在各种技术论坛上的长久性,尚未得到解决。但是我认为我已经找到了解决方案,但微软IE团队需要在某个时候解决这个问题。

与所有已经调查过的线程一样,我遇到了getElementById方法的同样问题,其中没有对几台测试机器进行其他更改(一台Windows 2008R2 Enterprise 64位和一台Windows 7 32位) ),我可以使用相同的脚本工作。

作为我不喜欢的临时解决方案的解决方法:

  1. 在IE11中使用开发控制台,将文档模式切换为8(9,10,11,边缘(默认)不工作) - 我的自动化脚本立即工作。对IE可信站点,区域安全性,受保护模式,PowerShell会话权限没有任何更改。所以显然只是某种类型的IE11安装的组件问题
  2. 安装Office 2013,无需运行或许可,相同的脚本可立即运行,而无需更改IE11的文档模式。显然Office确实安装/注册了解决问题的方法(正如Rhys Edwards所说)
  3. 所以我开始着手缩小Office通过以下方式启用IE自动化所需的COM对象:

    1. 准备新的虚拟Windows 2008R2服务器,无更新。在IE8下运行测试脚本 - 没有问题。

    2. 升级到IE11。跑测试脚本 - 像往常一样失败。

    3. 获取虚拟机快照

    4. 使用Regshot记录注册表和文件系统

    5. 执行Office 2013 Pro_SP1安装,不更改默认选项 Office安装完成后,没有运行一次办公室(总之) 再次测试脚本 - 一切正常,IE getElementById自动化调用全部恢复运行

    6. 获得第二个虚拟机快照

    7. 使用regshot进行第二次扫描并分析差异

    8. 转储我$ie对象的属性,并注意到运行Office安装之前的内容远远多于此处。始终引用mshtml.dllHTMLDocument类 - 看起来应该

    9. 我可以从RegShot差异文件中看到MSHTML.dll已添加并在办公室安装中在GAC(版本7.0.3300.0)中注册

    10. 我接下来做的可能不会完全获得批准,但是:

      1. 我将microsoft.mshtml.dll放在"c:\program files(x86)\Microsoft.net\primary interop assemblies"文件夹中,并将其从VM保存到我的本地计算机桌面

      2. 恢复到2013年前办公室快照

      3. microsoft.mshtml.dll复制到VM中并安装到GAC(请记住这是一台仍然在.net 2上的2008R2服务器,在IE11安装之前或之后我没有更新.net,只有办公室)。我只需将文件拖到资源管理器中的c:\windows\assembly视图中即可安装到GAC。在.Net的更高版本中,您需要使用gacutil /l

      4. 测试了相同的脚本和BOOM,一切正常。无需更改任何IE设置或提升脚本权限或安装Office

      5. 总结一下。如果您安装IE11,要让PowerShell自动化文档模型,我必须(重新)在GAC中注册mshtml.dll。为什么IE11安装并不能确保这种情况发生在我身边,但我认为IE团队需要对此进行调查。

        我也想到那些它只是工作的地方'在IE10 / 11中,您必须在已在GAC(可能是Office,可能是Visual Studio或其他某些MS应用程序)中注册mshtml.dll的计算机上安装产品。因此,为什么你没有看到明确存在的同样问题。

        希望这有助于某人 - 这让我发疯了!

        安德鲁

答案 1 :(得分:2)

正如对该问题的评论中所详述的,这个问题似乎有三种解决方案。

  1. 升级到PowerShell 3.0 :当涉及到网页抓取并使用IE作为对象时,2.0版仅与IE8兼容。但是,3.0版将适用于IE9。你可以得到它here
  2. 关闭IE中的保护模式:在设置的“安全”选项卡下转换Internet区域的保护模式似乎对我有用。应该仔细考虑对此有安全隐患。
  3. 以管理员模式运行脚本:只需在提升的PowerShell提示符下运行脚本。
  4. 最后两个解决方案来自不同的SO answer

答案 2 :(得分:0)

我有类似的问题,并通过以下步骤解决:

  1. 检查计算机上的Microsoft.mshtml.dll。它应该位于C:\ Program Files(x86)\ Microsoft.NET \ Primary Interop Assemblies。如果你在这个地方找不到它,可能就是你没有这个dll,这就是你遇到这个问题的原因。

  2. 找到dll,并尝试在运行时加载程序集。您可以将dll放在机器上的任何位置并执行此操作。 下面是在运行时加载程序集的方法的链接。 https://onedrive.live.com/?cid=21ad54fd70600673&id=21AD54FD70600673%211922