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 “https://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 “https://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:
https://msdn.microsoft.com/en-us/library/bb250462(VS.85).aspx
Comments
Anonymous
January 25, 2013
Perfeito. Foi isso mesmo que aconteceu aqui. Seu tutorial resolveu o meu problema... parabéns.Anonymous
June 28, 2013
Obrigado Luís! Resolveu meu problema também!Anonymous
July 18, 2013
Sensacional! Fico feliz que tenha ajudado. :)Anonymous
November 05, 2013
Muitíssimo obrigado. resolveu meu problema já estava ficando maluco.Anonymous
November 27, 2014
Mandou muito bem!Anonymous
February 11, 2015
Luis, estava a dias procurando essa solução. Obrigado pela ajuda.Anonymous
September 01, 2015
Cara, muito obrigado.