Как однозначно идентифицировать окно 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