2

我一直在编写一个使用网络浏览器界面运行一些服务器功能的脚本。我使用 Internet Explorer 8 在 Windows 7 上编写了脚本,它运行良好。一旦我将它移动到运行 Windows 2008 和 Internet Explorer 9 的生产服务器,它就会中断。终于追踪到它的故障点,但我有点难过如何修复它。这是会导致问题的代码:

$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 ()”,所以它就在那里,但是没有文档可以解析。

任何想法将不胜感激。

4

3 回答 3

4

鉴于这个问题在各种技术论坛上的存在时间很长,我同样感到惊讶的是,这个问题还没有得到解决。不过,我认为我已经找到了解决方案,尽管在某些时候需要由 Microsoft IE 团队来解决。

就像所有引用的线程一样,我在该getElementById方法上遇到了同样的问题,在没有对几台测试机器(一台 Windows 2008R2 Enterprise 64 位和一台 Windows 7 32 位)进行其他更改的情况下,我可以获得相同的脚本去工作。

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

  1. 使用 IE11 中的开发控制台,将文档模式切换为 8(9、10、11、Edge(默认)不起作用)——我的自动化脚本立即运行。IE 受信任站点、区域安全性、保护模式、PowerShell 会话权限没有更改)。很明显,这只是某种 IE11 安装的组件问题
  2. 安装 Office 2013,无需运行或授权,相同的脚本立即运行,无需更改 IE11 的文档模式。显然,Office 确实安装/注册了可以解决问题的东西(正如 Rhys Edwards 所说)

因此,我开始通过以下方式缩小 Office 为启用 IE 自动化所需的 COM 对象所做的工作:

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

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

  3. 拍摄虚拟机快照

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

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

  6. 拍摄第二个虚拟机快照

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

  8. 转储了我的$ie对象的属性,还注意到那里比运行 Office 安装之前要多得多。整个引用mshtml.dllHTMLDocument类 - 看起来应该

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

我接下来所做的可能不会完全被批准,但是:

  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

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

我还认为,对于那些在 IE10/11 中“正常工作”的人,您必须在已经在 GAC 中注册的机器上拥有一个产品mshtml.dll(可能是 Office,可能是 Visual Studio 或其他一些 MS 应用程序)。因此,为什么您没有看到肯定存在的相同问题。

希望这对某人有所帮助-这让我发疯了!

安德鲁

于 2015-05-31T10:24:03.277 回答
2

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

  1. 升级到 PowerShell 3.0:版本 2.0 仅在涉及网络抓取和使用 IE 作为对象时最多与 IE8 兼容。但是,3.0 版将适用于 IE9。你可以在这里得到它。
  2. 关闭 IE中的保护模式:在设置中的“安全”选项卡下为 Internet 区域打开保护模式似乎对我有用。应该仔细考虑这方面的安全隐患。
  3. 在管理员模式下运行脚本:只需在提升的 PowerShell 提示符下运行脚本。

最后两个解决方案来自不同的SO 答案

于 2013-11-11T20:44:43.280 回答
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

于 2015-04-02T19:45:35.893 回答