Problemas de Automação no Internet Explorer 8.0

Nessa semana me deparei com uma aplicação desenvolvida em Visual Basic 6.0 que gerava o seguinte erro quando a aplicação tentava navegar para uma página da Intranet para capturar informações do site:

-2147023179

Erro de automação (Automation error)

Interface desconhecida
(The interface is unknown).

Diagnóstico

Ao fazer o debug do código, foi possível identificar que o erro ocorria quando a aplicação tentava acessar os sites que pertenciam à zona da Intranet. Nenhum erro ocorria quando a aplicação acessava os sites associados à zona da Internet. Uma das diferenças entre essas zonas é que os sites da Intranet não possuem o Modo Protegido habilitado por padrão.

O modo protegido ajuda a proteger usuários contra ataques executando o processo do Internet Explorer com privilégios muito restritos. Quando executado no modo protegido, o IE8 é um processo de baixa integridade sem acesso de gravação a arquivos e chaves do registro.

O Internet Explorer 8 possui pelo menos dois processos (Figura 1) quando é executado em uma máquina que possui o UAC (Controle de Conta de Usuário) configurado no nível padrao. O processo do navegador (Frame Manager) e um ou mais processos (Tab Process) que podem ser executados nos seguintes níveis de integridade:

•Modo de Integridade Baixo (LowIL) para os sites de modo protegido

•Modo de Integridade Médio (MediumIL) para sites da Intranet/confiáveis

•Modo de Integridade Alto (HighIL) se o IE for iniciado como Admin

 

Figura 1 - Modelo conhecido como Loosely Coupled IE (LCIE)

O Internet Explorer 8 assume que o processo da aba padrão deve ser executado no modo de baixa integridade (LowIL). Dessa forma, quando o IE é criado via automação COM, a tab padrão é executada no modo de baixa integridade (veja o fragmento de código a seguir).

 Dim IE As InternetExplorer
 
 
 Set IE = CreateObject("InternetExplorer.Application")
 
 IE.Navigate2 “http://intranet/”
 

Se o navegador determinar que a navegação requer que um processo (Tab Process) seja executado no modo de integridade média, o navegador faz a troca da aba virtual. O problema da automação ocorre porque o script ou código que criou a instância do Internet Explorer via automação permanece com uma referência anterior (irrelevante) para o processo da aba atual, ou seja, ele perde o controle.

Solução

A primeira solução é habilitar o modo protegido do Internet Explorer para os sites da Intranet.

Figura 2 - Habilitar o Modo Protegido para os sites da Intranet

Outra solução requer alteração no código da aplicação , conforme exibido no fragmento de código a seguir:

 Dim IE As InternetExplorer
 
 Set IE = CreateObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}")
 
 IE.Navigate2 “http://intranet/”
 

Ao utilizar o CLSID a aplicação cria uma instância do Internet Explorer no modo de integridade médio (MediumIL). A lógica é bem simples e pode ser verificada através da chave de registro HKEY_CLASSES_ROOT\CLSID\{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}\LocalServer32 que contém a REG_EXPAND_SZ com o
valor "%ProgramFiles(x86)%\Internet Explorer\iexplore.exe" –startmediumtab.

Fontes:

http://msdn.microsoft.com/en-us/library/bb250462(VS.85).aspx