Как однозначно идентифицировать окно Internet Explorer, запущенное в сеансе 0?

Я создаю WCF web services этот автомат internet explorer, Есть несколько вызовов веб-службы, которые должны получить доступ к одному и тому же экземпляру Internet Explorer, Тем не менее, так как WCF услуги размещены на IIS все вызовы веб-службы выполняются в сеансе 0. Теперь для доступа к одному и тому же экземпляру Internet Explorer я использую SHDocVw.InternetExplorer.HWND свойство, которое возвращает дескриптор окна Internet Explorer пример. В приведенном ниже коде, когда выполняется как WCF обслуживание на IIS 7 дескрипторы окна всегда возвращают 0 из-за изоляции сеанса 0. Кроме того, я не могу подключиться к тому же IE экземпляр или цикл через все открытое IE окна. Я могу перечислить список процессов и найти идентификаторы процессов для каждого IE окно открыто в сеансе 0, но не может привести 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;
}

Любая помощь будет высоко ценится.

1 ответ

Решение

Трудно полностью избежать изоляции в IIS7, но вот что я сделал в аналогичном сценарии: В IIS перейдите в раздел "Дополнительные параметры" в своем пуле приложений и настройте его для запуска в качестве пользователя Windows. Убедитесь, что вы вошли с этим пользователем хотя бы один раз (.net создает недокументированные папки). Установите для Загрузить профиль пользователя значение True

В моем случае я автоматизировал MS Office, поэтому у меня были следующие 2 дополнительных шага (первый может быть применим): C:\Windows\System32\config\systemprofile создать папку Desktop, дать ей разрешения на запись C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft\Templates убедитесь, что файл Normal.dotm существует и у него есть права на запись

Затем измените настройки объектов DCOMStart -> 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

Другие вопросы по тегам