【问题标题】:How to uniquely identify an internet explorer window running in session 0?如何唯一标识会话 0 中运行的 Internet Explorer 窗口?
【发布时间】:2013-07-19 00:35:41
【问题描述】:

我正在创建 WCF web services 自动化 internet explorer。有多个 Web 服务调用需要访问 Internet Explorer 的同一实例。但是,由于WCF 服务托管在IIS 上,所有对Web 服务的调用都在会话0 中执行。现在要访问Internet Explorer 的同一个实例,我使用SHDocVw.InternetExplorer.HWND 属性,它返回一个窗口句柄Internet Explorer 实例。在下面的代码中,当在IIS 7 上作为WCF 服务执行时,由于会话 0 隔离,窗口句柄始终返回 0。此外,我无法连接到同一个 IE 实例或循环访问所有打开的 IE 窗口。我可以枚举进程列表并查找会话 0 中打开的每个 IE 窗口的进程 ID,但不能将 System.Diagnostics.Process 转换为 SHDocVw.InternetExplorer 对象。

下面是我的代码:

public int GetWhd()
{
    InternetExplorer ie = new InternetExplorer();
    ie.Visible = true;
    return ie.HWND;
}

public int SetWhd(string whd)
{
    int wh = Int32.Parse(whd);
    InternetExplorer ie = null;
    ShellWindows s = new ShellWindows();
    foreach (SHDocVw.InternetExplorer ie1 in s)
    {
    try
    {
            if (ie1.HWND == wh)
            {
                    ie = ie1;
                    break;
            }
    }
    catch { return 2; }
    }
    if (ie != null) { ie.Navigate("www.google.com"); return 1; }
    return 0;
}

任何帮助将不胜感激。

【问题讨论】:

  • 我认为解决您的问题的唯一方法是创建一个与 Internet Explorer 在同一会话中运行的附属进程。然后,不要尝试直接从您的 Web 服务控制 Internet Explorer,而是使用一些进程间通信机制(例如命名管道、WCF 或 .Net Remoting)向您的卫星进程发送控制命令,然后代表您的 Web 服务进行控制.您还应该保护您的网络服务和卫星进程之间的通信,尤其是当您的卫星进程以比登录用户更高的权限运行时。
  • 考虑改用WebDriver
  • 谢谢@Hans .. 我根据您的方法(使用命名管道)进行了一些测试,效果很好。感谢您的帮助!
  • @Aron 我已经为个别任务开发了程序,因此使用 WebDriver 重写所有代码对我来说是不可行的。另外,我不确定使用 web-driver 是否有助于识别 IE 窗口句柄,因为这里的问题不是 sHdocVW,而是会话 0 隔离。但是,我会记住这一点以供将来参考..谢谢..
  • @Neville 我的观点是,在使用 webdriver 时,您可能不需要唯一标识 IE 窗口句柄的实例。它具有适用于大多数自动化任务的钩子。

标签: c# wcf internet-explorer-8 session-0-isolation


【解决方案1】:

在 IIS7 中完全摆脱隔离是很困难的,但这是我在类似情况下所做的: 在 IIS 中,转到应用程序池的高级设置,并将其设置为以 Windows 用户身份运行。确保您至少使用该用户登录过一次(.net 会创建一些未记录的文件夹)。 将加载用户配置文件设置为 True

就我而言,我正在自动化 MS Office,所以我有以下 2 个额外步骤(第一个可能适用): C:\Windows\System32\config\systemprofile 创建桌面文件夹,给它写权限 C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft\Templates 确保 Normal.dotm 存在并且它具有写入权限

接下来,更改 DCOM 对象的设置 Start -> run -> comexp.msc

打开Component Services -> Computers -> My Computer -> DCOM Config 找到 Internet Explorer 条目,Right-click -> Properties -> Identity Tab -> select The interactive user

或者,如果您的用例允许,将 WCF 应用程序托管在 WPF 应用程序中,如果需要,您可以在应用程序中托管 Internet Explorer 窗口,这将为您提供更多控制权。浏览器控制 API 一开始似乎是有限的(智能意义上的),直到您将其转换为适当的类型。如果需要,我可以发布。

编辑:还可以看看http://support.microsoft.com/kb/555134

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 2017-04-08
    • 2011-08-01
    • 1970-01-01
    • 2015-11-03
    • 2012-01-25
    • 1970-01-01
    相关资源
    最近更新 更多