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… 😀


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!

** crossposting desde el blog de Lluís Franco en geeks.ms **

Leave a Reply

Your email address will not be published. Required fields are marked *


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>