<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rodrigo Díaz Concha &#187; Confianza Elevada</title>
	<atom:link href="http://rdiazconcha.com/tag/confianza-elevada/feed/" rel="self" type="application/rss+xml" />
	<link>http://rdiazconcha.com</link>
	<description>Silverlight y XAML en Español para México, Latinoamérica y España</description>
	<lastBuildDate>Thu, 02 Feb 2012 20:54:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Utilizando un esc&#225;ner desde una aplicaci&#243;n Silverlight</title>
		<link>http://rdiazconcha.com/2011/08/utilizando-un-escner-desde-una-aplicacin-silverlight/</link>
		<comments>http://rdiazconcha.com/2011/08/utilizando-un-escner-desde-una-aplicacin-silverlight/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 15:09:12 +0000</pubDate>
		<dc:creator>Rodrigo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Silverlight 4]]></category>
		<category><![CDATA[Silverlight 5]]></category>
		<category><![CDATA[Confianza Elevada]]></category>
		<category><![CDATA[escaner]]></category>
		<category><![CDATA[silverlight 5]]></category>
		<category><![CDATA[WIA]]></category>

		<guid isPermaLink="false">http://rdiazconcha.com/2011/08/utilizando-un-escner-desde-una-aplicacin-silverlight/</guid>
		<description><![CDATA[
Como he mencionado anteriormente aquí y aquí, las aplicaciones de Silverlight pueden ser clientes de automatización, es decir, pueden invocar los servidores de automatización registrados en el sistema operativo Windows de la máquina del usuario.
Un requerimiento bastante común en aplicaciones de negocio es poder utilizar el escáner conectado desde nuestro aplicativo, para poder digitalizar una [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://rdiazconcha.com/wp-content/uploads/2011/08/432532_sri_scanner.jpg"><img style="background-image: none; border-right-width: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="432532_sri_scanner" border="0" alt="432532_sri_scanner" align="left" src="http://rdiazconcha.com/wp-content/uploads/2011/08/432532_sri_scanner_thumb.jpg" width="160" height="240" /></a></p>
<p>Como he mencionado anteriormente <a href="http://rdiazconcha.com/2011/07/accediendo-a-tus-ensamblados-de-net-desde-silverlight/" target="_blank">aquí</a> y <a href="http://rdiazconcha.com/2011/01/cmo-obtener-la-direccin-ip-local-desde-una-aplicacin-de-silverlight/" target="_blank">aquí</a>, las aplicaciones de Silverlight pueden ser clientes de automatización, es decir, pueden invocar los servidores de automatización registrados en el sistema operativo Windows de la máquina del usuario.</p>
<p>Un requerimiento bastante común en aplicaciones de negocio es poder utilizar el escáner conectado desde nuestro aplicativo, para poder digitalizar una imagen y posteriormente serializarla a disco y/o presentarla en pantalla, etc.</p>
<p>En sistema operativo Windows contamos con <a href="http://msdn.microsoft.com/en-us/library/ms630368%28v=VS.85%29.aspx" target="_blank">WIA</a> (Windows Image Acquisition), la cual es una plataforma que permite a nuestras aplicaciones interactuar con hardware de imágenes y también estandariza la interacción entre las aplicaciones y los escáneres, es decir, es un común denominador entre el manufacturero del dispositivo y tú como desarrollador.&#160; WIA está presente en Windows desde Windows ME en adelante, y su versión más reciente es la 2.0.</p>
<p>Es importante notar que tu hardware debe ser compatible con WIA para que el código de ejemplo de este artículo funcione.&#160; Revisa la documentación de tu escáner para conocer si existe compatibilidad.</p>
<h3>WIA.CommonDialog</h3>
<p>El objeto <a href="http://msdn.microsoft.com/en-us/library/ms630492%28v=VS.85%29.aspx" target="_blank">WIA.CommonDialog</a> tiene diferentes métodos que nos ayudan a desplegar las cajas de diálogo para poder seleccionar un dispositivo de imagen, como una cámara o un escáner, y además para escanear una imagen.&#160; Si creamos una referencia a este objeto por medio de la clase AutomationFactory, podemos fácilmente integrar capacidades de escaneo en nuestra aplicación de Silverlight.</p>
<p>El objeto WIA.CommonDialog tiene algunos métodos bastantes interesantes, los cuales se destacan en la siguiente tabla:</p>
<table border="0" cellspacing="0" cellpadding="2" width="523">
<tbody>
<tr>
<td valign="top" width="200"><strong>ShowSelectDevice</strong></td>
<td valign="top" width="321">Muestra una caja de diálogo para seleccionar el dispositivo que deseamos utilizar, por ejemplo una cámara o un escáner.</td>
</tr>
<tr>
<td valign="top" width="200"><strong>ShowDeviceProperties</strong></td>
<td valign="top" width="321">Muestra las propiedades del dispositivo seleccionado en el método ShowSelectDevice</td>
</tr>
<tr>
<td valign="top" width="200"><strong>ShowAcquireImage</strong></td>
<td valign="top" width="321">Abre una caja de diálogo para escanear una imagen, usando el dispositivo configurado por default</td>
</tr>
</tbody>
</table>
<p>Por ejemplo, al ejecutar ShowSelectDevice(), se desplegará la siguiente caja de dialogo:</p>
<p><a href="http://rdiazconcha.com/wp-content/uploads/2011/08/SNAGHTML70d8f39.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML70d8f39" border="0" alt="SNAGHTML70d8f39" src="http://rdiazconcha.com/wp-content/uploads/2011/08/SNAGHTML70d8f39_thumb.png" width="500" height="328" /></a></p>
<p>Nota cómo también se muestran las cámaras conectadas en el equipo.</p>
<p>Para nuestro código utilizaremos el método <strong>ShowAcquireImage()</strong>.&#160; Este método regresa un objeto de tipo WIA.ImageFile, que representa la imagen digitalizada.</p>
<p>El siguiente fragmento de código muestra el uso de este método para desplegar la caja de diálogo para escanear.</p>
<pre class="csharpcode"><span class="kwrd">using</span> (dynamic commonDialog = AutomationFactory.CreateObject(<span class="str">&quot;WIA.CommonDialog&quot;</span>))
{
    dynamic imageFile;

    <span class="kwrd">try</span>
    {
        imageFile = commonDialog.ShowAcquireImage();
    }
    <span class="kwrd">catch</span> (Exception originalException)
    {
        <span class="kwrd">throw</span> <span class="kwrd">new</span> Exception(<span class="str">&quot;El scanner no está listo&quot;</span>, originalException);
    }</pre>
<p>La siguiente ilustración muestra la caja de diálogo después de haber seleccionado la vista previa de la imagen a escanear (en mi caso, la portada de <a href="http://www.amazon.com/Psyence-Fiction-U-N-K-L/dp/B00000AFK4" target="_blank">un disco bastante bueno</a> que les recomiendo ampliamente <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://rdiazconcha.com/wp-content/uploads/2011/08/wlEmoticon-smile.png" />)</p>
<p><a href="http://rdiazconcha.com/wp-content/uploads/2011/08/SNAGHTML7018e20.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML7018e20" border="0" alt="SNAGHTML7018e20" src="http://rdiazconcha.com/wp-content/uploads/2011/08/SNAGHTML7018e20_thumb.png" width="500" height="369" /></a></p>
<p>Al hacer clic en el botón “Scan”, la imagen será digitalizada.</p>
<p><a href="http://rdiazconcha.com/wp-content/uploads/2011/08/SNAGHTML700ad624.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML700ad62[4]" border="0" alt="SNAGHTML700ad62[4]" src="http://rdiazconcha.com/wp-content/uploads/2011/08/SNAGHTML700ad624_thumb.png" width="300" height="140" /></a></p>
<p>En este caso, estamos obteniendo la imagen escaneada y la guardamos en la variable llamada imageFile.&#160; No obstante, en este momento la imagen aún no ha sido convertida a algún formato válido.&#160; Para ello podemos utilizar otro objeto: WIA.ImageProcess.</p>
<h3>WIA.ImageProcess</h3>
<p>El objeto <a href="http://msdn.microsoft.com/en-us/library/ms630507%28v=vs.85%29.aspx" target="_blank">WIA.ImageProcess</a> permite manejar la lista de filtros que deseamos aplicar para una imagen.&#160; Un filtro en el contexto del objeto WIA.ImageProcess es una modificación a un objeto de tipo ImageFile.</p>
<p>En nuestro ejemplo, estamos creando una referencia al objeto WIA.ImageProcess, la cual guardaremos en una variable llamada imageProcess.&#160; Posteriormente, agregamos a la colección de filtros el filtro Convert, el cual nos servirá para convertir el formato de la imagen escaneada a un formato conocido, en este caso JPEG.</p>
<p>El formato JPEG en WIA está representado por el GUID {B96B3CAE-0728-11D3-9D7B-0000F81EF32E}, por lo que es buena idea tenerlo en una variable: la variable wiaFormatJPEG.&#160; Esto se lo indicamos a la propiedad FormatID del filtro Convert y finalmente aplicamos el filtro por medio de la ejecución del método Apply(), pasando como parámetro la imagen original.</p>
<pre class="csharpcode"><span class="kwrd">using</span> (dynamic imageProcess = AutomationFactory.CreateObject(<span class="str">&quot;WIA.ImageProcess&quot;</span>))
{
    imageProcess.Filters.Add(imageProcess.FilterInfos(<span class="str">&quot;Convert&quot;</span>).FilterID);
    imageProcess.Filters[1].Properties(<span class="str">&quot;FormatID&quot;</span>).Value = wiaFormatJPEG;</pre>
<pre class="csharpcode">//wiaFormatJPEG es una cadena con el GUID descrito

    <span class="kwrd">try</span>
    {
        dynamic newImageFile = imageProcess.Apply(imageFile);
        //guardar a disco u obtener el Stream</pre>
<pre class="csharpcode">     }</pre>
<pre class="csharpcode">}
     </pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>Ya con la nueva imagen convertida al formato JPEG podríamos obtener el Stream para poder usarlo en un BitmapImage, tal y como lo muestra la siguiente ilustración.</p>
<p><a href="http://rdiazconcha.com/wp-content/uploads/2011/08/SNAGHTML70007a2.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTML70007a2" border="0" alt="SNAGHTML70007a2" src="http://rdiazconcha.com/wp-content/uploads/2011/08/SNAGHTML70007a2_thumb.png" width="500" height="392" /></a></p>
<p>O si quisiéramos guardar la imagen a disco, sería muy sencillo hacer a través del método SaveFile().</p>
<pre class="csharpcode"><span class="kwrd">string</span> path = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
<span class="kwrd">string</span> fullFileName = <span class="kwrd">string</span>.Format(<span class="str">@&quot;{0}\{1}&quot;</span>, path, fileName);</pre>
<pre class="csharpcode">//fileName es el nombre del archivo

<span class="kwrd">if</span> (File.Exists(fullFileName))
    File.Delete(fullFileName);

newImageFile.SaveFile(fullFileName);</pre>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
</p>
<p>En este caso, se guardará la imagen escaneada, en formato JPEG, en la carpeta “My Pictures” de la máquina del usuario.</p>
]]></content:encoded>
			<wfw:commentRss>http://rdiazconcha.com/2011/08/utilizando-un-escner-desde-una-aplicacin-silverlight/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Silverlight 4 Beta &#8211; Confianza Elevada: Acceso al Sistema de Archivos</title>
		<link>http://rdiazconcha.com/2010/01/silverlight-4-beta-confianza-elevada-acceso-al-sistema-de-archivos/</link>
		<comments>http://rdiazconcha.com/2010/01/silverlight-4-beta-confianza-elevada-acceso-al-sistema-de-archivos/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 21:53:25 +0000</pubDate>
		<dc:creator>Rodrigo</dc:creator>
				<category><![CDATA[Silverlight 4]]></category>
		<category><![CDATA[Confianza Elevada]]></category>
		<category><![CDATA[SpecialFolder]]></category>

		<guid isPermaLink="false">http://rdiazconcha.com/?p=542</guid>
		<description><![CDATA[En un artículo anterior detallamos el nuevo modelo de Confianza en las aplicaciones de Silverlight 4: la Confianza Elevada.&#160; En este artículo usaremos este modo para poder acceder al sistema de archivos de la máquina del usuario sin necesidad de utilizar las cajas de diálogo OpenFileDialog o SaveFileDialog.
El proyecto
Para demostrar el acceso al sistema de [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://rdiazconcha.com/?p=538" target="_blank">En un artículo anterior</a> detallamos el nuevo modelo de Confianza en las aplicaciones de Silverlight 4: la Confianza Elevada.&#160; En este artículo usaremos este modo para poder acceder al sistema de archivos de la máquina del usuario sin necesidad de utilizar las cajas de diálogo OpenFileDialog o SaveFileDialog.</p>
<h3>El proyecto</h3>
<p>Para demostrar el acceso al sistema de archivos de la máquina del usuario crearemos una sencilla aplicación que muestre las imágenes de la carpeta “Mis Imágenes” en una lista y al hacer clic sobre cada una mostrar la imagen seleccionada.</p>
<p>Iniciaremos creando un nuevo proyecto de Silverlight 4 en Visual Studio .NET 2010 y lo nombraremos Demo.SL4.ConfianzaElevada.SistemaArchivos aceptando la opción predeterminada de crear un proyecto Web para probar la aplicación de Silverlight.</p>
<p>Además, necesitaremos configurar la aplicación para permitir la instalación Afuera del Navegador y será en la misma caja de diálogo de configuración en donde deberemos establecer el nivel de Confianza Elevada.&#160; <a href="http://rdiazconcha.com/?p=538" target="_blank">En el artículo anterior</a> detallamos cómo hacer esto.    </p>
<h3>Enumerador SpecialFolder</h3>
<p>Una vez instalada la aplicación en la máquina del usuario la clave será obtener la ruta en donde está la carpeta “Mis Imágenes”.&#160; Esto es debido a que en la versión de Silverlight 4 Beta (la última versión al momento de crear este artículo) únicamente tendremos acceso a las carpetas del perfil del usuario (las carpetas Mi *) sin necesidad de las cajas de diálogo.&#160; En vez de establecer la ruta de manera manual que potencialmente podría variar entre diferentes equipos y obviamente entre diferentes plataformas también es buena idea utilizar el enumerador SpecialFolder, quien nos regresará la ruta física según el valor seleccionado.&#160; A continuación se muestra el código relacionado al evento Loaded de la aplicación en donde usamos el enumerador SpecialFolder en conjunto con el método <strong>GetFolderPath()</strong> de la clase Environment:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8f8181fa-838d-410a-a761-63f7bcd8af73" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px;"><span style="color:#0000ff">void</span> <span style="color:#800000">MainPage_Loaded</span>(<span style="color:#0000ff">object</span> <span style="color:#800000">sender</span>, <span style="color:#2b91af">RoutedEventArgs</span> <span style="color:#800000">e</span>)<br /> {<br /> &#160;&#160;&#160;&#160;<span style="color:#008000">//Checamos si est&#225; ejecutando en Confianza Elevada</span><br /> &#160;&#160;&#160;&#160;<span style="color:#0000ff">if</span> (<span style="color:#2b91af">Application</span>.<span style="color:#800000">Current</span>.<span style="color:#800000">HasElevatedPermissions</span>)<br /> &#160;&#160;&#160;&#160;{<br /> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#008000">//Obtiene la ruta a la carpeta &quot;Mis Im&#225;genes&quot;</span><br /> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#0000ff">string</span> <span style="color:#800000">myPicturesPath</span> = <span style="color:#2b91af">Environment</span>.<span style="color:#800000">GetFolderPath</span>(<span style="color:#2b91af">Environment</span>.<span style="color:#2b91af">SpecialFolder</span>.<span style="color:#800000">MyPictures</span>);</p>
<p> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#008000">//Establece como fuente de datos la lista de archivos en la carpeta</span><br /> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#008000">//siempre y cuando sean JPG o PNG</span><br /> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#800000">pictureList</span>.<span style="color:#800000">ItemsSource</span> = <br /> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#800000">System</span>.<span style="color:#800000">IO</span>.<span style="color:#2b91af">Directory</span>.<span style="color:#800000">EnumerateFiles</span>(<span style="color:#800000">myPicturesPath</span>).<span style="color:#800000">Where</span>(<span style="color:#800000">f</span> =&gt; <span style="color:#800000">f</span>.<span style="color:#800000">EndsWith</span>(<span style="color:#ff0000">&quot;.jpg&quot;</span>) || <span style="color:#800000">f</span>.<span style="color:#800000">EndsWith</span>(<span style="color:#ff0000">&quot;.png&quot;</span>));<br /> &#160;&#160;&#160;&#160;}<br /> }</div>
</p></div>
</p></div>
<p>Es muy importante destacar la propiedad HasElevatedPermissions de la clase Application ya que esta propiedad nos indica ultimadamente si la aplicación está ejecutando en Confianza Elevada o no.&#160; Por tal motivo será buena idea encerrar la ejecución de código en el bloque if{}.</p>
<blockquote><p>Si bien las únicas carpetas a las que tenemos acceso sin necesidad de utilizar OpenFileDialog y SaveFileDialog son aquellas del perfil del usuario, a través de las cajas de diálogo podemos seguir teniendo acceso a <em>cualquier</em> carpeta que el usuario indique.&#160; Incluso, en Confianza Elevada podemos obtener más información acerca de los archivos seleccionados a través de estas cajas de diálogo, por ejemplo, la ruta física <em>completa</em> del archivo en cuestión</p>
</blockquote>
<p>El resultado de la aplicación es el siguiente:</p>
<p><a href="http://rdiazconcha.com/wp-content/uploads/2010/01/image3.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://rdiazconcha.com/wp-content/uploads/2010/01/image_thumb3.png" width="504" height="396" /></a>&#160;</p>
<h3>Resumen</h3>
<p>Las aplicaciones que ejecutan en Confianza Elevada tienen más funcionalidad, como por ejemplo el acceso al sistema de archivos de la máquina del usuario.</p>
<p>Sin usar las cajas de diálogo tradicionales OpenFileDialog y SaveFileDialog podemos acceder a las carpetas del perfil del usuario: Mis Imágenes, Mis Videos, Mi Música y Mis Documentos y potencialmente leer los archivos y su información relacionada.</p>
<p>Puedes descargar el código <a href="http://rdiazconcha.com/Files/Demo.SL4.ConfianzaElevada.SistemaArchivos.rar" target="_blank">aquí</a></p>
<p>Puedes ver la demo en vivo <a href="http://rdiazconcha.com/demos/SL4_ConfianzaElevada_SistemaArchivos/Demo.SL4.ConfianzaElevada.SistemaArchivosTestPage.aspx" target="_blank">aquí</a> (requiere Silverlight 4 y ejecutar la aplicación Fuera del Navegador)</p>
]]></content:encoded>
			<wfw:commentRss>http://rdiazconcha.com/2010/01/silverlight-4-beta-confianza-elevada-acceso-al-sistema-de-archivos/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Silverlight 4 Beta &#8211; Confianza Elevada: Introducci&#243;n</title>
		<link>http://rdiazconcha.com/2010/01/silverlight-4-beta-confianza-elevada-introduccin/</link>
		<comments>http://rdiazconcha.com/2010/01/silverlight-4-beta-confianza-elevada-introduccin/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 19:24:48 +0000</pubDate>
		<dc:creator>Rodrigo</dc:creator>
				<category><![CDATA[Silverlight 4]]></category>
		<category><![CDATA[Confianza Elevada]]></category>

		<guid isPermaLink="false">http://rdiazconcha.com/?p=538</guid>
		<description><![CDATA[Introducción
De manera predeterminada, las aplicaciones de Silverlight ejecutan en un ambiente conocido como un sandbox el cual permite que corran en confianza parcial.&#160; Las aplicaciones que ejecutan en confianza parcial tienen acceso limitado a recursos y están limitadas en funcionalidad para evitar escenarios en donde el código desee hacer algo dañino al usuario.
Silverlight 4 incluye [...]]]></description>
			<content:encoded><![CDATA[<h2>Introducción</h2>
<p>De manera predeterminada, las aplicaciones de Silverlight ejecutan en un ambiente conocido como un <em>sandbox</em> el cual permite que corran en confianza parcial.&#160; Las aplicaciones que ejecutan en confianza parcial tienen acceso limitado a recursos y están limitadas en funcionalidad para evitar escenarios en donde el código desee hacer algo dañino al usuario.</p>
<p>Silverlight 4 incluye la posibilidad de ejecutar las aplicaciones en Confianza Elevada.&#160; Cuando una aplicación ejecuta de esta manera se superan las limitantes del propio sandbox permitiendo que el aplicativo tenga acceso a recursos antes inaccesibles y a escenarios de funcionalidad <em>casi</em> como si se tratase de una aplicación de escritorio.</p>
<p>A continuación enlisto las posibilidades que se abren al crear este tipo de aplicaciones:</p>
<h3>Acceso al Sistema de Archivos</h3>
<p>Las aplicaciones que ejecutan en Confianza Elevada tienen acceso al Sistema de Archivos de la máquina del usuario sin necesidad de utilizar las cajas de diálogo OpenFileDialog y/o SaveFileDialog: los mecanismos clásicos utilizados para aplicaciones en confianza parcial.&#160; No obstante, a la fecha de creación de este artículo las únicas carpetas a las que puede tener acceso en Confianza Elevada son las del perfil del usuario: Mis Documentos, Mis Imágenes, Mis Videos y Mi Música.</p>
<blockquote><p>Mis Documentos, Mis Imágenes, Mis Videos y Mi Música son las únicas carpetas –por lo menos en Silverlight 4 Beta- a las que puede tener acceso una aplicación que ejecute en Confianza Elevada</p>
</blockquote>
<h3>Acceso ‘relajado’ a otros Dominios</h3>
<p>De manera predeterminada, una aplicación que ejecuta en confianza parcial requiere uno de los archivos de política de seguridad (crossdomain.xml o clientaccesspolicy.xml) para poder acceder a un endpoint o recurso localizado en un dominio diferente al dominio en donde está la aplicación Silverlight.&#160; Cuando se ejecuta en modo de Confianza Elevada este requerimiento es anulado, permitiendo que los aplicativos accedan a cualquier recurso en dominios externos.</p>
<h3>Soporte completo al modo Pantalla Completa</h3>
<p>Las aplicaciones que ejecutan en confianza parcial tienen acceso limitado al teclado cuando corren en Pantalla Completa, esto para evitar que una aplicación que simule la pantalla de credenciales del sistema operativo engañe al usuario.&#160;&#160; Asimismo, en confianza parcial se muestra un mensaje indicando que la aplicación está corriendo en Pantalla Completa.&#160; La siguiente figura muestra el mensaje que es mostrado al usuario:</p>
<p><a href="http://rdiazconcha.com/wp-content/uploads/2010/01/image.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://rdiazconcha.com/wp-content/uploads/2010/01/image_thumb.png" width="504" height="77" /></a> </p>
<p>Cuando una aplicación está configurada y corre en modo de Confianza Elevada el anterior mensaje es anulado y además la aplicación permite tener acceso completo al teclado.</p>
<h3>Inicialización del Usuario ‘relajada’</h3>
<p>Hay algunas características de la plataforma Silverlight que requieren ser invocadas por algún evento iniciado por el usuario: el clic de un botón del mouse o del teclado.&#160; En modo de Confianza Elevada este requisito se suaviza permitiendo así que la característica en cuestión sea invocada desde eventos automáticos de la aplicación (el evento Load tal vez).&#160; Un ejemplo claro es precisamente el punto anterior, el modo de Pantalla Completa que en confianza parcial exige que sea iniciado por algún evento del usuario.&#160; Por otro lado, en Confianza Elevada el modo de Pantalla Completa podrá ser invocado desde cualquier evento de la aplicación.</p>
<h3>Acceso a COM</h3>
<p>En Confianza Elevada, las aplicaciones podrán invocar componentes COM para extender su funcionalidad.&#160; Cabe mencionar que esta característica está presente únicamente para el sistema operativo Windows ya que en Mac OS no existe el concepto de COM.</p>
<p>Un punto en donde esta característica es especialmente útil es al integrar nuestras aplicaciones con Office, ya que podríamos desde Silverlight invocar vía COM las funcionalidades de cualquiera de sus productos.&#160; En realidad, cualquier producto que exponga un componente de COM podría ser invocado desde nuestros aplicativos de Silverlight para complementar su funcionalidad.</p>
<h2>Habilitando la Confianza Elevada</h2>
<p>Ya que el modo de Confianza Elevada únicamente está presente para aplicaciones que ejecuten Afuera del Navegador, se ha agregado en la caja de diálogo de configuración de este tipo de aplicaciones la opción de ejecutar en Confianza Elevada:</p>
<p><a href="http://rdiazconcha.com/wp-content/uploads/2010/01/image1.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://rdiazconcha.com/wp-content/uploads/2010/01/image_thumb1.png" width="504" height="616" /></a> </p>
<p>Al habilitar esta opción, el manifiesto de la aplicación cambiará apropiadamente.&#160; El siguiente fragmento de código muestra el archivo OutOfBrowserSettings.xml, archivo que será posteriormente incluido en el manifiesto presente en el archivo .xap:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7fe45c3d-5386-43fa-8e7d-b9897b53e5ac" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px;"><span style="color:#0000ff">&lt;</span><span style="color:#a31515">OutOfBrowserSettings</span><span style="color:#0000ff"> </span><span style="color:#ff0000">ShortName</span><span style="color:#0000ff">=</span>&quot;<span style="color:#0000ff">Demo.SL4.ConfianzaElevada Application</span>&quot;<span style="color:#0000ff"> </span><span style="color:#ff0000">EnableGPUAcceleration</span><span style="color:#0000ff">=</span>&quot;<span style="color:#0000ff">False</span>&quot;<span style="color:#0000ff"> </span><span style="color:#ff0000">ShowInstallMenuItem</span><span style="color:#0000ff">=</span>&quot;<span style="color:#0000ff">True</span>&quot;<span style="color:#0000ff">&gt;</span><br /> &#160;&#160;<span style="color:#0000ff">&lt;</span><span style="color:#a31515">OutOfBrowserSettings.Blurb</span><span style="color:#0000ff">&gt;</span>Demo.SL4.ConfianzaElevada Application on your desktop; at home, at work or on the go.<span style="color:#0000ff">&lt;/</span><span style="color:#a31515">OutOfBrowserSettings.Blurb</span><span style="color:#0000ff">&gt;</span><br /> &#160;&#160;<span style="color:#0000ff">&lt;</span><span style="color:#a31515">OutOfBrowserSettings.WindowSettings</span><span style="color:#0000ff">&gt;</span><br /> &#160;&#160;&#160;&#160;<span style="color:#0000ff">&lt;</span><span style="color:#a31515">WindowSettings</span><span style="color:#0000ff"> </span><span style="color:#ff0000">Title</span><span style="color:#0000ff">=</span>&quot;<span style="color:#0000ff">Demo.SL4.ConfianzaElevada Application</span>&quot;<span style="color:#0000ff"> /&gt;</span><br /> &#160;&#160;<span style="color:#0000ff">&lt;/</span><span style="color:#a31515">OutOfBrowserSettings.WindowSettings</span><span style="color:#0000ff">&gt;</span><br /> &#160;&#160;<span style="color:#0000ff">&lt;</span><span style="color:#a31515">OutOfBrowserSettings.SecuritySettings</span><span style="color:#0000ff">&gt;</span><br /> &#160;&#160;&#160;&#160;<span style="color:#0000ff">&lt;</span><span style="color:#a31515">SecuritySettings</span><span style="color:#0000ff"> </span><span style="color:#ff0000">ElevatedPermissions</span><span style="color:#0000ff">=</span>&quot;<span style="color:#0000ff">Required</span>&quot;<span style="color:#0000ff"> /&gt;</span><br /> &#160;&#160;<span style="color:#0000ff">&lt;/</span><span style="color:#a31515">OutOfBrowserSettings.SecuritySettings</span><span style="color:#0000ff">&gt;</span><br /> &#160;&#160;<span style="color:#0000ff">&lt;</span><span style="color:#a31515">OutOfBrowserSettings.Icons</span><span style="color:#0000ff"> /&gt;</span><br /> <span style="color:#0000ff">&lt;/</span><span style="color:#a31515">OutOfBrowserSettings</span><span style="color:#0000ff">&gt;</span></div>
</p></div>
</p></div>
<p>Como podrán observar en el fragmento de código anterior, es el elemento &lt;SecuritySettings&gt; el cual indica si la aplicación ejecutará en Confianza Elevada o no.</p>
<blockquote><p>Las aplicaciones Fuera del Navegador son las únicas que tienen la posibilidad de ejecutar en Confianza Elevada.&#160; Las aplicaciones que corren adentro del navegador siempre ejecutarán en confianza parcial</p>
</blockquote>
<p>Asimismo, la caja de diálogo de instalación de las aplicaciones cambia, advirtiendo al usuario que únicamente instale aplicaciones de sitios de confianza, ya que potencialmente este tipo de aplicativos puede dañar su equipo o hacer cosas maliciosas.</p>
<p><a href="http://rdiazconcha.com/wp-content/uploads/2010/01/image2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://rdiazconcha.com/wp-content/uploads/2010/01/image_thumb2.png" width="504" height="348" /></a>&#160;</p>
<h2>Resumen</h2>
<p>En Silverlight 4 se agrega el modo de Confianza Elevada para que este tipo de aplicaciones superen las limitantes ya conocidas de la confianza parcial: modo predeterminado en el que ejecutan las aplicaciones de Silverlight.&#160; Esto es especialmente interesante y emocionante para las personas que nos dedicamos a crear soluciones con esta plataforma ya que la línea de separación entre aplicaciones Web y de Escritorio cada vez es más delgada.</p>
<p>No obstante, si bien al habilitar esta opción se abre una puerta a mayores posibilidades de funcionalidad, también se abre otra: la de escenarios potencialmente maliciosos.&#160; Pero aquí debemos ser muy claros: es y será la responsabilidad de cada usuario el decidir si instala o no en su equipo este tipo de aplicativos; sin embargo, es en este campo de cultura digital en donde falta mucho por hacer ya que independientemente de la plataforma tecnológica, es necesaria la educación en términos de seguridad y riesgo a toda persona que tenga contacto con un equipo de cómputo, para evitar a toda costa la propagación de aplicativos que tengan comportamientos contraproducentes, sobre todo a aquellas personas que no están directamente ligadas al ámbito tecnológico.</p>
<p>Un mundo de posibilidades está a nuestro alcance, aprovechémoslo con responsabilidad.</p>
]]></content:encoded>
			<wfw:commentRss>http://rdiazconcha.com/2010/01/silverlight-4-beta-confianza-elevada-introduccin/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Silverlight 4 Beta &#8211; Acceso al Portapapeles</title>
		<link>http://rdiazconcha.com/2009/11/silverlight-4-beta-acceso-al-portapapeles/</link>
		<comments>http://rdiazconcha.com/2009/11/silverlight-4-beta-acceso-al-portapapeles/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 21:45:42 +0000</pubDate>
		<dc:creator>Rodrigo</dc:creator>
				<category><![CDATA[Silverlight 4]]></category>
		<category><![CDATA[Clipboard]]></category>
		<category><![CDATA[Confianza Elevada]]></category>
		<category><![CDATA[Portapapeles]]></category>

		<guid isPermaLink="false">http://rdiazconcha.com/?p=479</guid>
		<description><![CDATA[Silverlight 4 incorpora la posibilidad de acceder programáticamente al Portapapeles desde nuestra aplicación.&#160; En este artículo veremos esta pequeña pero importante funcionalidad.
El proyecto
Crearemos un proyecto de Silverlight 4 por medio de Visual Studio 2010 Beta 2.&#160; Al proyecto lo nombraremos Demo.SL4.Portapapeles y aceptaremos las opciones por default de creación del proyecto Web para probar la [...]]]></description>
			<content:encoded><![CDATA[<p>Silverlight 4 incorpora la posibilidad de acceder programáticamente al Portapapeles desde nuestra aplicación.&#160; En este artículo veremos esta pequeña pero importante funcionalidad.</p>
<h3>El proyecto</h3>
<p>Crearemos un proyecto de Silverlight 4 por medio de Visual Studio 2010 Beta 2.&#160; Al proyecto lo nombraremos Demo.SL4.Portapapeles y aceptaremos las opciones por default de creación del proyecto Web para probar la aplicación.&#160; La aplicación tendrá la siguiente Interface de Usuario:</p>
<p><a href="http://rdiazconcha.com/wp-content/uploads/2009/11/image14.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://rdiazconcha.com/wp-content/uploads/2009/11/image_thumb14.png" width="504" height="506" /></a>&#160;</p>
<p>En el primer botón guardaremos el texto del TextBox en el Portapapeles.&#160; Además, su propiedad IsEnabled estará atada a la ruta de propiedad Text.Length del TextBox.&#160; Este es un buen ejemplo de <a href="http://rdiazconcha.com/?p=185" target="_blank">Atado de Datos entre Elementos</a>.&#160; En el segundo botón leeremos el contenido del Portapapeles y lo pondremos en el TextBlock.</p>
<p>La aplicación estará configurada para poder correr en Confianza Elevada para mostrar los conceptos aquí demostrados.</p>
<h3>Clase Clipboard</h3>
<p>La clase que permite el acceso al Portapapeles es la clase <strong>System.Windows.Clipboard</strong>.&#160; Es importante mencionar lo siguiente:</p>
<ul>
<li>El método ContainsText() indica si el Portapapeles tiene contenido</li>
<li>Para aplicaciones que estén corriendo en el sandbox (aplicaciones dentro del Navegador o Aplicaciones Fuera del Navegador tradicionales), la ejecución de los métodos<strong> GetText()</strong> y <strong>SetText()</strong> provoca la siguiente caja de diálogo, para que el usuario dé permiso explícito a la aplicación para usar el Portapapeles.&#160; Cabe mencionar que GetText() y SetText() en este caso deberán ser iniciadas por una acción del usuario (ejemplo: el Click de un botón):</li>
</ul>
<p><a href="http://rdiazconcha.com/wp-content/uploads/2009/11/image15.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://rdiazconcha.com/wp-content/uploads/2009/11/image_thumb15.png" width="404" height="184" /></a>&#160;</p>
<ul>
<li>Para las aplicaciones que ejecuten en Confianza Elevada, la anterior caja de diálogo es omitida y tendremos acceso directo a los métodos de la clase.&#160; Además los métodos podrán ser ejecutados desde cualquier evento.&#160; Tal es el caso de nuestra aplicación de ejemplo en donde tenemos el siguiente código:</li>
</ul>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:85e5ca6a-6859-4ba2-ac18-28224581c24f" class="wlWriterEditableSmartContent">
<div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt">
<div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px;"><span style="color:#0000ff">this</span>.<span style="color:#800000">Loaded</span> += (<span style="color:#800000">s</span>, <span style="color:#800000">a</span>) =&gt;<br /> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br /> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#0000ff">if</span> (<span style="color:#2b91af">Application</span>.<span style="color:#800000">Current</span>.<span style="color:#800000">HasElevatedPermissions</span>)<br /> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br /> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#2b91af">Clipboard</span>.<span style="color:#800000">SetText</span>(<span style="color:#ff0000">&quot;Corriendo en confianza elevada &quot;</span> + <span style="color:#2b91af">DateTime</span>.<span style="color:#800000">Now</span>.<span style="color:#800000">ToString</span>());<br /> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<span style="color:#800000">textBox1</span>.<span style="color:#800000">Text</span> = <span style="color:#2b91af">Clipboard</span>.<span style="color:#800000">GetText</span>();<br /> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br /> &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;};</div>
</p></div>
</p></div>
<p>En el código podemos apreciar cómo estamos ejecutando el método SetText() siempre y cuando la aplicación esté corriendo en Confianza Elevada.</p>
<ul>
<li>El Portapapeles en Silverlight 4 (en esta versión Beta por lo menos), únicamente soporta cadenas de texto tipo Unicode.</li>
</ul>
<h3>Resultado</h3>
<p>La aplicación ejecutando en Confianza Elevada:</p>
<p><a href="http://rdiazconcha.com/wp-content/uploads/2009/11/image16.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://rdiazconcha.com/wp-content/uploads/2009/11/image_thumb16.png" width="504" height="412" /></a> </p>
<h3>Resumen</h3>
<p>La clase System.Windows.Clipboard nos permite tener acceso programático al Portapapeles.&#160; Si la aplicación está ejecutando en el sandbox (Confianza Parcial), el usuario tendrá que dar permiso explícito a través de una caja de diálogo para poder usar el Portapapeles.&#160; Si la aplicación ejecuta en Confianza Elevada, esta caja de diálogo es omitida.</p>
<p>Pueden descargar el código de <a href="http://rdiazconcha.com/Files/Demo.SL4.Portapapeles.rar" target="_blank">aquí</a></p>
<p>Pueden ver el demo en vivo <a href="http://rdiazconcha.com/demos/SL4_Portapapeles/Demo.SL4.PortapapelesTestPage.aspx" target="_blank">aquí</a> (requiere Silverlight 4)</p>
]]></content:encoded>
			<wfw:commentRss>http://rdiazconcha.com/2009/11/silverlight-4-beta-acceso-al-portapapeles/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

