<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Lluís Franco on Geeks.ms : Explorer, Utilidad</title><link>http://geeks.ms/blogs/lfranco/archive/tags/Explorer/Utilidad/default.aspx</link><description>Etiquetas: Explorer, Utilidad</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Acceder a la caché de Internet Explorer (V y final)</title><link>http://geeks.ms/blogs/lfranco/archive/2008/06/10/acceder-a-la-cach-233-de-internet-explorer-v-y-final.aspx</link><pubDate>Tue, 10 Jun 2008 13:12:31 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:88500</guid><dc:creator>Lluis Franco</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/lfranco/rsscomments.aspx?PostID=88500</wfw:commentRss><comments>http://geeks.ms/blogs/lfranco/archive/2008/06/10/acceder-a-la-cach-233-de-internet-explorer-v-y-final.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerVyfinal_D5DA/ie_2.jpg"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="120" alt="ie" src="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerVyfinal_D5DA/ie_thumb.jpg" width="120" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Éste es el último post de esta serie, en la cual se ha desarrollado un proyecto de ejemplo de cómo acceder a la caché de archivos temporales de Internet Explorer. De hecho, he aprovechado la excusa para montar un pequeño proyecto de ejemplo en el que poder enseñar varias cosas que tenía en mente y por falta de tiempo no podía postear.&lt;/p&gt; &lt;p&gt;ASí pues en éste ejercicio hemos mostrado entre otras cosas cómo:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Utilizar el API para acceder a los archivos temporales de Internet (&lt;a href="http://geeks.ms/blogs/lfranco/archive/2008/05/15/acceder-a-la-cach-233-de-internet-explorer-i.aspx" target="_blank"&gt;post 1&lt;/a&gt;)&lt;/li&gt; &lt;li&gt;Persistir objetos .NET en ficheros XML mediante serialización (&lt;a href="http://geeks.ms/blogs/lfranco/archive/2008/05/20/acceder-a-la-cach-233-de-internet-explorer-ii.aspx" target="_blank"&gt;post 2&lt;/a&gt;)&lt;/li&gt; &lt;li&gt;Impersonar, para ejecutar temporalmente muestra aplicación con las credenciales de otro usuario (&lt;a href="http://geeks.ms/blogs/lfranco/archive/2008/05/26/acceder-a-la-cach-233-de-internet-explorer-iii.aspx" target="_blank"&gt;post 3&lt;/a&gt;)&lt;/li&gt; &lt;li&gt;Crear y distribuir nuestra aplicación como un servicio de Windows (&lt;a href="http://geeks.ms/blogs/lfranco/archive/2008/05/26/acceder-a-la-cach-233-de-internet-explorer-iv.aspx" target="_blank"&gt;post 4&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Y aquí os dejo el código completo del ejemplo:&lt;/p&gt;&lt;iframe style="border-right:#dde5e9 1px solid;padding-right:0px;border-top:#dde5e9 1px solid;padding-left:0px;padding-bottom:0px;margin:3px;border-left:#dde5e9 1px solid;width:240px;padding-top:0px;border-bottom:#dde5e9 1px solid;height:66px;background-color:#ffffff;" marginwidth="0" marginheight="0" src="http://cid-f3a970280830b5fe.skydrive.live.com/embedrowdetail.aspx/Downloads/Projects/IECacheQuery/IECacheQuery.zip" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt; &lt;p&gt;Espero que os guste,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=88500" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx">.NET</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Utilidad/default.aspx">Utilidad</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Windows/default.aspx">Windows</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/API/default.aspx">API</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Cache/default.aspx">Cache</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/IE/default.aspx">IE</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Explorer/default.aspx">Explorer</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Servicio/default.aspx">Servicio</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Ejemplo/default.aspx">Ejemplo</category></item><item><title>Acceder a la caché de Internet Explorer (IV)</title><link>http://geeks.ms/blogs/lfranco/archive/2008/05/30/acceder-a-la-cach-233-de-internet-explorer-iv.aspx</link><pubDate>Fri, 30 May 2008 15:22:53 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:87386</guid><dc:creator>Lluis Franco</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/lfranco/rsscomments.aspx?PostID=87386</wfw:commentRss><comments>http://geeks.ms/blogs/lfranco/archive/2008/05/30/acceder-a-la-cach-233-de-internet-explorer-iv.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/windowsservice_2.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="158" alt="windowsservice" src="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/windowsservice_thumb.jpg" width="244" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;En los dos primeros artículos pudimos ver los &lt;a href="http://geeks.ms/blogs/lfranco/archive/2008/05/15/acceder-a-la-cach-233-de-internet-explorer-i.aspx" target="_blank"&gt;objetos del API de Windows que íbamos a usar&lt;/a&gt; para poder acceder a la caché de los archivos temporales de Internet, &lt;a href="http://geeks.ms/blogs/lfranco/archive/2008/05/20/acceder-a-la-cach-233-de-internet-explorer-ii.aspx" target="_blank"&gt;cómo persistir estos datos en formato XML&lt;/a&gt;, y finalmente cómo permitir que temporalmente nuestra &lt;a href="http://geeks.ms/blogs/lfranco/archive/2008/05/26/acceder-a-la-cach-233-de-internet-explorer-iii.aspx" target="_blank"&gt;aplicacación se ejecute con las credenciales de otro usuario&lt;/a&gt;, para poder realizar una serie de acciones que de otro modo no podría efectuar por falta de privilegios.&lt;/p&gt; &lt;p&gt;Siguiendo con el objetivo de este ejercicio hoy vamos a encapsular la lógica de negocio de nuestra aplicación en forma de servicio de Windows, y éste va a encargarse de realizar una consulta a la caché de Internet de nuestro ordenador cada X tiempo (configurable mediante un fichero XML).&lt;/p&gt; &lt;p&gt;Lo primero de todo va a ser construir la base de nuestro servicio mediante un proyecto de tipo Windows Service. Esta plantilla nos genera un proyecto con un componente de tipo ServiceBase, que servirá para ir construyendo nuestro pequeño juguetito.&lt;/p&gt; &lt;p&gt;&lt;a href="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/CreateWindowsService.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="502" alt="CreateWindowsService" src="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/CreateWindowsService_thumb.png" width="687" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;A continuación vamos a cambiar el nombre al servicio, en nuestro caso lo llamaremos &amp;quot;IECacheQueryService&amp;quot;. Y posteriormente estableceremos a &lt;strong&gt;True&lt;/strong&gt; los valores de las propiedades &lt;strong&gt;CanPauseAndContinue&lt;/strong&gt; y &lt;strong&gt;CanShutdown&lt;/strong&gt;, para poder pausar y detener nuestro servicio en tiempo de ejecución.&lt;/p&gt; &lt;p&gt;Importante: Comprobar que el nombre sel servicio se ha cambiado correctamente en el punto de entrada de la aplicación (si no fuese así tendremos que modificarlo manualmente):&lt;/p&gt; &lt;div&gt; &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Program&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main()&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            ServiceBase[] ServicesToRun;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            ServicesToRun = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ServiceBase[] &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            { &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;                &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;font color="#ff0000"&gt;IECacheQueryService&lt;/font&gt;() &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            };&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            ServiceBase.Run(ServicesToRun);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Implementando funcionalidad al servicio:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;De momento el servicio será capaz de iniciarse, pero no realizará nada. Ahora debemos dotarlo de funcionalidad, y para ello vamos a crear un temporizador que se encargue de realizar una tarea cada X tiempo (por defecto una hora). Éste lo crearemos como un miembro dentro de nuestra clase:&lt;/p&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; IECacheQueryService : ServiceBase&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; Timer clock = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Timer();&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Y lo usaremos desde el constructor de la misma, así como en los eventos OnStart y OnStop. Observar que en el constructor lo inicializamos con un valor que proviene del fichero de configuración del proyecto (propiedades del proyecto/settings) llamado &lt;strong&gt;TimerInterval&lt;/strong&gt; y se ha establecido a un valor de 3.600.000 (1 hora en milisegundos). &lt;/p&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IECacheQueryService()&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    InitializeComponent();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    clock = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Timer(Properties.Settings.Default.&lt;font color="#ff0000"&gt;TimerInterval&lt;/font&gt;);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    clock.Elapsed += &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ElapsedEventHandler(&lt;font color="#ff0000"&gt;clock_Elapsed&lt;/font&gt;);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    clock.Enabled = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#008000;"&gt;//...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;}&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; OnStart(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;{           &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    ExecuteQuery();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    clock.Start();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#008000;"&gt;//...&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;}&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; OnStop()&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    clock.Stop();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Del mismo modo también especificamos el manejador de evento asociado que se ejecutará cada vez que se cumpla este intervalo de tiempo (clock_Elapsed). Éste será el corazón de nuestro servicio y será el encargado de invocar la consulta a la caché de IE:&lt;/p&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; clock_Elapsed(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, ElapsedEventArgs e)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            ExecuteQuery();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            appEventLog.WriteEntry(&lt;span style="color:#006080;"&gt;&amp;quot;Exception: &amp;quot;&lt;/span&gt; + ex.Message,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;                EventLogEntryType.Error);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;        }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Simple verdad? Ahora vamos a construir este método &lt;strong&gt;ExecuteQuery&lt;/strong&gt; a apartir de las piezas que vimos en anteriores entradas de la misma serie. No os preocupeis que en el último post estará un enlace al código completo del ejemplo (incluido el instalable).&lt;/p&gt;
&lt;p&gt;Que hace exactamente este método? &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Primero de todo crea un objeto de tipo &lt;strong&gt;StopWatch&lt;/strong&gt; para medir con precisión el tiempo que transcurre en la ejecución del mismo.&lt;/li&gt;
&lt;li&gt;Llama al método &lt;strong&gt;getResults&lt;/strong&gt; que se encarga de efectuar la consulta y devolver un objeto que es una lista genérica de entradas de la caché.&lt;/li&gt;
&lt;li&gt;Construye el nombre de fichero en el que guardaremos los resultados y llama al método &lt;strong&gt;saveResults&lt;/strong&gt;, encargado de realizar la suplantación de identidad y serializar los resultados en el fichero antes mencionado.&lt;/li&gt;&lt;/ul&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ExecuteQuery()&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;        Stopwatch watch = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Stopwatch();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        watch.Start();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;        List&amp;lt;IECacheEntry&amp;gt; results = getResults(&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            Properties.Settings.Default.SearchPattern);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;        &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; filename = &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#006080;"&gt;&amp;quot;{0}{1}_{2}.xml&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            Properties.Settings.Default.TargetPathLocation,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            Environment.MachineName,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            DateTime.Now.ToString(&lt;span style="color:#006080;"&gt;&amp;quot;ddMMyyyy_hhmm&amp;quot;&lt;/span&gt;));&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;        watch.Stop();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        TimeSpan ts = watch.Elapsed;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;        saveResults(results, filename);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        appEventLog.WriteEntry(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            &lt;span style="color:#006080;"&gt;&amp;quot;Query executed successfully at {0} in &amp;#39;{1}&amp;#39; by user &amp;#39;{2}&amp;#39;. Elapsed time (ms): {3}&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            DateTime.Now.ToString(), Environment.MachineName,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            WindowsIdentity.GetCurrent().Name,ts.Milliseconds));&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;        appEventLog.WriteEntry(&lt;span style="color:#006080;"&gt;&amp;quot;Exception: &amp;quot;&lt;/span&gt; + ex.Message,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            EventLogEntryType.Error);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Está el servicio terminado? Bueno, si asumimos que el código está completo y funciona sin errores, sí, lo está :-P &lt;/p&gt;
&lt;p&gt;Y ahora cómo lo probamos? Pues... bueno, para probarlo antes tenemos que instalarlo. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agregando los elementos necesarios para instalar el servicio:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No he encontrado demasiada documentación al respecto, de modo que intentaré mostrar los pasos a seguir mediante capturas de pantalla.&lt;/p&gt;
&lt;p&gt;Vamos a agregar un elemento que nos permita distribuir el servicio:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/AddInstallerClass.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="423" alt="AddInstallerClass" src="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/AddInstallerClass_thumb.png" width="685" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Le agregaremos dos componentes serviceProcessInstaller y serviceInstaller (es posible que no aparezcan en la barra de herramientas, así que tendremos que agregarlos mediante la opción &amp;quot;Choose Items...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/InstallerComponents.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="266" alt="InstallerComponents" src="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/InstallerComponents_thumb.png" width="485" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;A continuación los configuraremos del siguiente modo:&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="2"&gt;

&lt;tr&gt;
&lt;td&gt;Control&lt;/td&gt;
&lt;td&gt;Propiedad&lt;/td&gt;
&lt;td&gt;Valor&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;serviceProcessInstaller1&lt;/td&gt;
&lt;td&gt;Account&lt;/td&gt;
&lt;td&gt;LocalSystem (*)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;serviceProcessInstaller1&lt;/td&gt;
&lt;td&gt;Parent&lt;/td&gt;
&lt;td&gt;Installer1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;serviceInstaller1&lt;/td&gt;
&lt;td&gt;Description&lt;/td&gt;
&lt;td&gt;Internet Explorer Query Cache&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;serviceInstaller1&lt;/td&gt;
&lt;td&gt;Display Name&lt;/td&gt;
&lt;td&gt;Internet Explorer Query Cache&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;serviceInstaller1&lt;/td&gt;
&lt;td&gt;Parent&lt;/td&gt;
&lt;td&gt;Installer1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;serviceInstaller1&lt;/td&gt;
&lt;td&gt;ServiceName&lt;/td&gt;
&lt;td&gt;IEQueryCache&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;serviceInstaller1&lt;/td&gt;
&lt;td&gt;StartType&lt;/td&gt;
&lt;td&gt;Automatic&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;(*) Habitualmente se utilizará siempre la cuenta con menos nivel de privilegios (LocalService), pero en nuestro caso necesitamos acceder a la caché de IE, de modo que es posible que incluso tengamos que configurar la cuenta de un usuario de windows con suficientes permisos.&lt;/p&gt;
&lt;p&gt;Cruzamos los dedos, compilamos el proyecto y vamos a agegar un proyecto de instalación a la solución.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Creando el proyecto de instalación:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Agregaremos un proyecto de tipo Setup and deployment, que será el encargado de instalar nuestro servicio en las estaciones Windows que deseamos monitorizar.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/CreateSetupProject.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="451" alt="CreateSetupProject" src="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/CreateSetupProject_thumb.png" width="687" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Agregamos la salida del proyecto anterior al nuevo proyecto de instalación:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/AddProjectOutput.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="473" alt="AddProjectOutput" src="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/AddProjectOutput_thumb.png" width="380" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/AddProjectOutputDialog.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="389" alt="AddProjectOutputDialog" src="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/AddProjectOutputDialog_thumb.png" width="328" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Ahora mostraremos la ventana de &amp;quot;custom actions&amp;quot; para agregar como acción al instalador la salida de nuestro proyecto de servicio de Windows.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/AddCustomAction.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="471" alt="AddCustomAction" src="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/AddCustomAction_thumb.png" width="381" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/AddCustomActionDialog.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="369" alt="AddCustomActionDialog" src="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/AddCustomActionDialog_thumb.png" width="583" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Una vez realizado esto ya podemos compilar el proyecto de instalación e instalarlo en las estaciones cliente. Si quereis instalarlo en vuestra estación para probarlo y configurarlo adecuadamente, la opción más sencilla es seleccionar la opción &lt;strong&gt;Install&lt;/strong&gt; del menú contextual del proyecto de instalación, en el explorador de proyectos.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/Setup.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="418" alt="Setup" src="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/Setup_thumb.png" width="506" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Una vez instalado, aparecerá en el administrador de servicios, para que podamos configurarlo del modo deseado. En este caso particular, si deseamos monitorizar la caché de un usuario en particular, deberemos usar las credenciales de éste usuario, ya que si no el S.O. no será capaz de montar el fichero &lt;strong&gt;Index.dat&lt;/strong&gt; correspondiente a la caché de Internet Explorer.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/AdminServices.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="649" alt="AdminServices" src="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerIV_DD5D/AdminServices_thumb.png" width="669" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Bueno, hasta aquí ha llegado este ejemplo. En el próximo post haremos un resumen de lo que se ha visto hasta ahora y publicaré un enlace con el código completo del proyecto para que sirva de ejemplo (o de mal ejemplo :-P).&lt;/p&gt;
&lt;p&gt;Saludos desde andorra,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=87386" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx">.NET</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/2008/default.aspx">2008</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Utilidad/default.aspx">Utilidad</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Windows/default.aspx">Windows</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/API/default.aspx">API</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Cache/default.aspx">Cache</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/IE/default.aspx">IE</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Explorer/default.aspx">Explorer</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Servicio/default.aspx">Servicio</category></item><item><title>Acceder a la caché de Internet Explorer (I)</title><link>http://geeks.ms/blogs/lfranco/archive/2008/05/15/acceder-a-la-cach-233-de-internet-explorer-i.aspx</link><pubDate>Thu, 15 May 2008 15:59:45 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:85779</guid><dc:creator>Lluis Franco</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/lfranco/rsscomments.aspx?PostID=85779</wfw:commentRss><comments>http://geeks.ms/blogs/lfranco/archive/2008/05/15/acceder-a-la-cach-233-de-internet-explorer-i.aspx#comments</comments><description>&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerI_E6DA/Internet2_2.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="192" alt="Internet2" src="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerI_E6DA/Internet2_thumb.jpg" width="189" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p align="justify"&gt;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.&lt;/p&gt; &lt;p align="justify"&gt;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&lt;/p&gt; &lt;hr /&gt;  &lt;p align="justify"&gt;&lt;strong&gt;El punto de partida:&lt;/strong&gt;&lt;/p&gt; &lt;p align="justify"&gt;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:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerI_E6DA/iecache_config_2.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="479" alt="iecache_config" src="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerI_E6DA/iecache_config_thumb.png" width="375" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p align="justify"&gt;Incluso si pulsamos la opción de ver archivos, el explorador nos muestra una vista similar a esto:&lt;/p&gt; &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerI_E6DA/iecache_files_2.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="377" alt="iecache_files" src="http://geeks.ms/blogs/lfranco/WindowsLiveWriter/AccederalacachdeInternetExplorerI_E6DA/iecache_files_thumb.png" width="644" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p align="justify"&gt;Sin embargo, esta vista se genera automáticamente a partir del contenido de un fichero llamado Index.dat, que se encuentra en la carpeta &amp;quot;Archivos temporales de Internet\Content.IEX&amp;quot;, 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.&lt;/p&gt; &lt;hr /&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Presentando a los protagonistas:&lt;/strong&gt;&lt;/p&gt; &lt;p align="justify"&gt;Como os decía anteriormente, a falta de poder usar código manejado vamos a utilizar los ladrillos del propio S.O. &lt;/p&gt; &lt;p align="justify"&gt;Esta estructura representa un elemento dentro de la caché de Internet.&lt;/p&gt; &lt;div&gt; &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;[StructLayout(LayoutKind.Sequential)]&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;struct&lt;/span&gt; INTERNET_CACHE_ENTRY_INFO&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;{&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; UInt32 dwStructSize;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; lpszSourceUrlName;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; lpszLocalFileName;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; UInt32 CacheEntryType;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; UInt32 dwUseCount;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; UInt32 dwHitRate;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; UInt32 dwSizeLow;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; UInt32 dwSizeHigh;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Win32API.FILETIME LastModifiedTime;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Win32API.FILETIME ExpireTime;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Win32API.FILETIME LastAccessTime;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Win32API.FILETIME LastSyncTime;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IntPtr lpHeaderInfo;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; UInt32 dwHeaderInfoSize;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; lpszFileExtension;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; UInt32 dwExemptDelta;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;}; &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Más información acerca de esta estructura en:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;INTERNET_CACHE_ENTRY_INFO Structure&lt;/div&gt;
&lt;div&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/aa385134(VS.85).aspx" href="http://msdn.microsoft.com/en-us/library/aa385134(VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/aa385134(VS.85).aspx&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;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.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;[DllImport(&lt;span style="color:#006080;"&gt;&amp;quot;wininet.dll&amp;quot;&lt;/span&gt;, SetLastError=&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)]&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;extern&lt;/span&gt; IntPtr FindFirstUrlCacheEntry(&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;  &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; lpszUrlSearchPattern, IntPtr lpFirstCacheEntryInfo, &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;  &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; UInt32 lpdwFirstCacheEntryInfoBufferSize );&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;[DllImport(&lt;span style="color:#006080;"&gt;&amp;quot;wininet.dll&amp;quot;&lt;/span&gt;, SetLastError=&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;)]&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;extern&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;long&lt;/span&gt; FindNextUrlCacheEntry(&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;  IntPtr hEnumHandle, IntPtr lpNextCacheEntryInfo, &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;  &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; UInt32 lpdwNextCacheEntryInfoBufferSize );&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Podéis encontrar más información acerca de ellas en:&lt;/p&gt;
&lt;p&gt;FindNextUrlCacheEntry Function&lt;br /&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/aa384049(VS.85).aspx" href="http://msdn.microsoft.com/en-us/library/aa384049(VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/aa384049(VS.85).aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;FindFirstUrlCacheEntry Function&lt;br /&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/aa384026(VS.85).aspx" href="http://msdn.microsoft.com/en-us/library/aa384026(VS.85).aspx"&gt;http://msdn.microsoft.com/en-us/library/aa384026(VS.85).aspx&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Y ahora que?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;Hasta mañana!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=85779" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/lfranco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Utilidad/default.aspx">Utilidad</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Windows/default.aspx">Windows</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/API/default.aspx">API</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Cache/default.aspx">Cache</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/IE/default.aspx">IE</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Explorer/default.aspx">Explorer</category></item></channel></rss>