Acceder a la caché de Internet Explorer (I)

Internet2

En algunos casos puede ser interesante acceder a la caché de navegación de Internet Explorer. Por ejemplo, para poder guardar un registro de los sitios que visitan los usuarios de nuestra organización sin tener que montar un ISA server o similar.

Para ello, y como todavía no he encontrado nada implementado en el propio Framework, vamos a hacer uso de algunos elementos del API de Windows. Ese gran amigo que todavía nos sigue sacando las castañas del fuego algunas veces... :-D


El punto de partida:

Cuando accedemos a la carpeta de archivos temporales de Internet, podemos eliminar el contenido o cambiar la ubicación de la carpeta que utilizamos para almacenar este información:

iecache_config

Incluso si pulsamos la opción de ver archivos, el explorador nos muestra una vista similar a esto:

iecache_files

Sin embargo, esta vista se genera automáticamente a partir del contenido de un fichero llamado Index.dat, que se encuentra en la carpeta "Archivos temporales de Internet\Content.IEX", siendo X la versión de IE del sistema. De modo que, para poder acceder a la información contenida en este fichero no nos queda más remedio que utilizar algunas funciones del API de Windows.


Presentando a los protagonistas:

Como os decía anteriormente, a falta de poder usar código manejado vamos a utilizar los ladrillos del propio S.O.

Esta estructura representa un elemento dentro de la caché de Internet.

[StructLayout(LayoutKind.Sequential)]
public struct INTERNET_CACHE_ENTRY_INFO
{
    public UInt32 dwStructSize;
    public string lpszSourceUrlName;
    public string lpszLocalFileName;
    public UInt32 CacheEntryType;
    public UInt32 dwUseCount;
    public UInt32 dwHitRate;
    public UInt32 dwSizeLow;
    public UInt32 dwSizeHigh;
    public Win32API.FILETIME LastModifiedTime;
    public Win32API.FILETIME ExpireTime;
    public Win32API.FILETIME LastAccessTime;
    public Win32API.FILETIME LastSyncTime;
    public IntPtr lpHeaderInfo;
    public UInt32 dwHeaderInfoSize;
    public string lpszFileExtension;
    public UInt32 dwExemptDelta;
}; 
 
Más información acerca de esta estructura en:
 
INTERNET_CACHE_ENTRY_INFO Structure
 
También nos basaremos en estas dos funciones, encargadas de devolver un puntero a un elemento del tipo INTERNET_CACHE_ENTRY_INFO dentro de la caché. La primera de ellas devuelve el primer valor encontrado en la caché, a partir de un puntero a una cadena que representa el patrón a buscar. Mientras que la segunda recibe el manejador devuelto por la primera llamada a FindFirstUrlCacheEntry.
 
[DllImport("wininet.dll", SetLastError=true)]
private static extern IntPtr FindFirstUrlCacheEntry(
  string lpszUrlSearchPattern, IntPtr lpFirstCacheEntryInfo, 
  out UInt32 lpdwFirstCacheEntryInfoBufferSize );
 
[DllImport("wininet.dll", SetLastError=true)]
private static extern long FindNextUrlCacheEntry(
  IntPtr hEnumHandle, IntPtr lpNextCacheEntryInfo, 
  out UInt32 lpdwNextCacheEntryInfoBufferSize );

Podéis encontrar más información acerca de ellas en:

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

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


Y ahora que?

Pues ahora nada, que me he quedado sin tiempo... hasta aquí este primer post. Mañana continuaremos con la construcción de un pequeño proyecto de ejemplo que utiliza estas funciones para acceder a la caché de Internet y muestre el contenido en pantalla. Y si da tiempo, sería interesante crear una aplicación o servicio que vaya monitorizando y guardando este contenido en algún medio persistente (tal vez XML o una base de datos).

Hasta mañana!

Published 15/5/2008 17:59 por Lluis Franco
Comparte este post:

Comentarios

# Acceder a la caché de Internet Explorer (III)

Monday, May 26, 2008 5:15 PM por El blog de Lluis Franco

Impersonation => RunAs En los dos primeros artículos pudimos ver los objetos del API de Windows que

# re: Acceder a la caché de Internet Explorer (I)

Friday, February 13, 2009 2:58 PM por farmando

Luis,

He tomado tus interesantes ejemplos como tutorial para comenzar a trabajar sobre el cache de IE. Al definir la estructura del INTERNET_CACHE_ENTRY_INFO, me señala un error en la definición de las variables Win32API.FILETIME. "The type or namespace name 'Win32API' could not be found (are you missing a using directive or an assembly reference?)".

Alguna idea de como solucionar esto?

Estoy trabjando sobre Vista Home Premium y VS 2008.

Saludos.-

# re: Acceder a la caché de Internet Explorer (I)

Friday, February 13, 2009 4:02 PM por Lluis Franco

Hola,

Te falta por agregar a tu proyecto el archivo Win32API.cs, que contiene la definición de esta clase. Descarga el proyecto de ejemplo y me cuentas...

Codigo: geeks.ms/.../acceder-a-la-cach-233-de-internet-explorer-v-y-final.aspx

Saludos,

# re: Acceder a la caché de Internet Explorer (I)

Wednesday, February 17, 2010 8:17 AM por franco

como hago para borrar mi caché y si lo borro que consecuencias tendria ? gracias

# re: Acceder a la caché de Internet Explorer (I)

Friday, April 16, 2010 4:10 PM por Míriam Cánovas Montes

Hola LLuis.  Yo soy neofita en esto de Internet e informática.  Sé lo justo.  Pero necesito saber el historial de mi navegador de dos meses atrás, ya que solo tengo constancia del historial hace dos días que hice cuenta en google.  me puedes ayudar... Me han dicho que tengo que buscar en el caché de mi navegador Internet Explorer, pero no sé por dónde empezar.  Gracias.