<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang=""><title type="html">Lluís Franco on Geeks.ms</title><subtitle type="html">El Framework y yo...</subtitle><id>http://geeks.ms/blogs/lfranco/atom.aspx</id><link rel="alternate" type="text/html" href="http://geeks.ms/blogs/lfranco/default.aspx" /><link rel="self" type="application/atom+xml" href="http://geeks.ms/blogs/lfranco/atom.aspx" /><generator uri="http://communityserver.org" version="4.1.31106.3070">Community Server</generator><updated>2009-10-29T09:01:00Z</updated><entry><title>Creando aplicaciones para Windows Phone 7 usando Silverlight</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2010/03/19/creando-aplicaciones-para-windows-phone-7-usando-silverlight.aspx" /><id>/blogs/lfranco/archive/2010/03/19/creando-aplicaciones-para-windows-phone-7-usando-silverlight.aspx</id><published>2010-03-19T08:01:00Z</published><updated>2010-03-19T08:01:00Z</updated><content type="html">&lt;p&gt;Ya empiezan a verse los primeros ejemplos interesantes de desarrollo para Windows Phone 7.&lt;/p&gt;
&lt;p align="justify"&gt;En el blog de &lt;a href="http://weblogs.asp.net/scottgu/default.aspx"&gt;ScottGu&lt;/a&gt;, pod&amp;eacute;is encontrar dos peque&amp;ntilde;os ejemplos que utiliz&amp;oacute; en su charla del MIX10 (&lt;a href="http://live.visitmix.com/MIX10/Sessions/KEY01"&gt;v&amp;iacute;deo&lt;/a&gt; aqu&amp;iacute;). El primero es un sencillo Hello world, y el segundo utiliza LINQ to XML y el APi de Twitter para mostrar todas los tweets de un tag determinado (en el ejemplo scottgu).&lt;/p&gt;
&lt;p align="justify"&gt;Darle un vistazo porque vale la pena, y adem&amp;aacute;s, m&amp;aacute;s sencillo imposible! :-)&lt;/p&gt;
&lt;p align="justify"&gt;Art&amp;iacute;culo original en:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/03/18/building-a-windows-phone-7-twitter-application-using-silverlight.aspx" title="http://weblogs.asp.net/scottgu/archive/2010/03/18/building-a-windows-phone-7-twitter-application-using-silverlight.aspx"&gt;http://weblogs.asp.net/scottgu/archive/2010/03/18/building-a-windows-phone-7-twitter-application-using-silverlight.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://weblogs.asp.net/blogs/scottgu/image_67629029.png"&gt;&lt;img border="0" width="284" src="http://weblogs.asp.net/blogs/scottgu/image_thumb_661DF74A.png" alt="image" height="480" title="image" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Saludos! :-)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=170671" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term=".NET" scheme="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx" /><category term="Silverlight" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Silverlight/default.aspx" /><category term="2010" scheme="http://geeks.ms/blogs/lfranco/archive/tags/2010/default.aspx" /><category term="ScottGu" scheme="http://geeks.ms/blogs/lfranco/archive/tags/ScottGu/default.aspx" /><category term="4.0" scheme="http://geeks.ms/blogs/lfranco/archive/tags/4.0/default.aspx" /><category term="Twitter" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Twitter/default.aspx" /></entry><entry><title>Silverlight 4.0 RC disponible</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2010/03/16/silverlight-4-0-rc-disponible.aspx" /><id>/blogs/lfranco/archive/2010/03/16/silverlight-4-0-rc-disponible.aspx</id><published>2010-03-16T08:17:00Z</published><updated>2010-03-16T08:17:00Z</updated><content type="html">&lt;p align="justify"&gt;&lt;img border="0" width="340" src="http://image.email.microsoftemail.com/lib/feed1d7871600d/m/1/Silverlight340x98.png" alt="Silverlight340x98" height="98" title="Silverlight340x98" /&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Al fin! Despu&amp;eacute;s de unas semanas de incertidumbre, por fin se ha desvelado que Silverlight 4.0 ver&amp;aacute; la luz el pr&amp;oacute;ximo mes. Suerte de aquellos que puedan asistir al &lt;a href="http://click.email.microsoftemail.com/?qs=100c3c8c6f6ebaf5002219f54902bceb6fe9efd9cb40b75aba96ed5f59eba80e5a8d53374409feb8"&gt;ASP.NET and Silverlight Conference&lt;/a&gt; en las Vegas, del 12 al 14 de Abril, porque adem&amp;aacute;s podr&amp;aacute;n ver el lanzamiento de VS2010 a nivel mundial.&lt;/p&gt;
&lt;p align="justify"&gt;De momento y para hacer boca (y poder desarrollar con la Release Candidate sobre VS2010 :-P), os dejo el enlace y algo e informaci&amp;oacute;n (en ingl&amp;eacute;s) para que os pod&amp;aacute;is descargar las herramientas necesarias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=141284"&gt;Silverlight 4 Tools for Visual Studio 2010&lt;/a&gt; &lt;br /&gt;This will install the developer runtime of Silverlight 4, the Visual Studio project support and the &lt;a href="http://go.microsoft.com/fwlink/?LinkID=169408"&gt;Silverlight 4 SDK&lt;/a&gt;. If you are developing Silverlight 4 applications, this will be the &lt;strong&gt;minimum&lt;/strong&gt; you want to install! &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=167220"&gt;Windows Runtime&lt;/a&gt; or &lt;a href="http://go.microsoft.com/fwlink/?LinkID=167221"&gt;Mac Runtime&lt;/a&gt; &lt;br /&gt;If you installed the tools above, you will get the developer runtime and there is no need to install again. These downloads are being made available for test machines for the Windows and Mac platforms for your applications. &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=169446"&gt;Expression Blend 4 Beta&lt;/a&gt; &lt;br /&gt;This is a beta version of Expression Blend that will enable authoring of Silverlight 4 applications. &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;a href="http://silverlight.codeplex.com"&gt;Silverlight Toolkit&lt;/a&gt; &lt;br /&gt;The toolkit has been updated to provide support for Visual Studio 2010 and Silverlight 4 development. The Toolkit provides numerous controls for your application and source code is also included for these controls using an Open Source license. &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;a href="http://silverlight.net/getstarted/riaservices/"&gt;WCF RIA Services&lt;/a&gt; &lt;br /&gt;Microsoft WCF RIA Services simplifies the traditional n-tier application pattern by bringing together the ASP.NET and Silverlight platforms. The RIA Services provides a pattern to write application logic that runs on the mid-tier and controls access to data for queries, changes and custom operations. It also provides end-to-end support for common tasks such as data validation, authentication and roles by integrating with Silverlight components on the client and ASP.NET on the mid-tier. &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=111305"&gt;Online Silverlight 4 Documentation&lt;/a&gt; &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=167824"&gt;Offline CHM help Silverlight 4Documentation file download&lt;/a&gt; &lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;M&amp;aacute;s informaci&amp;oacute;n en:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://silverlight.net/getstarted/silverlight-4/" title="http://silverlight.net/getstarted/silverlight-4/"&gt;http://silverlight.net/getstarted/silverlight-4/&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=170406" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term=".NET" scheme="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx" /><category term="Silverlight" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Silverlight/default.aspx" /><category term="2010" scheme="http://geeks.ms/blogs/lfranco/archive/tags/2010/default.aspx" /><category term="4.0" scheme="http://geeks.ms/blogs/lfranco/archive/tags/4.0/default.aspx" /><category term="RC" scheme="http://geeks.ms/blogs/lfranco/archive/tags/RC/default.aspx" /></entry><entry><title>Usando ASP.NET membrership en Winforms (3 / n)</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2010/02/05/usando-asp-net-membrership-en-winforms-3-n.aspx" /><id>/blogs/lfranco/archive/2010/02/05/usando-asp-net-membrership-en-winforms-3-n.aspx</id><published>2010-02-05T10:10:00Z</published><updated>2010-02-05T10:10:00Z</updated><content type="html">&lt;h4&gt;El modelo de objetos de membres&amp;iacute;a (Membership object model)&lt;/h4&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/UsandoASP.NETmembrershipenWinforms3n_F964/Membershipom.png"&gt;&lt;img height="186" width="244" src="http://www.uyssoft.com/blog/images/UsandoASP.NETmembrershipenWinforms3n_F964/Membershipom_thumb.png" alt="Membershipom" border="0" title="Membershipom" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;O lo que es lo mismo, el pan nuestro de cada d&amp;iacute;a en lo relativo a administrar la seguridad basada en membres&amp;iacute;a. Para acceder a este cojunto de clases es necesario agregar los namespaces &lt;strong&gt;System.Web&lt;/strong&gt; y &lt;strong&gt;System.Web.Extensions&lt;/strong&gt;, que contienen las clases necesarias para interactuar con la base de datos de membres&amp;iacute;a descrita en el art&amp;iacute;culo anterior.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/UsandoASP.NETmembrershipenWinforms3n_F964/References.png"&gt;&lt;img height="298" width="359" src="http://www.uyssoft.com/blog/images/UsandoASP.NETmembrershipenWinforms3n_F964/References_thumb.png" alt="References" border="0" title="References" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;Conocer este conjunto de clases es vital para poder aprovechar todas las caracter&amp;iacute;sticas de este sistema, de modo que aqu&amp;iacute; va una tabla con las principales elementos y funcionalidades:&lt;/p&gt;
&lt;table cellpadding="0" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="bottom"&gt;
&lt;p&gt;&lt;b&gt;Clase/interfaz&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="bottom"&gt;
&lt;p&gt;&lt;b&gt;Funciones&lt;/b&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/system.web.security.membership.aspx"&gt;Membership&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Proporciona los servicios de suscripci&amp;oacute;n generales.&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top"&gt;
&lt;p&gt;Crea un nuevo usuario.&lt;/p&gt;
&lt;p&gt;Elimina un usuario.&lt;/p&gt;
&lt;p&gt;Actualiza un usuario con nueva informaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Devuelve una lista de usuarios.&lt;/p&gt;
&lt;p&gt;Encuentra un usuario por el nombre o el correo electr&amp;oacute;nico.&lt;/p&gt;
&lt;p&gt;Valida (autentica) un usuario.&lt;/p&gt;
&lt;p&gt;Obtiene el n&amp;uacute;mero de usuarios conectados.&lt;/p&gt;
&lt;p&gt;Busca los usuarios por el nombre de usuario o la direcci&amp;oacute;n de correo electr&amp;oacute;nico.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/system.web.security.membershipuser.aspx"&gt;MembershipUser&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Proporciona informaci&amp;oacute;n sobre un usuario concreto.&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top"&gt;
&lt;p&gt;Obtiene la contrase&amp;ntilde;a y la pregunta de la contrase&amp;ntilde;a.&lt;/p&gt;
&lt;p&gt;Cambia la contrase&amp;ntilde;a.&lt;/p&gt;
&lt;p&gt;Determina si el usuario est&amp;aacute; conectado.&lt;/p&gt;
&lt;p&gt;Determina si el usuario est&amp;aacute; validado.&lt;/p&gt;
&lt;p&gt;Devuelve la fecha de la &amp;uacute;ltima actividad, del &amp;uacute;ltimo inicio de sesi&amp;oacute;n y del &amp;uacute;ltimo cambio de contrase&amp;ntilde;a.&lt;/p&gt;
&lt;p&gt;Desbloquea un usuario.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/system.web.security.membershipprovider.aspx"&gt;MembershipProvider&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Define la funcionalidad de los proveedores de datos que el sistema de suscripci&amp;oacute;n puede utilizar.&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top"&gt;
&lt;p&gt;Define los m&amp;eacute;todos y las propiedades que necesita implementar un proveedor utilizado en la suscripci&amp;oacute;n.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/system.web.security.membershipprovidercollection.aspx"&gt;MembershipProviderCollection&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top"&gt;
&lt;p&gt;Devuelve una colecci&amp;oacute;n de todos los proveedores disponibles.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/system.web.security.membershipusercollection.aspx"&gt;MembershipUserCollection&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top"&gt;
&lt;p&gt;Almacena las referencias a los objetos &lt;a href="http://msdn.microsoft.com/es-es/library/system.web.security.membershipuser.aspx"&gt;MembershipUser&lt;/a&gt;.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/system.web.security.membershipcreatestatus.aspx"&gt;MembershipCreateStatus&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top"&gt;
&lt;p&gt;Proporciona los valores descriptivos de &amp;eacute;xito o error al crear un nuevo usuario suscrito.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/system.web.security.membershipcreateuserexception.aspx"&gt;MembershipCreateUserException&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top"&gt;
&lt;p&gt;Define la excepci&amp;oacute;n que se produce si no se puede crear un usuario. Hay un valor de enumeraci&amp;oacute;n &lt;a href="http://msdn.microsoft.com/es-es/library/system.web.security.membershipcreatestatus.aspx"&gt;MembershipCreateStatus&lt;/a&gt; disponible a trav&amp;eacute;s de la propiedad &lt;a href="http://msdn.microsoft.com/es-es/library/system.web.security.membershipcreateuserexception.statuscode.aspx"&gt;StatusCode&lt;/a&gt; que describe el motivo de la excepci&amp;oacute;n.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;p&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/system.web.security.membershippasswordformat.aspx"&gt;MembershipPasswordFormat&lt;/a&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top"&gt;
&lt;p&gt;Especifica los posibles formatos de almacenamiento de contrase&amp;ntilde;as utilizados por los proveedores de suscripciones incluidos con ASP.NET (&lt;b&gt;Clear&lt;/b&gt;, &lt;b&gt;Hashed&lt;/b&gt;, &lt;b&gt;Encrypted&lt;/b&gt;).&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;Configurando nuestra aplicaci&amp;oacute;n&lt;/h4&gt;
&lt;p align="justify"&gt;&lt;strong&gt;Nota: &lt;/strong&gt;Esto pensaba dejarlo para m&amp;aacute;s adelante, pero lo posteo aqu&amp;iacute; tambi&amp;eacute;n por si alguien quiere animarse a hacer pruebas ;-)&lt;/p&gt;
&lt;p align="justify"&gt;Para poder acceder al modelo de objetos, adem&amp;aacute;s de agregar las dos referencias que hemos comentado antes, tambi&amp;eacute;n es necesario modificar el fichero de configuraci&amp;oacute;n de la aplicaci&amp;oacute;n (Web.config en un proyecto Web y App.config en un proyecto WinForms). Existen multitud de &lt;a href="http://msdn.microsoft.com/es-es/library/6e9y4s5t.aspx"&gt;art&amp;iacute;culos&lt;/a&gt; que describen c&amp;oacute;mo hacerlo en el primero de los casos, as&amp;iacute; que nos vamos a centrar en el segundo.&lt;/p&gt;
&lt;p align="justify"&gt;Empezaremos con la configuraci&amp;oacute;n m&amp;iacute;nima para que funcione nuestra aplicaci&amp;oacute;n, y posteriormente iremos viendo distintas opciones para permitir que el sistema de seguridad se comporte de un modo distinto, por ejemplo, pidiendo una contrase&amp;ntilde;a no tan restrictiva, o que no sea necesario indicar el email del usuario, o la pregunta y respuesta de seguridad.&lt;/p&gt;
&lt;p align="justify"&gt;El primer paso para configurar nuestra aplicaci&amp;oacute;n es agregar un fichero de configuraci&amp;oacute;n (App.config) a nuestro proyeco, o si ya tenemos uno, abrirlo para su edici&amp;oacute;n. Toda la configuraci&amp;oacute;n se va a centrar en dos secciones: &amp;lt;connectionStrings&amp;gt; y &amp;lt;system.web&amp;gt;. En la primera es especificar&amp;aacute; una entrada que apunte a la base de datos de membres&amp;iacute;a, mientras que en la segunda se especificar&amp;aacute;n los valores para los proveedores de usuarios y roles:&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;connectionStrings&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;MemberShipConnectionString&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;         &lt;span style="color:#ff0000;"&gt;connectionString&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;data source=.\SQLEXPRESS;Integrated Security=True;DataBase=Test&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;         &lt;span style="color:#ff0000;"&gt;providerName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;System.Data.SqlClient&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;connectionStrings&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;system.web&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;roleManager&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;enabled&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;providers&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;clear&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;AspNetSqlRoleProvider&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;             &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;System.Web.Security.SqlRoleProvider&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;             &lt;span style="color:#ff0000;"&gt;connectionStringName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;MemberShipConnectionString&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;             &lt;span style="color:#ff0000;"&gt;applicationName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Test&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;providers&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;roleManager&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;membership&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;defaultProvider&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;SqlProvider&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;providers&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;clear&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;SqlProvider&amp;quot;&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;             &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;System.Web.Security.SqlMembershipProvider&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;             &lt;span style="color:#ff0000;"&gt;connectionStringName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;MemberShipConnectionString&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;             &lt;span style="color:#ff0000;"&gt;applicationName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Test&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;      &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;providers&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;membership&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;system.web&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;Oservemos que la cadena de configuraci&amp;oacute;n apunta a la BD que creamos en el post anterior, y que esta cadena de conexi&amp;oacute;n se usa en la configuraci&amp;oacute;n de los proveedores de usuarios y roles. Otro detalle muy importante es que la clave applicationName contiene el nombre de nuestra aplicaci&amp;oacute;n para el sistema de membres&amp;iacute;a, de modo que todos los usuarios y roles que se creen estar&amp;aacute;n agrupados bajo este nombre de aplicaci&amp;oacute;n.&lt;/p&gt;
&lt;p align="justify"&gt;Por defecto, esta configuraci&amp;oacute;n hace que al momento de crear un usuario sea necesario proporcionar: Nombre, contrase&amp;ntilde;a de un m&amp;iacute;nimo de 7 car&amp;aacute;cteres y uno de ellos &amp;lsquo;especial&amp;rsquo; (por ejemplo: @#$%), email, pregunta de seguridad, respuesta de seguridad, y si va a estar aprobado o no. No est&amp;aacute; nada mal, de hecho podr&amp;iacute;amos decir que la configuraci&amp;oacute;n predeterminada es a su vez, la m&amp;aacute;s segura.&lt;/p&gt;
&lt;p align="justify"&gt;Si deseamos cambiar esta configuraci&amp;oacute;n, par permitir que un usuario no pueda preguntarle al sistema cu&amp;aacute;l es su contrase&amp;ntilde;a (s&amp;oacute;lo pueda resetearla), o por ejemplo para &amp;lsquo;relajar&amp;rsquo; un poco la seguridad (que quede claro que esto no lo recomiendo en absoluto, y que es simplemente un ejercicio did&amp;aacute;ctico) podemos agregar atributos al fichero de configuraci&amp;oacute;n:&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;membership&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;defaultProvider&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;SqlProvider&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;providers&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;clear&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;SqlProvider&amp;quot;&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;         &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;System.Web.Security.SqlMembershipProvider&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;         &lt;span style="color:#ff0000;"&gt;connectionStringName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;MemberShipConnectionString&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;         &lt;span style="color:#ff0000;"&gt;applicationName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Test&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;         &lt;span style="color:#ff0000;"&gt;enablePasswordRetrieval&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;         &lt;span style="color:#ff0000;"&gt;enablePasswordReset&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;         &lt;span style="color:#ff0000;"&gt;requiresQuestionAndAnswer&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;         &lt;span style="color:#ff0000;"&gt;requiresUniqueEmail&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;         &lt;span style="color:#ff0000;"&gt;passwordFormat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Hashed&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;providers&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;membership&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;Ten&amp;eacute;is una lista completa de los atributos en las propiedades de la clase &lt;a href="http://msdn.microsoft.com/es-es/library/system.web.security.sqlmembershipprovider_properties.aspx"&gt;SqlMemberShipProvider&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Y ahora, un poco de &amp;lsquo;chicha&amp;rsquo; en forma de c&amp;oacute;digo:&lt;/p&gt;
&lt;h4&gt;Ejemplos a chol&amp;oacute;n:&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Crear un usuario:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;MembershipUser user = Membership.CreateUser(&lt;span style="color:#006080;"&gt;&amp;quot;admin&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;$admin123&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;M&amp;aacute;s sencillo imposible, verdad? Ahora bien, hay que tener presente que este c&amp;oacute;digo fallar&amp;aacute; con la configuraci&amp;oacute;n predeterminada, ya que debe suministrarse email, y la pregunta y respuesta de seguridad. En su lugar deber&amp;iacute;a usarse este c&amp;oacute;digo:&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;MembershipCreateStatus status;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;MembershipUser user = Membership.CreateUser(&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#006080;"&gt;&amp;quot;admin&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;$admin123&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;admin@test.com&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#006080;"&gt;&amp;quot;pregunta de seguridad?&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;respuesta de seguridad&amp;quot;&lt;/span&gt;, &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; status);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (status == MembershipCreateStatus.Success)&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    MessageBox.Show(&lt;span style="color:#006080;"&gt;&amp;quot;Usuario creado correctamente!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Bueno, tampoco no es demasiado complicado. La &amp;uacute;nica diferencia es que se proporcionan m&amp;aacute;s argumentos y que devuelve un objeto que define el estado de la creaci&amp;oacute;n del usuario, para saber si se ha creado con &amp;eacute;xito.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Eliminar un usuario:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;Membership.DeleteUser(&lt;span style="color:#006080;"&gt;&amp;quot;admin&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Casi demasiado facil :-P&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Obtener un usuario:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;MembershipUser user = Membership.GetUser(&lt;span style="color:#006080;"&gt;&amp;quot;admin&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A partir de este usuario recuperado podemos efectuar cualquier operaci&amp;oacute;n soportada.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Obtener todos los usuarios:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;MembershipUserCollection users = Membership.GetAllUsers();&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (MembershipUser user &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; users)&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    Console.WriteLine(user.UserName);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Obtenemos una colecci&amp;oacute; e iteramos por ella para mostrar los nombres.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Validar un usuario:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (Membership.ValidateUser(&lt;span style="color:#006080;"&gt;&amp;quot;admin&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;$admin123&amp;quot;&lt;/span&gt;))&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    MessageBox.Show(&lt;span style="color:#006080;"&gt;&amp;quot;usuario correcto!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    MessageBox.Show(&lt;span style="color:#006080;"&gt;&amp;quot;usuario o contrase&amp;ntilde;a incorrecto!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ideal para formularios de inicio de sesi&amp;oacute;n. Tened cidado, que si se introduce mal 3 veces se bloquea el usuario.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Obtiene el n&amp;uacute;mero de usuarios conectados:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; num = Membership.GetNumberOfUsersOnline();&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Sin comentarios.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Busca usuarios por el nombre de usuario o la direcci&amp;oacute;n de correo electr&amp;oacute;nico:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;MembershipUserCollection users = Membership.FindUsersByName(&lt;span style="color:#006080;"&gt;&amp;quot;pepe&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;MembershipUserCollection users = Membership.FindUsersByEmail(&amp;quot;pepe@test.com&amp;quot;);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Del mismo modo que GetAllUsers devuelve una colecci&amp;oacute;n de usuarios.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Obtiene la contrase&amp;ntilde;a de un usuario:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;MembershipUser user = Membership.GetUser(&lt;span style="color:#006080;"&gt;&amp;quot;admin&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; pwd = user.GetPassword();&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; pwd = user.GetPassword(&lt;span style="color:#006080;"&gt;&amp;quot;respuesta de seguridad&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
Tiene dos sobrecargas, en la segunda debe especificarse la respuesta de seguridad.&lt;/div&gt;
&lt;p&gt;S&amp;oacute;lo es v&amp;aacute;lido si se ha especificado el atributo EnablePasswordRetrieval.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Cambia la contrase&amp;ntilde;a de un usuario:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;MembershipUser user = Membership.GetUser(&lt;span style="color:#006080;"&gt;&amp;quot;admin&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;user.ChangePassword(&lt;span style="color:#006080;"&gt;&amp;quot;$admin123&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;@nuevapassword2010&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Resetea la contrase&amp;ntilde;a de un usuario:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;MembershipUser user = Membership.GetUser(&lt;span style="color:#006080;"&gt;&amp;quot;admin&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; pwd = user.ResetPassword();&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; pwd = user.ResetPassword(&lt;span style="color:#006080;"&gt;&amp;quot;respuesta de seguridad&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Tiene dos sobrecargas, en la segunda debe especificarse la respuesta de seguridad.&lt;/p&gt;
&lt;p&gt;S&amp;oacute;lo es v&amp;aacute;lido si se ha especificado el atributo EnablePasswordReset.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Desbloquea un usuario:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;MembershipUser user = Membership.GetUser(&lt;span style="color:#006080;"&gt;&amp;quot;admin&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; success = user.UnlockUser();&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Particularmente &amp;uacute;til cuando tenemos un usuario bloqueado, ya sea por un intento de intrusi&amp;oacute;n, como por la t&amp;iacute;pica amnesia matutina.&lt;/p&gt;
&lt;p&gt;Y esto es todo por hoy, la semana que viene m&amp;aacute;s :-)&lt;/p&gt;
&lt;p&gt;Espero que esto anime a m&amp;aacute;s de uno a usar este sistema de gesti&amp;oacute;n de usuarios, ya veis que no es nada complicado.&lt;/p&gt;
&lt;p&gt;Saludos a 0&amp;ordm; (hoy ni fr&amp;iacute;o ni calor),&lt;/p&gt;
&lt;p&gt;Nota: Es la primera vez que escribo en el blog todos los d&amp;iacute;as de una semana, as&amp;iacute; que esto hay que celebrarlo con un cafelito. Hasta luego! :-)&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Art&amp;iacute;culos anteriores de la serie:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/blogs/lfranco/archive/2010/02/03/usando-asp-net-membrership-en-winforms-1-n.aspx"&gt;Usando ASP.NET membrership en Winforms (1 / n)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/blogs/lfranco/archive/2010/02/03/usando-asp-net-membrership-en-winforms-2-n.aspx"&gt;Usando ASP.NET membrership en Winforms (2 / n)&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=166716" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term=".NET" scheme="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx" /><category term="C#" scheme="http://geeks.ms/blogs/lfranco/archive/tags/C_2300_/default.aspx" /><category term="Visual Studio" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Visual+Studio/default.aspx" /><category term="Serie" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Serie/default.aspx" /><category term="2010" scheme="http://geeks.ms/blogs/lfranco/archive/tags/2010/default.aspx" /><category term="Users" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Users/default.aspx" /><category term="Seguridad" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Seguridad/default.aspx" /><category term="MemberShip" scheme="http://geeks.ms/blogs/lfranco/archive/tags/MemberShip/default.aspx" /></entry><entry><title>Usando ASP.NET membrership en Winforms (2 / n)</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2010/02/04/usando-asp-net-membrership-en-winforms-2-n.aspx" /><id>/blogs/lfranco/archive/2010/02/04/usando-asp-net-membrership-en-winforms-2-n.aspx</id><published>2010-02-04T10:45:00Z</published><updated>2010-02-04T10:45:00Z</updated><content type="html">&lt;h4&gt;Creando la base de datos de membres&amp;iacute;a&lt;/h4&gt;
&lt;p align="justify"&gt;La base de datos de membrs&amp;iacute;a es el lugar en el que se van a almacenar los datos de los usuarios de nuestras aplicaciones. Si, de nuestras aplicaciones en plural, porque este sistema est&amp;aacute; preparado para gestionar datos de tantas aplicaciones como sea necesario. De modo que el primer paso va a ser crear esta base de datos en un servidor SQL Server. Por cierto, cualquier edici&amp;oacute;n vale, desde la Express hasta la Professional.&lt;/p&gt;
&lt;p align="justify"&gt;Lo primero que vamos a hacer es ejecutar el comando &lt;strong&gt;aspnet_regsql&lt;/strong&gt; desde la l&amp;iacute;nea de comandos de Visual Studio, para iniciar el asistente que nos guiar&amp;aacute; en la creaci&amp;oacute;n de nuestra base de datos de membres&amp;iacute;a:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/UsandoASP.NETmembrershipenWinforms2n_9548/aspnet_regsql.png"&gt;&lt;img height="340" width="671" src="http://www.uyssoft.com/blog/images/UsandoASP.NETmembrershipenWinforms2n_9548/aspnet_regsql_thumb.png" alt="aspnet_regsql" border="0" title="aspnet_regsql" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;Una vez iniciado, el aisitente pregunta si vamos a crear la base de datos o a eliminar la informaci&amp;oacute;n de membres&amp;iacute;a de una base de datos ya existente. Una vez elegimos la primera opci&amp;oacute;n nos pedir&amp;aacute; el nombre del servidor de SQL y de la base de datos. En caso que no exista la base de datos se crear&amp;aacute; una. En nuestro caso elegiremos la instancia de SQL Server express local y (en un derroche de imaginaci&amp;oacute;n) llamaremos a nuestra base de datos &amp;lsquo;Test&amp;rsquo;:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/UsandoASP.NETmembrershipenWinforms2n_9548/createdbwizard1.png"&gt;&lt;img height="452" width="582" src="http://www.uyssoft.com/blog/images/UsandoASP.NETmembrershipenWinforms2n_9548/createdbwizard1_thumb.png" alt="createdbwizard1" border="0" title="createdbwizard1" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4&gt;Examinando la base de datos creada&lt;/h4&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/UsandoASP.NETmembrershipenWinforms2n_9548/testdb.png"&gt;&lt;img height="592" width="373" src="http://www.uyssoft.com/blog/images/UsandoASP.NETmembrershipenWinforms2n_9548/testdb_thumb.png" align="left" alt="testdb" border="0" title="testdb" style="border-right-width:0px;margin:0px 10px 0px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; Una vez creada, nos conectaremos a la base de datos para examinar que objetos se ha creado. Lo primero que llama la atenci&amp;oacute;n es que hay una serie de tablas, vistas y procedimientos almacenados cuyo nombre empieza por el prefijo &amp;lsquo;aspnet_&amp;rsquo;, y yo me pregunto &amp;iquest;no hubiese sido mucho m&amp;aacute;s elegante utilizar un Schema en lugar de esta nomenclatura? Bueno, supongo que si se ha usado esta nomenclatura ser&amp;aacute; por compatibilidad con SQL Server 2000, ya que los esquemas no aparecieron hasta la versi&amp;oacute;n 2005.&lt;/p&gt;
&lt;p align="justify"&gt;La estructura de esta base de datos no es importante para nosotros, ya que en ning&amp;uacute;n caso vamos a acceder directamente a la base de datos. Todos nuestro trabajo se realizar&amp;aacute; a trav&amp;eacute;s del modelo de objetos de membres&amp;iacute;a desde nuestra aplicaci&amp;oacute;n .NET. De todos modos demos un vistazo a las tablas m&amp;aacute;s interesantes:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;aspnet_Applications:&lt;/strong&gt; Es la tabla en la que se almacenan los datos de las distintas aplicaciones que van a usar esta base de datos. S&amp;oacute;lo guarda el nombre y un identificador GUID para usarlo como clave en las tablas de usuarios, roles, etc.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;aspnet_MemberShip:&lt;/strong&gt; Guarda los datos de los usuarios del sistema de Membres&amp;iacute;a de forma conjunta con otra tabla llamada &lt;strong&gt;aspnet_Users&lt;/strong&gt;. As&amp;iacute;, los datos de cada usuario del sistema quedan divididos entre estas dos tablas, guardando la primera los datos relativos a la seguridad (contrase&amp;ntilde;a, tipo de almacenamiento de la contrase&amp;ntilde;a, pregunta y respuesta de seguridad) y en la segunda los datos propios del usuario (nombre, fecha de la &amp;uacute;ltima actividad).&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;aspnet_Roles:&lt;/strong&gt; Almacena los datos relativos a los grupos de usuarios. Los grupos son usados para establecer los permisos de uno o varios usuarios. Posteriormente desde nuestra aplicaci&amp;oacute;n preguntaremos si un usuario pertenece a uno u otro rol para permitir o revocar permiso sobre ciertas acciones.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;aspnet_UsersInRoles:&lt;/strong&gt; Como su nombre indica mantiene una relaci&amp;oacute;n de los usuarios que pertenecen a cada uno de los roles. De este modo podremos saber qu&amp;eacute; usuarios pertenecen a qu&amp;eacute; roles.&lt;/p&gt;
&lt;p align="justify"&gt;Existen otras caracter&amp;iacute;sticas que pasaremos por alto porque dan para otros art&amp;iacute;culos, como por ejemplo la posibilidad de almacenar datos para distintos usuarios&amp;nbsp; sin tener que almacenarlos en otra tabla de otra base de datos.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Hay un detalle curioso que refuerza la posibilidad de la compatibilidad con versiones anteriores, y es la aus&amp;eacute;ncia de funciones de usuario en la base de datos. Resulta curioso como muchas de las caracter&amp;iacute;sticas de los procedimientos almacenados se podr&amp;iacute;an haber implementado como funciones. &lt;/p&gt;
&lt;h4&gt;Accediendo a la base de datos desde .NET&lt;/h4&gt;
&lt;p align="justify"&gt;En el siguiente post veremos el modelo de objetos de membres&amp;iacute;a, este modelo est&amp;aacute; disponible para acceder y manipular este repositorio desde nuestras aplicaciones .NET, y que se encuentra en los namespaces &lt;strong&gt;System.Web&lt;/strong&gt; y &lt;strong&gt;System.Web.Extensions&lt;/strong&gt; (aunque como dec&amp;iacute;amos podemos usarlo desde cualquier tipo de aplicaci&amp;oacute;n).&lt;/p&gt;
&lt;p align="justify"&gt;Saludos,&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Art&amp;iacute;culos anteriores de la serie:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/blogs/lfranco/archive/2010/02/03/usando-asp-net-membrership-en-winforms-1-n.aspx"&gt;Usando ASP.NET membrership en Winforms (1 / n)&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;Actualizaci&amp;oacute;n (art&amp;iacute;culos siguientes):&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/blogs/lfranco/archive/2010/02/05/usando-asp-net-membrership-en-winforms-3-n.aspx"&gt;Usando ASP.NET membrership en Winforms (3 / n)&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=166637" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term=".NET" scheme="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx" /><category term="C#" scheme="http://geeks.ms/blogs/lfranco/archive/tags/C_2300_/default.aspx" /><category term="Visual Studio" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Visual+Studio/default.aspx" /><category term="Serie" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Serie/default.aspx" /><category term="2010" scheme="http://geeks.ms/blogs/lfranco/archive/tags/2010/default.aspx" /><category term="Users" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Users/default.aspx" /><category term="Seguridad" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Seguridad/default.aspx" /><category term="MemberShip" scheme="http://geeks.ms/blogs/lfranco/archive/tags/MemberShip/default.aspx" /></entry><entry><title>Usando ASP.NET membrership en Winforms (1 / n)</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2010/02/03/usando-asp-net-membrership-en-winforms-1-n.aspx" /><id>/blogs/lfranco/archive/2010/02/03/usando-asp-net-membrership-en-winforms-1-n.aspx</id><published>2010-02-03T11:23:00Z</published><updated>2010-02-03T11:23:00Z</updated><content type="html">&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/UsandoASP.NETmembrershipenWinforms1n_9F46/membership.jpg"&gt;&lt;img height="184" width="244" src="http://www.uyssoft.com/blog/images/UsandoASP.NETmembrershipenWinforms1n_9F46/membership_thumb.jpg" alt="membership" border="0" title="membership" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4&gt;Sistemas de autenticaci&amp;oacute;n de usuarios&lt;/h4&gt;
&lt;p align="justify"&gt;Una de las preguntas m&amp;aacute;s habituales en los &lt;a href="http://social.msdn.microsoft.com/Forums/es-ES/category/generaldeves"&gt;foros de desarrollo&lt;/a&gt; tiene relaci&amp;oacute;n con los sistemas de autenticaci&amp;oacute;n de usuarios. Normal &amp;iquest;qu&amp;eacute; aplicaci&amp;oacute;n de hoy en d&amp;iacute;a no necesita de un sistema que gestione los usuarios, roles y permisos de la aplicaci&amp;oacute;n?&lt;/p&gt;
&lt;p align="justify"&gt;Para ello existen varias alternativas pensadas para diferentes tipos de aplicaciones: Por ejemplo, si sabemos que nuestra aplicaci&amp;oacute;n va a ejecutarse en un entorno corporativo, &amp;iquest;qu&amp;eacute; mejor que usar el directorio activo de la empresa para gestionar lo relativo a la seguridad? Por otro lado, si no estamos seguros si va a existir un directorio activo, lo mejor va a ser usar nuestra propia base de datos de gesti&amp;oacute;n de usuarios. &lt;/p&gt;
&lt;p align="justify"&gt;En este punto es d&amp;oacute;nde veo m&amp;aacute;s lagunas y en el que se va a centrar esta serie de posts.&lt;/p&gt;
&lt;p align="justify"&gt;Antes de nada, que es mejor? Usar un sistema existente o crear nuestro propio sistema de gesti&amp;oacute;n de usuarios? Hablaremos de esto m&amp;aacute;s adelante :-)&lt;/p&gt;
&lt;h4&gt;ASP.NET Membership&lt;/h4&gt;
&lt;p align="justify"&gt;Existe un sistema de seguridad basado en proveedores de autenticaci&amp;oacute;n llamado &lt;a href="http://msdn.microsoft.com/en-us/library/yh26yfzy.aspx"&gt;ASP.NET Membership&lt;/a&gt;, que apareci&amp;oacute; con ASP.NET 2.0, y que originariamente estaba pensado para su uso en proyectos Web. Este sistema permite gestionar los usuario y roles de nuestras aplicaciones, y expone un completo modelo de objetos para usar en nuestras aplicaciones y simplificar la creaci&amp;oacute;n de usuarios, roles, validaciones, y todas aquellas tareas t&amp;iacute;picas de una gesti&amp;oacute;n de usuarios.&lt;/p&gt;
&lt;p align="justify"&gt;Lo mejor de este sistema es que est&amp;aacute; basado en proveedores y que es extensible. Dicho de otro modo, podemos usar una base de datos de SQL para validar los usuarios, pero tambi&amp;eacute;n admite otros proveedores de validaci&amp;oacute;n, como un directorio activo o de otros fabricantes como Oracle. Adem&amp;aacute;s, el hecho de que sea extensible hace que incluso nosotros podamos escribir &lt;a href="http://msdn.microsoft.com/en-us/library/f1kyba5e(VS.100).aspx"&gt;nuestro propio proveedor de autenticaci&amp;oacute;n&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Escenarios&lt;/h4&gt;
&lt;p align="justify"&gt;Lo habitual es usar este sistema en aplicaciones Web, ya que no suele ser habitual que los usuarios de un sitio Web utilicen autenticaci&amp;oacute;n contra un directorio activo. Por otro lado, desde hace unos a&amp;ntilde;os, cada vez oigo lo &amp;uacute;til que ser&amp;iacute;a disponer de este modelo para aplicaciones cliente, ya sean WinForms o WCF. Bien, en esta serie nos centraremos en esto: Usar ASP.NET membership en aplicaciones cliente para disponer de un sistema de gesti&amp;oacute;n de usuarios &amp;lsquo;prefabricado&amp;rsquo;.&lt;/p&gt;
&lt;p align="justify"&gt;Existen dos posibles escenarios: En el primero estamos desarrollando una &amp;uacute;nica aplicaci&amp;oacute;n cliente y queremos usar este sistema. En la segunda, estamos creando varias aplicaciones (WinForms, WPF, e incluso Web) y nos gustar&amp;iacute;a montar un &amp;uacute;nico sistema centralizado basado en servicios, que ser&amp;aacute;n usados por las distintas aplicaciones. Esto es posible desde el Framework 3.5 SP1 y se llama &amp;lsquo;Client applicaction Services&amp;rsquo;.&lt;/p&gt;
&lt;h4&gt;Al l&amp;iacute;o&lt;/h4&gt;
&lt;p align="justify"&gt;En los pr&amp;oacute;ximos posts vamos a ver c&amp;oacute;mo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Crear la base de datos de membres&amp;iacute;a.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Escenario 1: Crear una aplicaci&amp;oacute;n WinForms que utilice el sistema de membres&amp;iacute;a.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Escenario 2: Crear una soluci&amp;oacute;n de ejemplo para ver el uso de &amp;lsquo;Client applicaction Services&amp;rsquo;.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Desmitificando: Discutir acerca de si es mejor un sistema est&amp;aacute;ndar o crear nuestro propio sistema.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Y alguna cosilla m&amp;aacute;s que se nos ocurrir&amp;aacute;&amp;hellip; :-)&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;En los pr&amp;oacute;ximos d&amp;iacute;as (si hay suerte uno por d&amp;iacute;a, y si no uno por mes :-P) ir&amp;eacute; publicando los siguientes posts de la serie.&lt;/p&gt;
&lt;p align="justify"&gt;Nos leemos pronto!&lt;/p&gt;
&lt;p align="justify"&gt;
&lt;hr /&gt;
&lt;/p&gt;
&lt;p align="justify"&gt;Actualizaci&amp;oacute;n (art&amp;iacute;culos siguientes):&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/blogs/lfranco/archive/2010/02/04/usando-asp-net-membrership-en-winforms-2-n.aspx"&gt;Usando ASP.NET membrership en Winforms (2 / n)&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/blogs/lfranco/archive/2010/02/05/usando-asp-net-membrership-en-winforms-3-n.aspx"&gt;Usando ASP.NET membrership en Winforms (3 / n)&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=166542" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term=".NET" scheme="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx" /><category term="C#" scheme="http://geeks.ms/blogs/lfranco/archive/tags/C_2300_/default.aspx" /><category term="Visual Studio" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Visual+Studio/default.aspx" /><category term="Serie" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Serie/default.aspx" /><category term="2010" scheme="http://geeks.ms/blogs/lfranco/archive/tags/2010/default.aspx" /><category term="Users" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Users/default.aspx" /><category term="Seguridad" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Seguridad/default.aspx" /><category term="MemberShip" scheme="http://geeks.ms/blogs/lfranco/archive/tags/MemberShip/default.aspx" /></entry><entry><title>Más videos sobre Visual Studio 2010</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2010/02/02/m-225-s-videos-sobre-visual-studio-2010.aspx" /><id>/blogs/lfranco/archive/2010/02/02/m-225-s-videos-sobre-visual-studio-2010.aspx</id><published>2010-02-02T08:22:02Z</published><updated>2010-02-02T08:22:02Z</updated><content type="html">&lt;p&gt;&lt;a href="http://www.uyssoft.com/blog/images/MsvideossobreVisualStudio2010_829D/dotnet.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="dotnet" border="0" alt="dotnet" src="http://www.uyssoft.com/blog/images/MsvideossobreVisualStudio2010_829D/dotnet_thumb.png" width="340" height="81" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Hasta un total de 8 horas en videos introductorios sobre Visual Studio 2010 beta 2, que abarcan temas como: Paralelismo, F#, ASP.NET MVC&lt;/p&gt;  &lt;p&gt;Los podeis encontrar en la página de &lt;a href="http://www.msdev.com/"&gt;MSDEV&lt;/a&gt; juntamente con muchos recursos más. Aquí tenéis el enlace a los videos sobre Visual Studio 2010:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.msdev.com/Directory/SeriesDescription.aspx?CourseId=144" href="http://www.msdev.com/Directory/SeriesDescription.aspx?CourseId=144"&gt;http://www.msdev.com/Directory/SeriesDescription.aspx?CourseId=144&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=166452" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term=".NET" scheme="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx" /><category term="Videos" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Videos/default.aspx" /><category term="2010" scheme="http://geeks.ms/blogs/lfranco/archive/tags/2010/default.aspx" /></entry><entry><title>Resumen de videos de VS2010 y ASP.NET 4.0</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2010/02/01/resumen-de-videos-de-vs2010-y-asp-net-4-0.aspx" /><id>/blogs/lfranco/archive/2010/02/01/resumen-de-videos-de-vs2010-y-asp-net-4-0.aspx</id><published>2010-02-01T08:48:12Z</published><updated>2010-02-01T08:48:12Z</updated><content type="html">&lt;p align="justify"&gt;Revisando los feeds que no pude terminar de leer la semana pasada, me he encontrado con &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/01/28/nice-quick-hit-videos-about-asp-net-4-and-vs-2010.aspx" target="_blank"&gt;este post&lt;/a&gt; de &lt;a href="http://weblogs.asp.net/scottgu/default.aspx" target="_blank"&gt;Scott&lt;/a&gt;, en el que muestra un resumen de los videos que se han publicado hasta ahora sobre VS2010 y ASP.NET 4.0. Son una serie de videos cortos (entre 3 y 15 minutos) en los que cada uno se centra en una nueva característica del producto. &lt;/p&gt;  &lt;p align="justify"&gt;Altamente recomendables!!! :-)&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/ResumendevideosdeVS2010yASP.NET4.0_88C4/aspnetvideos.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="aspnetvideos" border="0" alt="aspnetvideos" src="http://www.uyssoft.com/blog/images/ResumendevideosdeVS2010yASP.NET4.0_88C4/aspnetvideos_thumb.png" width="653" height="399" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Resument de videos de ASP.NET 4.0:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a title="http://www.asp.net/learn/aspnet-4-quick-hit-videos/" href="http://www.asp.net/learn/aspnet-4-quick-hit-videos/"&gt;http://www.asp.net/learn/aspnet-4-quick-hit-videos/&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Resumen de videos VS2010:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a title="http://www.asp.net/learn/vs2010-quick-hit-videos/" href="http://www.asp.net/learn/vs2010-quick-hit-videos/"&gt;http://www.asp.net/learn/vs2010-quick-hit-videos/&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Artículo original:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a title="http://weblogs.asp.net/scottgu/archive/2010/01/28/nice-quick-hit-videos-about-asp-net-4-and-vs-2010.aspx" href="http://weblogs.asp.net/scottgu/archive/2010/01/28/nice-quick-hit-videos-about-asp-net-4-and-vs-2010.aspx"&gt;http://weblogs.asp.net/scottgu/archive/2010/01/28/nice-quick-hit-videos-about-asp-net-4-and-vs-2010.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=166375" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term=".NET" scheme="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx" /><category term="Videos" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Videos/default.aspx" /><category term="2010" scheme="http://geeks.ms/blogs/lfranco/archive/tags/2010/default.aspx" /><category term="ASP.NET" scheme="http://geeks.ms/blogs/lfranco/archive/tags/ASP.NET/default.aspx" /><category term="ScottGu" scheme="http://geeks.ms/blogs/lfranco/archive/tags/ScottGu/default.aspx" /></entry><entry><title>Gira Up To Secure 2010 – Las fotos :-)</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2010/01/29/gira-up-to-secure-2010-las-fotos.aspx" /><id>/blogs/lfranco/archive/2010/01/29/gira-up-to-secure-2010-las-fotos.aspx</id><published>2010-01-29T12:35:00Z</published><updated>2010-01-29T12:35:00Z</updated><content type="html">&lt;p&gt;Llevo unos d&amp;iacute;as de lo m&amp;aacute;s ajetreado y no he podido publicar nada hasta ahora. Sorry :-D&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03162.jpg"&gt;&lt;img height="184" width="244" src="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03162_thumb.jpg" alt="DSC03162" border="0" title="DSC03162" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03142.jpg"&gt;&lt;img height="184" width="244" src="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03142_thumb.jpg" alt="DSC03142" border="0" title="DSC03142" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03154.jpg"&gt;&lt;img height="184" width="244" src="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03154_thumb.jpg" alt="DSC03154" border="0" title="DSC03154" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;El evento sali&amp;oacute; muy bien, salvo un peque&amp;ntilde;o problemilla con la conexi&amp;oacute;n a Internet de unos de los ponentes. Al final se tuvo que tirar de un adaptador 3G &amp;ndash;&amp;gt; WIFI que tra&amp;iacute;a Carles de Quest Software (gracias!), al cual le pegaron un tremando palo por el consumo de datos entre paises... pobre :-)&lt;/p&gt;
&lt;p align="justify"&gt;Os dejo algunas de las fotos del evento. Muchas gracias a todos por asistir, espero que os lo pas&amp;aacute;seis tan bien como yo.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03140.jpg"&gt;&lt;img height="184" width="244" src="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03140_thumb.jpg" alt="DSC03140" border="0" title="DSC03140" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03141.jpg"&gt;&lt;img height="184" width="244" src="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03141_thumb.jpg" alt="DSC03141" border="0" title="DSC03141" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&amp;nbsp; &lt;a href="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03143.jpg"&gt;&lt;img height="184" width="244" src="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03143_thumb.jpg" alt="DSC03143" border="0" title="DSC03143" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;a href="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03147.jpg"&gt;&lt;img height="184" width="244" src="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03147_thumb.jpg" alt="DSC03147" border="0" title="DSC03147" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;a href="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03148.jpg"&gt;&lt;img height="184" width="244" src="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03148_thumb.jpg" alt="DSC03148" border="0" title="DSC03148" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;a href="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03149.jpg"&gt;&lt;img height="184" width="244" src="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03149_thumb.jpg" alt="DSC03149" border="0" title="DSC03149" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;a href="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03151.jpg"&gt;&lt;img height="184" width="244" src="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03151_thumb.jpg" alt="DSC03151" border="0" title="DSC03151" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;a href="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03152.jpg"&gt;&lt;img height="184" width="244" src="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03152_thumb.jpg" alt="DSC03152" border="0" title="DSC03152" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03155.jpg"&gt;&lt;/a&gt;&lt;a href="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03156.jpg"&gt;&lt;img height="184" width="244" src="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03156_thumb.jpg" alt="DSC03156" border="0" title="DSC03156" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;a href="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03157.jpg"&gt;&lt;img height="184" width="244" src="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03157_thumb.jpg" alt="DSC03157" border="0" title="DSC03157" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&amp;nbsp; &lt;a href="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03163.jpg"&gt;&lt;img height="184" width="244" src="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03163_thumb.jpg" alt="DSC03163" border="0" title="DSC03163" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Un saludo y nos vemos en el pr&amp;oacute;ximo evento de &lt;a target="_blank" href="http://andorradotnet.com/"&gt;AndorraDotNet&lt;/a&gt; (el pr&amp;oacute;ximo Febrero) sobre las novedades de VS2010.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03155.jpg"&gt;&lt;img height="244" width="184" src="http://www.uyssoft.com/blog/images/GiraUpToSecure2010Lasfotos_9CA4/DSC03155_thumb.jpg" alt="DSC03155" border="0" title="DSC03155" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;@Happy hacking! ;-)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=166167" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term="Event" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Event/default.aspx" /><category term="AndorraDotNet" scheme="http://geeks.ms/blogs/lfranco/archive/tags/AndorraDotNet/default.aspx" /><category term="2010" scheme="http://geeks.ms/blogs/lfranco/archive/tags/2010/default.aspx" /><category term="Comunidad" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Comunidad/default.aspx" /><category term="Seguridad" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Seguridad/default.aspx" /></entry><entry><title>CodeCamp 2009: Video + Presentación + Demos</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2010/01/20/codecamp-2009-video-presentaci-243-n-demos.aspx" /><id>/blogs/lfranco/archive/2010/01/20/codecamp-2009-video-presentaci-243-n-demos.aspx</id><published>2010-01-20T10:12:00Z</published><updated>2010-01-20T10:12:00Z</updated><content type="html">&lt;p align="justify"&gt;Ya tenemos disponible todo el material de la charla del pasado CodeCamp. &lt;/p&gt;
&lt;p align="justify"&gt;Las &lt;a target="_blank" href="https://cid-f3a970280830b5fe.skydrive.live.com/self.aspx/CodeCamp/Demos/VB2010Demos.zip"&gt;demos&lt;/a&gt; las he subido a SkyDrive, la presentaci&amp;oacute;n est&amp;aacute; en la &lt;a target="_blank" href="http://codecamp.es/LinkClick.aspx?fileticket=91-0dK4wfj8%3d&amp;amp;amp;tabid=65&amp;amp;amp;mid=397"&gt;p&amp;aacute;gina del evento&lt;/a&gt;, y el video lo ten&amp;eacute;is aqu&amp;iacute;:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;embed src="http://blip.tv/play/hYF2gbyNCwI" width="480" height="390"&gt;&lt;/embed&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Presentaci&amp;oacute;n:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Descarga el &lt;a href="http://codecamp.es/LinkClick.aspx?fileticket=91-0dK4wfj8%3d&amp;amp;amp;tabid=65&amp;amp;amp;mid=397" title="Material de la sesi&amp;oacute;n"&gt;Material de la sesi&amp;oacute;n&lt;/a&gt; desde este enlace.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Demos:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Descarga las &lt;a target="_blank" href="https://cid-f3a970280830b5fe.skydrive.live.com/self.aspx/CodeCamp/Demos/VB2010Demos.zip"&gt;demos de la sesi&amp;oacute;n&lt;/a&gt; desde este enlace.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Os recuerdo que pod&amp;eacute;is encontrar todas las presentciones del CodeCamp en la &lt;a target="_blank" href="http://codecamp.es/Speakers.aspx"&gt;p&amp;aacute;gina de Speakers&lt;/a&gt; del sitio Web, y todos los v&amp;iacute;deos &lt;a target="_blank" href="http://secondnug.blip.tv/"&gt;en el perfil de SecondNug en blip.tv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Un saludo,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=165557" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term=".NET" scheme="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx" /><category term="Event" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Event/default.aspx" /><category term="2009" scheme="http://geeks.ms/blogs/lfranco/archive/tags/2009/default.aspx" /><category term="CodeCamp" scheme="http://geeks.ms/blogs/lfranco/archive/tags/CodeCamp/default.aspx" /><category term="Comunidad" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Comunidad/default.aspx" /><category term="Codigo" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Codigo/default.aspx" /></entry><entry><title>La característica más extraña que has visto en un lenguaje</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2010/01/14/la-caracter-237-stica-m-225-s-extra-241-a-que-has-visto-en-un-lenguaje.aspx" /><id>/blogs/lfranco/archive/2010/01/14/la-caracter-237-stica-m-225-s-extra-241-a-que-has-visto-en-un-lenguaje.aspx</id><published>2010-01-14T08:37:00Z</published><updated>2010-01-14T08:37:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://www.uyssoft.com/blog/images/Lacaractersticamsextraaquehasvistoenunle_EE42/so.png"&gt;&lt;img height="61" width="250" src="http://www.uyssoft.com/blog/images/Lacaractersticamsextraaquehasvistoenunle_EE42/so_thumb.png" alt="so" border="0" title="so" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Que Bueno! &lt;/p&gt;
&lt;p&gt;Acabo de leer un &lt;a target="_blank" href="http://stackoverflow.com/questions/1995113/strangest-language-feature"&gt;post muy cachondo en Stack Overflow&lt;/a&gt;, y todav&amp;iacute;a me estoy riendo por acabo de leer. En este post se puede leer: &lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;&amp;ldquo;What is, in your opinion, the most surprising, weird, strange or really &amp;lsquo;WTF&amp;rsquo; language feature you have encountered?&amp;rdquo;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Que podriamos traducir algo as&amp;iacute; como:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;&amp;ldquo;Cual es en tu opini&amp;oacute;n, la caracter&amp;iacute;stica de un lenguaje m&amp;aacute;s sorprendente, rara, extra&amp;ntilde;a, o m&amp;aacute;s &amp;lsquo;pero que co... es esto&amp;rsquo; que has visto jam&amp;aacute;s&amp;rdquo;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p align="justify"&gt;La verdad es que despu&amp;eacute;s de leer el post, veo que a algunas de ellas ya las conoc&amp;iacute;a, pero otras han sido tremendamente reveladoras. Al final me quedo con dos cosas: La primera es mi reafirmaci&amp;oacute;n en mi odio produndo a Javascript (pues si, que pasa... no me gusta nada de nada, aunque tenga que usarlo por OO). Y la segunda es que todos los lenguajes o plataformas tienen sus cosas, y .NET no es una excepci&amp;oacute;n, pero esta de Java no tiene desperdicio:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Fun with auto boxing and the integer cache in Java.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;Integer foo = 1000; &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;Integer bar = 1000; &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt; &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;foo &amp;lt;= bar; &lt;span style="color:#008000;"&gt;// true &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;foo &amp;gt;= bar; &lt;span style="color:#008000;"&gt;// true &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;foo == bar; &lt;span style="color:#008000;"&gt;// false &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt; &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#008000;"&gt;//However, if the values of foo and bar are between 127 and -128 (inclusive) &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#008000;"&gt;//the behaviour changes: &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt; &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;Integer foo = 42; &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;Integer bar = 42; &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt; &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;foo &amp;lt;= bar; &lt;span style="color:#008000;"&gt;// true &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;foo &amp;gt;= bar; &lt;span style="color:#008000;"&gt;// true &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;foo == bar; &lt;span style="color:#008000;"&gt;// true &lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ni esta otra, en &lt;a target="_blank" href="http://en.wikipedia.org/wiki/PL/I"&gt;PL/1&lt;/a&gt;:&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;IF&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;IF&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;THEN&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;THEN&lt;/span&gt; = &lt;span style="color:#0000ff;"&gt;ELSE&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;ELSE&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;ELSE&lt;/span&gt; = THEN&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;En fin, tremendo!!! :-)))&lt;/p&gt;
&lt;p&gt;Cual es la mejor en vuestra opini&amp;oacute;n? No tiene porque estar en el post original...&lt;/p&gt;
&lt;p&gt;Ver el post original:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://stackoverflow.com/questions/1995113/strangest-language-feature" title="http://stackoverflow.com/questions/1995113/strangest-language-feature"&gt;http://stackoverflow.com/questions/1995113/strangest-language-feature&lt;/a&gt;&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=164971" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term="Humor" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Humor/default.aspx" /><category term="Frikadas" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Frikadas/default.aspx" /><category term="Curiosidad" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Curiosidad/default.aspx" /><category term="Codigo" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Codigo/default.aspx" /></entry><entry><title>Ya están disponibles las sesiones grabadas del CodeCamp ‘09!</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2010/01/13/ya-est-225-n-disponibles-las-sesiones-grabadas-del-codecamp-09.aspx" /><id>/blogs/lfranco/archive/2010/01/13/ya-est-225-n-disponibles-las-sesiones-grabadas-del-codecamp-09.aspx</id><published>2010-01-13T09:52:00Z</published><updated>2010-01-13T09:52:00Z</updated><content type="html">&lt;p&gt;Hola a todos,&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.uyssoft.com/blog/images/YaestndisponibleslassesionesgrabadasdelC_9794/Banner4.png"&gt;&lt;img height="61" width="160" src="http://www.uyssoft.com/blog/images/YaestndisponibleslassesionesgrabadasdelC_9794/Banner4_thumb.png" alt="Banner4" border="0" title="Banner4" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Ya tenemos disponibles las sesiones que se grabaron del CodeCamp 2009:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://secondnug.blip.tv/" title="http://secondnug.blip.tv/"&gt;http://secondnug.blip.tv/&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;He estado revis&amp;aacute;ndolas y hay algunas muy interesantes, que por el hecho de ser parte de la prganizaci&amp;oacute;n no pude ir a ver. As&amp;iacute; que ahora voy a dedicar un tiempo de la hora de comer a ver algunas de estas sesiones.&lt;/p&gt;
&lt;p align="justify"&gt;Entre estas seiones tambi&amp;eacute;n podeis encontrar &lt;a target="_blank" href="http://www.blip.tv/file/3062134"&gt;la sesi&amp;oacute;n&lt;/a&gt; que dimos Jorge, Pep i un servidor. La verdad es que me lo pas&amp;eacute; de miedo... fu&amp;eacute; muy divertido :-)&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/YaestndisponibleslassesionesgrabadasdelC_9794/CodeCampSession.png"&gt;&lt;img height="467" width="623" src="http://www.uyssoft.com/blog/images/YaestndisponibleslassesionesgrabadasdelC_9794/CodeCampSession_thumb.png" alt="CodeCampSession" border="0" title="CodeCampSession" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;Lo &amp;uacute;nico es que algunas PPTs no se ven muy bien, pero os recuerdo que las pod&amp;eacute;is descargar desde &lt;a target="_blank" href="http://www.codecamp.es/Speakers.aspx"&gt;la web del CodeCamp&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Un saludo desde Andorra, hoy a 0&amp;ordm; (ni fr&amp;iacute;o, ni calor)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=164908" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term=".NET" scheme="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx" /><category term="Event" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Event/default.aspx" /><category term="Videos" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Videos/default.aspx" /><category term="CodeCamp" scheme="http://geeks.ms/blogs/lfranco/archive/tags/CodeCamp/default.aspx" /></entry><entry><title>Mejoras en Entity Framework 4</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2010/01/12/mejoras-en-entity-framework-4.aspx" /><id>/blogs/lfranco/archive/2010/01/12/mejoras-en-entity-framework-4.aspx</id><published>2010-01-12T10:40:00Z</published><updated>2010-01-12T10:40:00Z</updated><content type="html">&lt;p align="justify"&gt;Gracias al feedback recibido por gran parte de la comunidad de desarrolladores, la siguiente versi&amp;oacute;n de EF (2.0 aunque finalmente ser&amp;aacute; llamada 4.0 para alinearla con el Framework) incorporar&amp;aacute; un mont&amp;oacute;n de novedades interesantes. Os dejo con una lista de las m&amp;aacute;s interesantes:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;b&gt;Foreign Keys&lt;/b&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Ahora Entity Framework incluye soporte para foreign keys. Esto permitir&amp;aacute; incluir estas propiedades en nuestras entidades, simplificando algunos escenarios, como la vinculaci&amp;oacute;n de datos o el desarollo en N-Capas. En el siguiente ejemplo se inicializa una entidad, usando una propiedad de tipo foreign key:&lt;/p&gt;
&lt;div align="justify"&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (BlogEntities ctx = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; BlogEntities()) {&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    Post myPost = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Post {    &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        PostID = 102,&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        PostName = &lt;span style="color:#006080;"&gt;&amp;quot;Post Title&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        CreatedDate = DateTime.Now,&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        PostContent = &lt;span style="color:#006080;"&gt;&amp;quot;Post Content&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        BlogID = 11&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    };&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    ctx.Posts.AddObject(myPost);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    ctx.SaveChanges();&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;Notar que a pesar de que el objeto Blog con BlogId = 11 no se carga en ning&amp;uacute;n momento, somos capaces de conectarlo al nuevo post directamente.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;Soporte para Lazy Binding (carga perezosa)&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Entity Framework incluye ahora soporte para carga perezosa. Cuando creamos un nuevo modelo de datos con Visual Studio 2010, las entidades que ofrecen carga perezosa son generadas por nosotros. Este tipo de carga (que est&amp;aacute; activada por defecto) no carga cada objeto devuelto hasta que se usa. Por ejemplo, en el c&amp;oacute;digo siguiente, cada uno de los posts no se carga hasta que se imprime su propiedad PostName:&lt;/p&gt;
&lt;div align="justify"&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (var ctx = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; BlogEntities()) {&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (var b &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; ctx.Blogs) {&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        Console.WriteLine(b.BlogName);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#008000;"&gt;//Note that we don&amp;#39;t explicitly load the posts for the current blog, &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#008000;"&gt;//the EF does it &amp;#39;lazily&amp;#39; for us.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (var p &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; b.Posts)&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            Console.WriteLine(p.PostName);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;strong&gt;Soporte para POCO&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Ahora Entity Frameworkofrece soporta Plain Old CLR Object Support (POCO) para las entidades. Esto es una mejora en entornos TDD (test-driven development) o DDD (domain-driven design), que permite eliminar dependencias de EF en nuestras entidades. Para m&amp;aacute;s informaci&amp;oacute;n acerca de esta caracter&amp;iacute;stica, darle un vistazo a los walkthroughs postedados en el &lt;a href="http://blogs.msdn.com/adonet"&gt;ADO.NET blog&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;b&gt;Text Template Transformation Toolkit Code Generation&lt;/b&gt;&lt;/p&gt;
&lt;p align="justify"&gt;En la primera versi&amp;oacute;n de Entity Framework, la generaci&amp;oacute;n de c&amp;oacute;digo no permit&amp;iacute;a demasiada personalizaci&amp;oacute;n, y no estaba integrada en Visual Studio. En cambio, ahora EF soporta Text Template Transformation Toolkit (tambi&amp;eacute;n llamada T4), que permite la personalizaci&amp;oacute;n del c&amp;oacute;digo generado. Haci&amp;eacute;ndolo sencillo, flexible y muy potente. La integraci&amp;oacute;n con VS es total, de modo que para definir la estrategia de la generaci&amp;oacute;n de c&amp;oacute;digo basta con hacer click con el bot&amp;oacute;n derecho sobre el dise&amp;ntilde;ador de Entity Framework y seleccionar &amp;lsquo;Add Code Generation Item&amp;hellip;&amp;rsquo;:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/MejorasenEntityFramework4_98E1/AddCodeGenerationSmall.jpg"&gt;&lt;img height="266" width="553" src="http://www.uyssoft.com/blog/images/MejorasenEntityFramework4_98E1/AddCodeGenerationSmall_thumb.jpg" alt="AddCodeGenerationSmall" border="0" title="AddCodeGenerationSmall" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;Lo mejor de todo es que no estamos limitados a las plantillas que vienen con Visual Studio, si no que podemos &lt;a target="_blank" href="http://blogs.msdn.com/efdesign/archive/2009/01/22/customizing-entity-classes-with-t4.aspx"&gt;escribir nuestras propias plantillas T4&lt;/a&gt;, o modificar las plantillas que vienen por defecto, para mejorar la generaci&amp;oacute;n de c&amp;oacute;digo a nuestro gusto.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;Mejor soporte N-Capas&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Un dise&amp;ntilde;o en N-Capas te permite separar los datos, logica e negocio y las capas de interacci&amp;oacute;n con el usuario, para asegurar la integridad de los datos y mejorar el mantenimiento de cada capa. El equipo de EF ha recibido muchas peticiones para mejorar el soporte de N-Capas. Ellos han recogido este feedback y han implementado mejoras en el API para permitir dise&amp;ntilde;o N-Capas, como plantillas para la generaci&amp;oacute;n de c&amp;oacute;digo, que generan objetos que contienen caracter&amp;iacute;sticas N-Capas, como el demandado control de cambios. La plantilla genera &amp;eacute;stas entidades como un conjunto de clases del CLR con atributos de serializaci&amp;oacute;n de Windows Communication Foundation (WCF), para poder ser usados en conjunci&amp;oacute;n con los servicios WCF.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;Majoras en la generaci&amp;oacute;n del c&amp;oacute;digo SQL:&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;El equipo de EF est&amp;aacute; constantemente tratando de mejorar la claridad y el rendimiento del c&amp;oacute;digo SQL generado. As&amp;iacute;, se han implementado un gran n&amp;uacute;mero de &amp;eacute;stas peque&amp;ntilde;as mejoras al c&amp;oacute;digo generado por EF4. Desde la eliminaci&amp;oacute;n de algunos JOINS *extra&amp;ntilde;os*, hasta el uso de los car&amp;aacute;cteres comod&amp;iacute;n en las cl&amp;aacute;usulas WHERE. Por ejemplo, el siguiente ejemplo se traducir&amp;aacute; en una consulta SQL que usa una cl&amp;aacute;usula WHERE con un LIKE y un car&amp;aacute;cter &amp;lsquo;%&amp;rsquo; para devolver todos los blogs cuyo nombre comienza por &amp;ldquo;Visual Studio&amp;rdquo;:&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;var query = from b &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; ctx.Blogs&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; b.BlogName.StartsWith(&lt;span style="color:#006080;"&gt;&amp;quot;Visual Studio&amp;quot;&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            select b;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;&lt;strong&gt;Soporte ampliado para procedimientos almacanados&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Muchas bases de datos contienen procedimientos almacenados que realizan tareas personalizadas. Ahora EF nos permitir&amp;aacute; crear funciones en nuestro modelo de entidades que llamen a &amp;eacute;stos procedimientos almacenados mediante la caracter&amp;iacute;stica &amp;lsquo;Add Function Import&amp;rsquo;. Esta caracter&amp;iacute;stica permitir&amp;aacute; detectar las columnas que retorna un procedimiento almacenado y crear un tipo complejo personalizado. Y lo m&amp;aacute;s importante, tambi&amp;eacute;n permitir&amp;aacute; actualizar tipos complejos ya existentes a la definici&amp;oacute;n del tipo devuelto por un procedimiento almacenado:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/MejorasenEntityFramework4_98E1/AddFunctionImport.jpg"&gt;&lt;img height="678" width="496" src="http://www.uyssoft.com/blog/images/MejorasenEntityFramework4_98E1/AddFunctionImport_thumb.jpg" alt="AddFunctionImport" border="0" title="AddFunctionImport" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;Entity Framework 4 ofrece estas y otras nuevas caracter&amp;iacute;sticas para incrementar la productividad de los desarrolladores. Comparte tus ideas con el equipo de desarrollo de EF en el &lt;a target="_blank" href="http://social.msdn.microsoft.com/Forums/en-US/adonetefx/threads"&gt;foro del proyecto&lt;/a&gt;, o contacta con ellos en sus blogs de &lt;a target="_blank" href="http://blogs.msdn.com/efdesign/"&gt;dise&amp;ntilde;o&lt;/a&gt; o del &lt;a target="_blank" href="http://blogs.msdn.com/adonet/"&gt;equipo&lt;/a&gt;. Y pos supuesto, dale un vistazo a los &lt;a target="_blank" href="http://channel9.msdn.com/tags/Entity+Framework/"&gt;videos y screencasts disponibles en Channel 9&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Nota: Traducido &amp;lsquo;al vuelo&amp;rsquo; desde el blog de &lt;a href="http://blogs.msdn.com/somasegar/default.aspx"&gt;Somasegar&lt;/a&gt;. Consulta el &lt;a target="_blank" href="http://blogs.msdn.com/somasegar/archive/2010/01/11/entity-framework-in-net-4.aspx"&gt;art&amp;iacute;culo original&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Saludos desde Andorra a &amp;ndash;8&amp;ordm; :-S&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=164831" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term=".NET" scheme="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx" /><category term="Tecnologia" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Tecnologia/default.aspx" /><category term="Visual Studio" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Visual+Studio/default.aspx" /><category term="Futures" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Futures/default.aspx" /><category term="2010" scheme="http://geeks.ms/blogs/lfranco/archive/tags/2010/default.aspx" /><category term="Entity Framework" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Entity+Framework/default.aspx" /><category term="Somasegar" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Somasegar/default.aspx" /></entry><entry><title>La Gira UP to Secure 2010 pasará por Andorra</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2010/01/07/la-gira-up-to-secure-2010-pasar-225-por-andorra.aspx" /><id>/blogs/lfranco/archive/2010/01/07/la-gira-up-to-secure-2010-pasar-225-por-andorra.aspx</id><published>2010-01-07T13:14:00Z</published><updated>2010-01-07T13:14:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://www.uyssoft.com/blog/images/LaGiraUPtoSecure2010pasarporAndorra_C1A6/event_uptosecure.jpg"&gt;&lt;img height="190" width="603" src="http://www.uyssoft.com/blog/images/LaGiraUPtoSecure2010pasarporAndorra_C1A6/event_uptosecure_thumb.jpg" alt="event_uptosecure" border="0" title="event_uptosecure" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Estamos de enhorabuena! :-D&lt;/p&gt;
&lt;p align="justify"&gt;Despu&amp;eacute;s de unas arduas negociaciones (*) con el inefable &lt;a target="_blank" href="http://elladodelmal.blogspot.com/" title="El lado del mal"&gt;Chema&lt;/a&gt; de I64, os hago saber que este mes de Enero la gira &lt;a target="_blank" href="http://www.microsoft.com/spain/technet/jornadas/otros/default.mspx"&gt;UP to Secure 2010&lt;/a&gt; pasar&amp;aacute; por Andorra. Un evento de este calibre no pasa todos los d&amp;iacute;as en nuestro peque&amp;ntilde;o pa&amp;iacute;s, de modo que &lt;span style="text-decoration:underline;"&gt;no te la puedes perder&lt;/span&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;Evidentemente, como todos los eventos de &lt;a target="_blank" href="http://andorradotnet.com/"&gt;AndorraDotNet&lt;/a&gt;, el evento es gratuito y abierto a todo el mundo mientras no haya problemas de aforo. &lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;Cu&amp;aacute;ndo?&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;El jueves 21 de Enero, de 09:00 a 14:00. Os pod&amp;eacute;is registrar desde la &lt;a target="_blank" href="https://msevents.microsoft.com/CUI/Register.aspx?culture=es-ES&amp;amp;EventID=1032438594&amp;amp;CountryCode=ES&amp;amp;IsRedirect=false"&gt;p&amp;aacute;gina de registro de eventos de Microsoft&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;D&amp;oacute;nde?&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;En el edificio de La Llacuna, en la calle &lt;a target="_blank" href="http://maps.google.co.uk/maps?hl=en&amp;amp;q=andorra+Carrer+Moss%C3%A8n+Cinto+Verdaguer+4&amp;amp;ie=UTF8&amp;amp;ll=42.508451,1.522206&amp;amp;spn=0.005536,0.009602&amp;amp;z=17"&gt;Moss&amp;egrave;n Cinto Verdaguer 4&lt;/a&gt; (&lt;em&gt;Al lado de la &amp;lsquo;pla&amp;ccedil;a de les arcades&amp;rsquo;).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A qui&amp;eacute;n est&amp;aacute; dirigida:&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Dirigido a IT Pros, responsables de seguridad y t&amp;eacute;cnicos auditores de la seguridad de los sistemas inform&amp;aacute;ticos. La gira Up To Secure 2010 recoge temas de actualidad en la seguridad inform&amp;aacute;tica para poder ayudarte en la tarea continua de mantener la infraestructura de tu empresa al d&amp;iacute;a, segura y mejorando constantemente. Ven a pasar una ma&amp;ntilde;ana de seguridad con nosotros. Seguro que disfrutas con nosotros.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;Agenda:&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;09:00 - 09:15 Registro &lt;/p&gt;
&lt;p align="justify"&gt;09:15 - 10:00 D-Link: Circuitos de V&amp;iacute;deo vigilancia IP &lt;/p&gt;
&lt;p align="justify"&gt;La seguridad f&amp;iacute;sica es una parte m&amp;aacute;s de la seguridad de tu red o de tu negocio. Con las nuevas soluciones D-Link es posible controlar tu negocio a trav&amp;eacute;s de la red de tu organizaci&amp;oacute;n, recibir las alertas en tus dispositivos m&amp;oacute;viles y almacenar las grabaciones en ubicaciones seguras. &amp;iquest;Est&amp;aacute;s seguro de que en tu negocio pasa lo que tiene que pasar cuando tu no est&amp;aacute;s? &lt;/p&gt;
&lt;p align="justify"&gt;10:00 - 10:45 SmartAccess: Port&amp;aacute;tiles corporativos a prueba de robos &lt;/p&gt;
&lt;p align="justify"&gt;Utilizando Windows 7 y el acceso biom&amp;eacute;trico o el DNI electr&amp;oacute;nico Rames Sawart, de SmartAcces explicar&amp;aacute; las novedades de las tecnolog&amp;iacute;as de seguridad incluidas el nuevo sistema operativo Windows, como BitLocker,&amp;nbsp; BitLocker To Go y Windows Biometric Framework para poder combinarlo y proteger la confidencialidad de la informaci&amp;oacute;n contenida en los port&amp;aacute;tiles corporativos usando tu e-DNI o accesos biom&amp;eacute;tricos.&lt;/p&gt;
&lt;p align="justify"&gt;10:45 - 11:30 Caf&amp;eacute; &lt;/p&gt;
&lt;p align="justify"&gt;11:15 - 12:00 Quest Software: Estrategia ante desastres en AD y Exchange &lt;/p&gt;
&lt;p align="justify"&gt;Se ha ca&amp;iacute;do el servidor de correo y el AD. Tranquilos, tenemos copia de seguridad de ellos, &amp;iquest;no? Los entornos de Directorio Activo y Exchange son cr&amp;iacute;ticos en cualquier compa&amp;ntilde;&amp;iacute;a. Entre los complejos procedimientos de seguridad que se han de establecer, un punto fundamental es el plan de contingencia que permita recuperar ambos sistemas en caso de desastre. Durante esta sesi&amp;oacute;n Quest mostrar&amp;aacute; una soluci&amp;oacute;n integral de Backup y Recuperaci&amp;oacute;n para tecnolog&amp;iacute;as Microsoft (AD, Exchange y SharePoint). &lt;/p&gt;
&lt;p align="justify"&gt;12:00 - 12:45 Microsoft Technet: Forefront Protection, Corporate Client Security &lt;/p&gt;
&lt;p align="justify"&gt;Forefront Client Security es la soluci&amp;oacute;n de protecci&amp;oacute;n antimalware mejor pensada para tu entorno coorporativo. &amp;iquest;Vas a migrar o est&amp;aacute;s pensando en migrar tu plataforma a Windows 7? Hazlo de una vez con Forefront Client Security y deja tu protegido para los pr&amp;oacute;ximos a&amp;ntilde;os. Totalmente integrado en el AD y controlable desde una consola centralizo. &amp;iquest;Quieres saber c&amp;oacute;mo se implanta? &amp;iquest;Quieres verlo funcionar? &lt;/p&gt;
&lt;p align="justify"&gt;12:45 - 13:30 Inform&amp;aacute;tica 64: Guerras Navales &lt;/p&gt;
&lt;p align="justify"&gt;Navegar por Internet es a veces casi igual de peligroso que navegar por los mares en tiempos en los que la pirater&amp;iacute;a era un negocio honrado. En esta sesi&amp;oacute;n se analizar&amp;aacute;n las principales medidas de seguridad que ofertan los principales Internet Browsers para proteger a sus intr&amp;eacute;pidos usuarios, que pululan por ese, cada vez m&amp;aacute;s encrespado, mar que es la Red. Tambi&amp;eacute;n, conocer&amp;aacute;s, de primera mano Apolo, el nuevo ActiveX de I64 para ayudarte en la detecci&amp;oacute;n de correos falsos en los sistemas de correo electr&amp;oacute;nico a trav&amp;eacute;s de web. &lt;/p&gt;
&lt;p align="justify"&gt;13:30 - 13:45 Preguntas &lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="http://www.uyssoft.com/blog/images/LaGiraUPtoSecure2010pasarporAndorra_C1A6/chemita.png"&gt;&lt;img height="195" width="154" src="http://www.uyssoft.com/blog/images/LaGiraUPtoSecure2010pasarporAndorra_C1A6/chemita_thumb.png" alt="chemita" border="0" title="chemita" style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" /&gt;&lt;/a&gt; &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Y c&amp;oacute;mo dice el propio Chema en su blog: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;El d&amp;iacute;a 22 de Enero ha caido un viernes tonto en Andorra que aprovecharemos para hacer un poco de Snowboard. Si eres un/a pirad@ de esto y te apetece venirte y pagarte tus cosas... ya sabes, yo ir&amp;eacute; con mi Excalibur rodando monta&amp;ntilde;a abajo...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Un saludo nevado (lleva cayendo toda la ma&amp;ntilde;ana y parece que seguir&amp;aacute; todo el d&amp;iacute;a)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(*) Al final quedaron en un &lt;a target="_blank" href="http://www.ijam.es/"&gt;iJam&lt;/a&gt;, un carajillo, un poco de hierbabuena, y un poco de cera (de pulir la tabla de snow).&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=164531" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term="Tecnologia" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Tecnologia/default.aspx" /><category term="Event" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Event/default.aspx" /><category term="AndorraDotNet" scheme="http://geeks.ms/blogs/lfranco/archive/tags/AndorraDotNet/default.aspx" /><category term="noticia" scheme="http://geeks.ms/blogs/lfranco/archive/tags/noticia/default.aspx" /><category term="2010" scheme="http://geeks.ms/blogs/lfranco/archive/tags/2010/default.aspx" /><category term="Comunidad" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Comunidad/default.aspx" /><category term="Seguridad" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Seguridad/default.aspx" /></entry><entry><title>Microsoft Virtual Business Cards para MCPs</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2009/12/10/microsoft-virtual-business-cards-para-mcps.aspx" /><id>/blogs/lfranco/archive/2009/12/10/microsoft-virtual-business-cards-para-mcps.aspx</id><published>2009-12-10T12:11:06Z</published><updated>2009-12-10T12:11:06Z</updated><content type="html">&lt;p align="justify"&gt;Como ya sabéis, el pasado Junio Microsoft decidió terminar con los paquetes de bienvenida (también llamados Welcome kits). Se supone que los motivos son ecológicos y no tienen nada que ver con el ahorro de costes, pero en estos tiempos de crisis... uhm... no se, no se :-)&lt;/p&gt;  &lt;p align="justify"&gt;La cuestión es que existe un nuevo servicio para todos los MCP gracias al cual uno se puede crear su propia tarjeta de visita, y compartirla con el resto de la comunidad. &lt;/p&gt;  &lt;p align="justify"&gt;Al igual que &lt;a href="http://geeks.ms/blogs/dnudelman/archive/2009/12/09/virtual-business-cards-released.aspx" target="_blank"&gt;David&lt;/a&gt;, al principio pensé que era una chorrada, pero la verdad es que el resultado es una chulada :-)&lt;/p&gt;  &lt;p align="justify"&gt;Os dejo una muestra en diversos formatos:&lt;/p&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;HTML:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;iframe height="180" src="https://www.mcpvirtualbusinesscard.com/VBCServer/lfranco/card" frameborder="0" width="397" scrolling="no"&gt;&lt;/iframe&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;&lt;u&gt;Java Script (mira en My Certifications):&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;iframe height="177" src="https://www.mcpvirtualbusinesscard.com/VBCServer/lfranco/interactivecard" frameborder="0" width="392" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;u&gt;Imagen:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.uyssoft.com/blog/images/MicrosoftVirtualBusinessCards_B70E/GetCardImage.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="GetCardImage" border="0" alt="GetCardImage" src="http://www.uyssoft.com/blog/images/MicrosoftVirtualBusinessCards_B70E/GetCardImage_thumb.png" width="401" height="181" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Saludos,&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=162288" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term="Frikadas" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Frikadas/default.aspx" /><category term="MCP" scheme="http://geeks.ms/blogs/lfranco/archive/tags/MCP/default.aspx" /></entry><entry><title>IE9 : Una primera aproximación para desarrolladores</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2009/12/02/ie9-una-primera-aproximaci-243-n-para-desarrolladores.aspx" /><id>/blogs/lfranco/archive/2009/12/02/ie9-una-primera-aproximaci-243-n-para-desarrolladores.aspx</id><published>2009-12-02T12:37:00Z</published><updated>2009-12-02T12:37:00Z</updated><content type="html">&lt;p align="justify"&gt;Acabo de leer en el blog de IE, un post muy interesante sobre la pr&amp;oacute;xima versi&amp;oacute;n de Internet Explorer. Si bien personalmente a lo largo de mi vida he sido usuario de la gran mayor&amp;iacute;a de los browsers que existen, y de otros que han pasado a mejor vida, hoy en d&amp;iacute;a me decanto por IE8. I no me importa decirlo, &amp;eacute;s m&amp;aacute;s, voy con la cara bien alta por la calle. Si, uso Internet Explorer 8, y qu&amp;eacute;?&lt;/p&gt;
&lt;p align="justify"&gt;Eso si, tengo instalados en mi entorno de desarrollo el resto de navegadores para testear las aplicaciones Web que creamos: FireFox, Opera, Safari y Chrome. &lt;/p&gt;
&lt;p align="justify"&gt;Si bien durante mucho tiempo Opera fue mi predilecto, de cada uno de ellos me gusta una cosa distinta: De FireFox, sus millones de pluggins. De Safari el renderizado. De Chrome, lo r&amp;aacute;pido de su motor de JS... pero si lo pongo todo en conjunto, me quedo con IE8, con sus cosas buenas y su cosas malas.&lt;/p&gt;
&lt;p align="justify"&gt;Os dejo con el art&amp;iacute;culo, en el que podreis ver una comparativa de los distintos motores de J a v a S c r ip t (lo pongo separado para que no se elimine autom&amp;aacute;ticamente al publicar):&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/IE9Unaprimeraaproximacinparadesarrollado_BEA5/Dean_PDC_2.png"&gt;&lt;img height="255" width="582" src="http://www.uyssoft.com/blog/images/IE9Unaprimeraaproximacinparadesarrollado_BEA5/Dean_PDC_2_thumb.png" alt="Dean_PDC_2" border="0" title="Dean_PDC_2" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;Am&amp;eacute;n de algunas novedades en la interpretaci&amp;oacute;n de los distintos est&amp;aacute;ndares.&lt;/p&gt;
&lt;p align="justify"&gt;Un saludo!&lt;/p&gt;
&lt;h4&gt;An Early Look&amp;nbsp; At IE9 for Developers: &lt;br /&gt;&lt;a href="http://blogs.msdn.com/ie/archive/2009/11/18/an-early-look-at-ie9-for-developers.aspx" title="http://blogs.msdn.com/ie/archive/2009/11/18/an-early-look-at-ie9-for-developers.aspx"&gt;http://blogs.msdn.com/ie/archive/2009/11/18/an-early-look-at-ie9-for-developers.aspx&lt;/a&gt;&lt;/h4&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=161724" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term=".NET" scheme="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx" /><category term="IE" scheme="http://geeks.ms/blogs/lfranco/archive/tags/IE/default.aspx" /><category term="Explorer" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Explorer/default.aspx" /><category term="2009" scheme="http://geeks.ms/blogs/lfranco/archive/tags/2009/default.aspx" /></entry><entry><title>HowTo: Obtener TODOS los usuarios de un grupo del Directorio Activo</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2009/11/30/howto-obtener-todos-los-usuarios-de-un-grupo-del-directorio-activo.aspx" /><id>/blogs/lfranco/archive/2009/11/30/howto-obtener-todos-los-usuarios-de-un-grupo-del-directorio-activo.aspx</id><published>2009-11-30T15:58:36Z</published><updated>2009-11-30T15:58:36Z</updated><content type="html">&lt;p align="justify"&gt;Siguiendo con el tema de las últimas entradas, vamos a ver cómo obtener TODOS los usuarios que pertenecen a un grupo del directorio activo. Y cuando digo TODOS los usuarios, me refiero a TODOS (por algo lo he puesto en mayúsculas :-D). Es decir, dentro de un grupo podemos tener otros grupos, que a su vez contengan otros grupos y así succesivamente... y nuestro objetivo es obtener todos los usuarios de forma recursiva.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/HowToObtenerTODOSlosusuariosdeungrupodel_E9D0/ADGroups.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="ADGroups" border="0" alt="ADGroups" src="http://www.uyssoft.com/blog/images/HowToObtenerTODOSlosusuariosdeungrupodel_E9D0/ADGroups_thumb.png" width="571" height="451" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Para obtener los datos de estos usuarios vamos a crear una clase, para ir almacenando las propiedades que deseamos obtener de cada usuario. Y una función que obtenga los usuarios de un grupo, y se llame a sí misma de forma recursiva en caso que este grupo contenga otros grupos.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;El código de la clase:&lt;/p&gt;  &lt;div&gt;   &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; ADUser&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] Sid { get; set; }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Name { get; set; }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; DistinguishedName { get; set; }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; SAMAccountName { get; set; }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; RoleType { get; set; }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ADUser(&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] sid, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; name, &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; distinguishedName, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; sAMAccountName)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        Sid = sid;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        Name = name;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        DistinguishedName = distinguishedName;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        SAMAccountName = sAMAccountName;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; sIDtoString()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        SecurityIdentifier sid = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SecurityIdentifier(Sid, 0);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; sid.ToString();&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Y el método que devuelve todos los usuarios de un grupo de forma recursiva:&lt;/p&gt;

&lt;div&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; Alpha.Code&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; SecurityContextEx&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; getDomainName()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; IPGlobalProperties.GetIPGlobalProperties().DomainName;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; getLDAPDomainName(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; domainName)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            StringBuilder sb = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; StringBuilder();&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] dcItems = domainName.Split(&lt;span style="color:#006080;"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;.ToCharArray());&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            sb.Append(&lt;span style="color:#006080;"&gt;&amp;quot;LDAP://&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; item &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; dcItems)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                sb.AppendFormat(&lt;span style="color:#006080;"&gt;&amp;quot;DC={0},&amp;quot;&lt;/span&gt;, item);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; sb.ToString().Substring(0, sb.ToString().Length - 1);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; List&amp;lt;ADUser&amp;gt; GetUsersInGroup(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; group)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            List&amp;lt;ADUser&amp;gt; users = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;ADUser&amp;gt;();&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; ldapDomainName = SecurityContext.getLDAPDomainName(SecurityContext.getDomainName());&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; domainName = ldapDomainName.Replace(&lt;span style="color:#006080;"&gt;&amp;quot;LDAP://&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            List&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt; groupMemebers = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;();&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            DirectoryEntry de = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DirectoryEntry(ldapDomainName);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            DirectorySearcher ds = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DirectorySearcher(de, &lt;span style="color:#006080;"&gt;&amp;quot;(objectClass=person)&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            ds.Filter = &lt;span style="color:#006080;"&gt;&amp;quot;(&amp;amp;(objectClass=group)(cn=&amp;quot;&lt;/span&gt; + group + &lt;span style="color:#006080;"&gt;&amp;quot;))&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (SearchResult result &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; ds.FindAll())&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                var dir = result.GetDirectoryEntry();&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                var list = dir.Invoke(&lt;span style="color:#006080;"&gt;&amp;quot;Members&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                IEnumerable entries = (IEnumerable)list;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (var entry &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; entries)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                    DirectoryEntry member = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DirectoryEntry(entry);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (member.SchemaClassName == &lt;span style="color:#006080;"&gt;&amp;quot;group&amp;quot;&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                    {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        List&amp;lt;ADUser&amp;gt; usersInGroup =&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                            GetUsersInGroup(member.Properties[&lt;span style="color:#006080;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;][0].ToString());&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (ADUser aduser &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; usersInGroup)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!users.ToDictionary(u =&amp;gt; u.Name).ContainsKey(aduser.Name))&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                            {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                                users.Add(aduser);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                            }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                    }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                    &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                    {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        ADUser aduser = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ADUser(&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                            (&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[])member.Properties[&lt;span style="color:#006080;"&gt;&amp;quot;objectSid&amp;quot;&lt;/span&gt;][0],&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                            member.Properties[&lt;span style="color:#006080;"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;][0].ToString(),&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                            member.Properties[&lt;span style="color:#006080;"&gt;&amp;quot;distinguishedName&amp;quot;&lt;/span&gt;][0].ToString(),&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                            member.Properties[&lt;span style="color:#006080;"&gt;&amp;quot;sAMAccountName&amp;quot;&lt;/span&gt;][0].ToString());&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        users.Add(aduser);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                    }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; users;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p align="justify"&gt;Aparte de la función &lt;strong&gt;GetUsersInGroup&lt;/strong&gt;, también existen un par de métodos de apoyo para averiguar el nombre de nuestro dominio, que creo recordar que he publicado con anterioridad, pero por si acaso os los he publicado también.&lt;/p&gt;

&lt;p&gt;Si deseamos obtener los usuarios de un grupo en particular, basta con usarlo de este modo:&lt;/p&gt;

&lt;div&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;List&amp;lt;ADUser&amp;gt; users = SecurityContextEx.GetUsersInGroup(&lt;span style="color:#006080;"&gt;&amp;quot;My users&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Nota:&lt;/u&gt;&lt;/strong&gt; En ocasiones, puede resultar una buena práctica para la administración de la seguridad de nuestras aplicaciones, crear un grupo en el directorio activo con el mismo nombre de la aplicación. Y de este modo conceder acceso a todos los miembros de dicho grupo a nuestra aplicación. En este caso todavía resultaría más sencillo mostrar todos los usuarios a los que hemos concedido acceso:&lt;/p&gt;

&lt;div&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;List&amp;lt;ADUser&amp;gt; users = SecurityContextEx.GetUsersInGroup(Application.ProductName);&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Espero que os haya gustado,&lt;/p&gt;

&lt;p&gt;Un saludo desde las frías tierras de Andorra :-) &lt;/p&gt;

&lt;p&gt;Y después de la nevada de ayer, esta vez más frías que nunca…&lt;/p&gt;

&lt;p&gt;Noviembre 2009&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=161591" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term=".NET" scheme="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx" /><category term="C#" scheme="http://geeks.ms/blogs/lfranco/archive/tags/C_2300_/default.aspx" /><category term="LDAP" scheme="http://geeks.ms/blogs/lfranco/archive/tags/LDAP/default.aspx" /><category term="HowTo" scheme="http://geeks.ms/blogs/lfranco/archive/tags/HowTo/default.aspx" /><category term="2009" scheme="http://geeks.ms/blogs/lfranco/archive/tags/2009/default.aspx" /><category term="Users" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Users/default.aspx" /><category term="Active Directory" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Active+Directory/default.aspx" /><category term="Groups" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Groups/default.aspx" /></entry><entry><title>HowTo: Agrupando grupos :-)</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2009/11/26/howto-agrupando-grupos.aspx" /><id>/blogs/lfranco/archive/2009/11/26/howto-agrupando-grupos.aspx</id><published>2009-11-26T10:53:51Z</published><updated>2009-11-26T10:53:51Z</updated><content type="html">&lt;p&gt;Una entrada rápida, no como la de &lt;a href="http://geeks.ms/blogs/lfranco/archive/2009/11/25/how-to-191-como-saber-si-el-usuario-actual-es-administrador-del-dominio.aspx" target="_blank"&gt;ayer&lt;/a&gt;. Aunque el tema está bastante relacionado ya que ambos tratan de Active Directory e identidades.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.uyssoft.com/blog/images/HowToAgrupandogrupos_9B56/GroupPolicy.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="GroupPolicy" border="0" alt="GroupPolicy" src="http://www.uyssoft.com/blog/images/HowToAgrupandogrupos_9B56/GroupPolicy_thumb.jpg" width="244" height="142" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Hoy vamos a ver una forma sencilla de obtener todos los grupos a los que pertenece un usuario, y agruparlos por su nombre de dominio. Y todo esto mediante una sola sentencia LINQ to objects. A ver quién es el guapo o guapa que me dice que LINQ to objects no es una maravilla!&lt;/p&gt;  &lt;p&gt;El resultado que vamos a obtener es el siguiente (algunos nombres se han omitido por razones obvias :-P):&lt;/p&gt;  &lt;p&gt;&lt;font size="2" face="Lucida Console"&gt;Groups under:      &lt;br /&gt;&amp;#160; - Group name: Todos      &lt;br /&gt;&amp;#160; - Group name: LOCAL      &lt;br /&gt;Groups under: BUILTIN      &lt;br /&gt;&amp;#160; - Group name: Usuarios      &lt;br /&gt;&amp;#160; - Group name: Administradores      &lt;br /&gt;Groups under: PRIMARY_DOMAIN_NAME      &lt;br /&gt;&amp;#160; - Group name: xxx1      &lt;br /&gt;&amp;#160; - Group name: xxx2      &lt;br /&gt;&amp;#160; - Group name: xxx3      &lt;br /&gt;&amp;#160; - Group name: xxx4      &lt;br /&gt;&amp;#160; - Group name: xxxN      &lt;br /&gt;Groups under: NT AUTHORITY      &lt;br /&gt;&amp;#160; - Group name: INTERACTIVE      &lt;br /&gt;&amp;#160; - Group name: Usuarios autentificados&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Y el código resultante es un método extensor para la clase WindowsIdentity, con dos funciones auxiliares en forma de métodos extensores de la clase NTAccount:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div&gt;   &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.DirectoryServices;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.DirectoryServices.ActiveDirectory;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Net.NetworkInformation;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Runtime.InteropServices;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Security.Principal;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; Alpha.Code&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; SecurityExtensions&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; IOrderedEnumerable&amp;lt;IGrouping &amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, NTAccount&amp;gt;&amp;gt; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            GetGroupsUnderDomains(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; WindowsIdentity identity)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            var groups =&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        from grIdentity &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; identity.Groups&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; grIdentity.IsValidTargetType(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(NTAccount))&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        select grIdentity.Translate(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(NTAccount)) &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; NTAccount into ntAccounts&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        let domainName = ntAccounts.GetDomainName()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        let groupName = ntAccounts.GetAccountName()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        orderby domainName&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        group ntAccounts by domainName into domainGroups&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        orderby domainGroups.Key&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;                        select domainGroups;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; groups;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; GetDomainName(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; NTAccount account)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] split = account.Value.Split(&lt;span style="color:#006080;"&gt;&amp;#39;\\&amp;#39;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            return split.Length == 1 ? string.Empty : split[0];&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        public static string GetAccountName(this NTAccount account)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            string[] split = account.Value.Split(&amp;#39;&lt;/span&gt;\\&amp;#39;);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; split[split.Length - 1];&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Para probarlo y ver el resultado:&lt;/p&gt;

&lt;div&gt;
  &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;
    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;var groups = WindowsIdentity.GetCurrent().GetGroupsUnderDomains();&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (var dg &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; groups)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;{&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    Console.WriteLine(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#006080;"&gt;&amp;quot;Groups under: {0}&amp;quot;&lt;/span&gt;, dg.Key));&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (var g &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; dg)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;        Console.WriteLine(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#006080;"&gt;&amp;quot;  - Group name: {0}&amp;quot;&lt;/span&gt;, g.GetAccountName()));&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;    }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Un saludo desde las frías tierras de Andorra :-)&lt;/p&gt;

&lt;p&gt;Noviembre 2009&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=161331" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term=".NET" scheme="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx" /><category term="C#" scheme="http://geeks.ms/blogs/lfranco/archive/tags/C_2300_/default.aspx" /><category term="LDAP" scheme="http://geeks.ms/blogs/lfranco/archive/tags/LDAP/default.aspx" /><category term="HowTo" scheme="http://geeks.ms/blogs/lfranco/archive/tags/HowTo/default.aspx" /><category term="2009" scheme="http://geeks.ms/blogs/lfranco/archive/tags/2009/default.aspx" /></entry><entry><title>How To: ¿Como saber si el usuario actual es administrador del dominio?</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2009/11/25/how-to-191-como-saber-si-el-usuario-actual-es-administrador-del-dominio.aspx" /><id>/blogs/lfranco/archive/2009/11/25/how-to-191-como-saber-si-el-usuario-actual-es-administrador-del-dominio.aspx</id><published>2009-11-25T17:03:00Z</published><updated>2009-11-25T17:03:00Z</updated><content type="html">&lt;blockquote&gt;
&lt;p align="justify"&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Es una pregunta que me encuentro de forma recurrente en los foros de desarrollo, as&amp;iacute; que lo apunto aqu&amp;iacute; para tener una referencia.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;El escenario&lt;/h4&gt;
&lt;p align="justify"&gt;Cuando desarrollamos una aplicaci&amp;oacute;n de escritorio, puede ser interesante saber a qu&amp;eacute; grupos pertenece el usuario que est&amp;aacute; ejecutando nuestra aplicaci&amp;oacute;n, para mostrar / ocultar / permitir / revocar ciertas acciones, u opciones. Por ejemplo, yo acostumbro a tener un bot&amp;oacute;n en la barra de estado de mis aplicaciones que permite cambiar la cadena de conexi&amp;oacute;n, y evidentemente, solo est&amp;aacute; visible cuando el usuario pertenece al grupo &amp;ldquo;Administradores del dominio&amp;rdquo;.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/HowToComosabersielusuarioactualesadminis_EA12/privileges.jpg"&gt;&lt;img height="244" width="244" src="http://www.uyssoft.com/blog/images/HowToComosabersielusuarioactualesadminis_EA12/privileges_thumb.jpg" alt="privileges" border="0" title="privileges" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4&gt;IsInRole&lt;/h4&gt;
&lt;p align="justify"&gt;Para ello, el objeto &lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/system.security.principal.windowsprincipal(VS.80).aspx"&gt;WindowsPrincipal&lt;/a&gt; dispone de un m&amp;eacute;todo &lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/system.security.principal.windowsprincipal.isinrole(VS.80).aspx"&gt;IsInRole&lt;/a&gt;, que nos dir&amp;agrave; si un usuario pertenece a un grupo determinado. Genial, adem&amp;aacute;s este m&amp;eacute;todo tiene varias sobrecargas, de modo que podemos usarlo pasando el RID, SID, el nombre e incluso una constante basada en la enumeraci&amp;oacute;n &lt;a target="_blank" href="http://msdn.microsoft.com/es-es/library/system.security.principal.windowsbuiltinrole(VS.80).aspx"&gt;WindowsBuiltIOnRole&lt;/a&gt;: &lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="179"&gt;&lt;strong&gt;Nombre de miembro&lt;/strong&gt;&lt;/td&gt;
&lt;td width="1693"&gt;&lt;strong&gt;Descripci&amp;oacute;n&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AccountOperator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Los operadores de cuentas administran las cuentas de los usuarios de un equipo o dominio. &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Administrator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Los administradores tienen acceso completo y sin restricciones al equipo o dominio. &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BackupOperator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Los operadores de copia de seguridad pueden reemplazar las restricciones de seguridad con el &amp;uacute;nico prop&amp;oacute;sito de hacer copias de seguridad de los archivos o de restaurarlas. &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Guest&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Los invitados tienen m&amp;aacute;s restricciones que los usuarios. &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PowerUser&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Los usuarios avanzados poseen la mayor&amp;iacute;a de los permisos administrativos, con algunas restricciones. De este modo, los usuarios avanzados pueden ejecutar aplicaciones heredadas, adem&amp;aacute;s de aplicaciones certificadas. &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PrintOperator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Los operadores de impresi&amp;oacute;n pueden tomar el control de una impresora. &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Replicator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Los replicadores permiten la duplicaci&amp;oacute;n de archivos en un dominio. &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SystemOperator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Los operadores del sistema administran un equipo en particular. &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Los usuarios no pueden realizar cambios accidentales o intencionados en todo el sistema. En consecuencia, pueden ejecutar aplicaciones certificadas, pero no la mayor&amp;iacute;a de las aplicaciones heredadas.&amp;nbsp; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p align="justify"&gt;De modo que para saber si nuestro usuario es administrador local, basta con hacer esto:&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;WindowsPrincipal wp = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; WindowsPrincipal(WindowsIdentity.GetCurrent());&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; wp.IsInRole(WindowsBuiltInRole.Administrator);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Sencillo, verdad? A partir del usuario que ejecuta nuestra aplicaci&amp;oacute;n (v&amp;aacute;lido tambi&amp;eacute;n en caso de impersonaci&amp;oacute;n), creamos un objeto Principal e invocamos al m&amp;eacute;todo pas&amp;aacute;ndole el grupo contra el que deseamos validar.&lt;/p&gt;
&lt;p&gt;El problema de esta enumeraci&amp;oacute;n es que como su nombre indica, &lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;s&amp;oacute;lo contempla los grupos locales&lt;/span&gt;&lt;/strong&gt;. As&amp;iacute; que si queremos saber si pertenece a un grupo del dominio parece que tendremos que buscar el SID del grupo, o el nombre, y hardcodearlo &amp;lsquo;a mano&amp;rsquo; en nuestra aplicaci&amp;oacute;n. &lt;/p&gt;
&lt;p&gt;Feo verdad? Pues la verdad es que si, muy feo&amp;hellip; vamos a investigar un poco m&amp;aacute;s, a ver si encontramos otra forma.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Por motivos de rendimiento, para determinar la funci&amp;oacute;n del usuario se recomienda utilizar la sobrecarga de &lt;a href="http://msdn.microsoft.com/es-es/library/wak3kd03(VS.80).aspx"&gt;IsInRole(SecurityIdentifier)&lt;/a&gt; como sobrecarga preferible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;WellKnownSidType&lt;/h4&gt;
&lt;p&gt;Existe una enumeraci&amp;oacute;n llamada &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/system.security.principal.wellknownsidtype.aspx"&gt;WellKnownSidType&lt;/a&gt;, que devuelve los identificadores de seguridad m&amp;aacute;s utilizados, vamos a darle un vistazo:&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="385"&gt;
&lt;p&gt;&lt;strong&gt;Member name&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width="1737"&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NullSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a null SID.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WorldSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches everyone.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LocalSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a local SID.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CreatorOwnerSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the owner or creator of an object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CreatorGroupSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the creator group of an object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CreatorOwnerServerSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a creator owner server SID.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CreatorGroupServerSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a creator group server SID.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NTAuthoritySid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID for the Windows NT authority.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DialupSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID for a dial-up account.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NetworkSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID for a network account. This SID is added to the process of a token when it logs on across a network.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BatchSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID for a batch process. This SID is added to the process of a token when it logs on as a batch job.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;InteractiveSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID for an interactive account. This SID is added to the process of a token when it logs on interactively.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ServiceSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID for a service. This SID is added to the process of a token when it logs on as a service.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AnonymousSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID for the anonymous account.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ProxySid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a proxy SID.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EnterpriseControllersSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID for an enterprise controller.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SelfSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID for self.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AuthenticatedUserSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID for an authenticated user.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RestrictedCodeSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID for restricted code.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TerminalServerSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches a terminal server account.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RemoteLogonIdSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches remote logons.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LogonIdsSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches logon IDs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LocalSystemSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the local system.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LocalServiceSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches a local service.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NetworkServiceSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches a network service.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BuiltinDomainSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the domain account.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BuiltinAdministratorsSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the administrator account.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BuiltinUsersSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches built-in user accounts.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BuiltinGuestsSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the guest account.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BuiltinPowerUsersSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the power users group.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BuiltinAccountOperatorsSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the account operators account.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BuiltinSystemOperatorsSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the system operators group.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BuiltinPrintOperatorsSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the print operators group.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BuiltinBackupOperatorsSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the backup operators group.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BuiltinReplicatorSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the replicator account.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BuiltinPreWindows2000CompatibleAccessSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches pre-Windows 2000 compatible accounts.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BuiltinRemoteDesktopUsersSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches remote desktop users.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BuiltinNetworkConfigurationOperatorsSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the network operators group.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AccountAdministratorSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the account administrators group.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AccountGuestSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the account guest group.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AccountKrbtgtSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the account Kerberos target group.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;span style="color:#ff0000;"&gt;AccountDomainAdminsSid&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style="color:#ff0000;"&gt;Indicates a SID that matches the account domain administrator group.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AccountDomainUsersSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the account domain users group.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AccountDomainGuestsSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the account domain guests group.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AccountComputersSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the account computer group.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AccountControllersSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the account controller group.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AccountCertAdminsSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the certificate administrators group.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AccountSchemaAdminsSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the schema administrators group.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AccountEnterpriseAdminsSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the enterprise administrators group.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AccountPolicyAdminsSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the policy administrators group.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AccountRasAndIasServersSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the RAS and IAS server account.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NtlmAuthenticationSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID present when the Microsoft NTLM authentication package authenticated the client.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DigestAuthenticationSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID present when the Microsoft Digest authentication package authenticated the client.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SChannelAuthenticationSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID present when the Secure Channel (SSL/TLS) authentication package authenticated the client.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ThisOrganizationSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID present when the user authenticated from within the forest or across a trust that does not have the selective authentication option enabled. If this SID is present, then OtherOrganizationSid cannot be present.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OtherOrganizationSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID present when the user authenticated across a forest with the selective authentication option enabled. If this SID is present, then ThisOrganizationSid cannot be present.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BuiltinIncomingForestTrustBuildersSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that allows a user to create incoming forest trusts. It is added to the token of users who are a member of the Incoming Forest Trust Builders built-in group in the root domain of the forest.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BuiltinPerformanceMonitoringUsersSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the group of users that have remote access to schedule logging of performance counters on this computer.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BuiltinPerformanceLoggingUsersSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the group of users that have remote access to monitor the computer.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BuiltinAuthorizationAccessSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID that matches the Windows Authorization Access group.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WinBuiltinTerminalServerLicenseServersSid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates a SID is present in a server that can issue Terminal Server licenses.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MaxDefined&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Indicates the maximum defined SID in the WellKnownSidType enumeration.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;BINGO!!! Parece que tenemos el SID del grupo de admnistradores del dominio (lo he marcado en rojo en la tabla anterior).&lt;/p&gt;
&lt;p&gt;Ahora vamos a generar el SID del grupo de adminstradores del dominio y ya podemos volver a probar el m&amp;eacute;todo IsInRole:&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;WindowsPrincipal wp = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; WindowsPrincipal(WindowsIdentity.GetCurrent());&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;SecurityIdentifier sid = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SecurityIdentifier(WellKnownSidType.AccountDomainAdminsSid, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; wp.IsInRole(sid);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ops! Nuestro gozo en un pozo&amp;hellip; se necesita informar el segundo argumento del constructor para el SID del grupo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.uyssoft.com/blog/images/HowToComosabersielusuarioactualesadminis_EA12/DomainSidError.png"&gt;&lt;img height="126" width="798" src="http://www.uyssoft.com/blog/images/HowToComosabersielusuarioactualesadminis_EA12/DomainSidError_thumb.png" alt="DomainSidError" border="0" title="DomainSidError" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4&gt;DomainSid&lt;/h4&gt;
&lt;p align="justify"&gt;&amp;iquest;Y que &lt;strong&gt;kkgrnn$#&lt;/strong&gt; representa que es este identificador? Pues seg&amp;uacute;n pone en &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/214122bs.aspx"&gt;la ayuda del constructor&lt;/a&gt;, debe proporcionarse el SID del dominio para que el constructor pueda devolver algunos identificadores de WellKnownSidType, entre los cuales est&amp;aacute; el de los administradores del dominio. &lt;/p&gt;
&lt;p align="justify"&gt;Dicho de otro modo, o sabemos el SID de nuestro dominio o todo lo anterior no vale para nada&amp;hellip; :-(&lt;/p&gt;
&lt;p align="justify"&gt;&amp;iquest;Y c&amp;oacute;mo podemos saber el SID de dominio? Despu&amp;eacute;s de buscar un ratito, lo &amp;uacute;nico que he encontrado es una utilidad de consola llamada &lt;a href="http://www.microsoft.com/technet/sysinternals/utilities/psgetsid.mspx"&gt;PsGetSid&lt;/a&gt;, que forma parte de las PSTools del inefable Mark Russinovich. Basta descargar esta utilidad y ejecutarla desde la consola de este modo para saber el SID de nuestro dominio (el nombre de dominio en formato &amp;ldquo;microsoft.com&amp;rdquo; o &amp;ldquo;net.volvo.com&amp;rdquo;):&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/HowToComosabersielusuarioactualesadminis_EA12/DomainSidConsole.png"&gt;&lt;img height="342" width="673" src="http://www.uyssoft.com/blog/images/HowToComosabersielusuarioactualesadminis_EA12/DomainSidConsole_thumb.png" alt="DomainSidConsole" border="0" title="DomainSidConsole" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;Sin embargo, me niego a tener que hacer esto para saber el identificador del dominio. As&amp;iacute; que vamos a probar si podemos recuperar esta propiedad del esquema de AD mediante un DirectoryEntry. Para ello utilizaremos la clase Domain:&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;Domain d = Domain.GetDomain(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    DirectoryContext(DirectoryContextType.Domain, getDomainName()));&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (DirectoryEntry de = d.GetDirectoryEntry())&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] domSid = (&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[])de.Properties[&lt;span style="color:#006080;"&gt;&amp;quot;objectSid&amp;quot;&lt;/span&gt;].Value;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; sdomainSid = sIDtoString(domSid);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    Console.WriteLine(sdomainSid);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}   &lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;Nota: Aqu&amp;iacute; necesitaremos dos funciones de apoyo, la primera nos devuelve el nombre del domino, y la segunda transforma el array de bits del SID en su representaci&amp;oacute;n textual:&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; getDomainName()&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; IPGlobalProperties.GetIPGlobalProperties().DomainName;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; sIDtoString(&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] sidBinary)&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    SecurityIdentifier sid = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SecurityIdentifier(sidBinary, 0);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; sid.ToString();&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;A todo esto el valor de la variable &lt;strong&gt;sdomainSid&lt;/strong&gt; es el esperado!!! :-D&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Poni&amp;eacute;ndolo todo junto&lt;/h4&gt;
&lt;p&gt;Al igual que &lt;a target="_blank" href="http://geeks.ms/blogs/jmtorres/default.aspx"&gt;el alegre bandolero&lt;/a&gt;, tambi&amp;eacute;n soy un fan&amp;aacute;tico de los m&amp;eacute;todos extensores, as&amp;iacute; que vamos a encapsular todo esto en un m&amp;eacute;todo que extienda la clase WindowsIdentity. Aqu&amp;iacute; va todo el c&amp;oacute;digo junto:&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.DirectoryServices;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.DirectoryServices.ActiveDirectory;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Net.NetworkInformation;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Security.Principal;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; Alpha.Code&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; SecurityExtensions&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; IsDomainAdmin (&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; WindowsIdentity identity)&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        {&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            Domain d = Domain.GetDomain(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                DirectoryContext(DirectoryContextType.Domain, getDomainName()));&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (DirectoryEntry de = d.GetDirectoryEntry())&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            {&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] bdomSid = (&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[])de.Properties[&lt;span style="color:#006080;"&gt;&amp;quot;objectSid&amp;quot;&lt;/span&gt;].Value;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; sdomainSid = sIDtoString(bdomSid);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                WindowsPrincipal wp = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; WindowsPrincipal(identity);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                SecurityIdentifier dsid = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SecurityIdentifier(sdomainSid);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                SecurityIdentifier dasid = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SecurityIdentifier(&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                    WellKnownSidType.AccountDomainAdminsSid, dsid);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;                &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; wp.IsInRole(dasid);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            }&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; getDomainName()&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        {&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; IPGlobalProperties.GetIPGlobalProperties().DomainName;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; sIDtoString(&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] sidBinary)&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        {&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            SecurityIdentifier sid = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SecurityIdentifier(sidBinary, 0);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; sid.ToString();&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Y la forma de usarlo es tan sencilla como esto:&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (WindowsIdentity.GetCurrent().IsDomainAdmin())&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#008000;"&gt;//Acciones a realizar si el usuario es administrador de dominio... &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Un saludo desde las fr&amp;iacute;as tierras de Andorra :-)&lt;/p&gt;
&lt;p&gt;Noviembre 2009&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=161264" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term=".NET" scheme="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx" /><category term="C#" scheme="http://geeks.ms/blogs/lfranco/archive/tags/C_2300_/default.aspx" /><category term="LDAP" scheme="http://geeks.ms/blogs/lfranco/archive/tags/LDAP/default.aspx" /><category term="HowTo" scheme="http://geeks.ms/blogs/lfranco/archive/tags/HowTo/default.aspx" /><category term="2009" scheme="http://geeks.ms/blogs/lfranco/archive/tags/2009/default.aspx" /></entry><entry><title>VSTO: Tabla de valores para .FaceId</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2009/11/06/vsto-tabla-de-valores-para-faceid.aspx" /><id>/blogs/lfranco/archive/2009/11/06/vsto-tabla-de-valores-para-faceid.aspx</id><published>2009-11-06T16:10:00Z</published><updated>2009-11-06T16:10:00Z</updated><content type="html">&lt;p align="justify"&gt;Nota r&amp;aacute;pida para todos los que alguna vez os toque desarrollar algun proyecto VSTO.&lt;/p&gt;
&lt;p align="justify"&gt;Al asignar una inagen a un bot&amp;oacute;n de las barras de herramientas debes asignarle un identificador num&amp;eacute;rico de im&amp;aacute;gen. Durante mucho tiempo he buscado alguna tabla que contenga todos los identificadores sin &amp;eacute;xito. Ayer, d&amp;iacute; con este enlace:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.kebabshopblues.co.uk/2007/01/04/visual-studio-2005-tools-for-office-commandbarbutton-faceid-property/" title="http://www.kebabshopblues.co.uk/2007/01/04/visual-studio-2005-tools-for-office-commandbarbutton-faceid-property/"&gt;http://www.kebabshopblues.co.uk/2007/01/04/visual-studio-2005-tools-for-office-commandbarbutton-faceid-property/&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;En el ten&amp;eacute;is las tablas de im&amp;aacute;genes e identificadores. Yo, por si acaso he hecho una copia por si algun dia se pierde el enlace :-)&lt;/p&gt;
&lt;p align="justify"&gt;Aqu&amp;iacute; est&amp;aacute;n:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_00000099.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_00000099_thumb.gif" alt="faceId_0000-0099" border="0" title="faceId_0000-0099" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_01000199.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_01000199_thumb.gif" alt="faceId_0100-0199" border="0" title="faceId_0100-0199" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_02000299.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_02000299_thumb.gif" alt="faceId_0200-0299" border="0" title="faceId_0200-0299" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_03000399.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_03000399_thumb.gif" alt="faceId_0300-0399" border="0" title="faceId_0300-0399" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_04000499.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_04000499_thumb.gif" alt="faceId_0400-0499" border="0" title="faceId_0400-0499" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_05000599.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_05000599_thumb.gif" alt="faceId_0500-0599" border="0" title="faceId_0500-0599" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_06000699.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_06000699_thumb.gif" alt="faceId_0600-0699" border="0" title="faceId_0600-0699" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_07000799.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_07000799_thumb.gif" alt="faceId_0700-0799" border="0" title="faceId_0700-0799" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_08000899.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_08000899_thumb.gif" alt="faceId_0800-0899" border="0" title="faceId_0800-0899" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_09000999.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_09000999_thumb.gif" alt="faceId_0900-0999" border="0" title="faceId_0900-0999" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_10001099.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_10001099_thumb.gif" alt="faceId_1000-1099" border="0" title="faceId_1000-1099" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_11001199.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_11001199_thumb.gif" alt="faceId_1100-1199" border="0" title="faceId_1100-1199" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_12001299.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_12001299_thumb.gif" alt="faceId_1200-1299" border="0" title="faceId_1200-1299" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_13001399.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_13001399_thumb.gif" alt="faceId_1300-1399" border="0" title="faceId_1300-1399" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_14001499.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_14001499_thumb.gif" alt="faceId_1400-1499" border="0" title="faceId_1400-1499" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_15001599.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_15001599_thumb.gif" alt="faceId_1500-1599" border="0" title="faceId_1500-1599" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_16001699.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_16001699_thumb.gif" alt="faceId_1600-1699" border="0" title="faceId_1600-1699" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_17001799.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_17001799_thumb.gif" alt="faceId_1700-1799" border="0" title="faceId_1700-1799" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_18001899.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_18001899_thumb.gif" alt="faceId_1800-1899" border="0" title="faceId_1800-1899" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_19001999.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_19001999_thumb.gif" alt="faceId_1900-1999" border="0" title="faceId_1900-1999" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_20002099.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_20002099_thumb.gif" alt="faceId_2000-2099" border="0" title="faceId_2000-2099" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_21002199.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_21002199_thumb.gif" alt="faceId_2100-2199" border="0" title="faceId_2100-2199" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_22002299.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_22002299_thumb.gif" alt="faceId_2200-2299" border="0" title="faceId_2200-2299" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_23002399.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_23002399_thumb.gif" alt="faceId_2300-2399" border="0" title="faceId_2300-2399" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_24002499.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_24002499_thumb.gif" alt="faceId_2400-2499" border="0" title="faceId_2400-2499" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_25002599.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_25002599_thumb.gif" alt="faceId_2500-2599" border="0" title="faceId_2500-2599" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_26002699.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_26002699_thumb.gif" alt="faceId_2600-2699" border="0" title="faceId_2600-2699" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_27002799.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_27002799_thumb.gif" alt="faceId_2700-2799" border="0" title="faceId_2700-2799" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_28002899.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_28002899_thumb.gif" alt="faceId_2800-2899" border="0" title="faceId_2800-2899" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_29002999.gif"&gt;&lt;img height="559" width="230" src="http://www.uyssoft.com/blog/images/VSTOTabladevalorespara.FaceId_EF8E/faceId_29002999_thumb.gif" alt="faceId_2900-2999" border="0" title="faceId_2900-2999" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;Que aproveche! :-)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=160033" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term="VSTO" scheme="http://geeks.ms/blogs/lfranco/archive/tags/VSTO/default.aspx" /></entry><entry><title>VS2010: Aleluya! Mejoras en Project –&gt; Refrences</title><link rel="alternate" type="text/html" href="/blogs/lfranco/archive/2009/10/29/vs2010-aleluya-mejoras-en-project-gt-refrences.aspx" /><id>/blogs/lfranco/archive/2009/10/29/vs2010-aleluya-mejoras-en-project-gt-refrences.aspx</id><published>2009-10-29T08:01:00Z</published><updated>2009-10-29T08:01:00Z</updated><content type="html">&lt;p&gt;Leo en el blog de &lt;a target="_blank" href="http://weblogs.asp.net/scottgu/default.aspx"&gt;Scott&lt;/a&gt;, que por fin alguien me ha hecho caso :-)&lt;/p&gt;
&lt;p align="justify"&gt;Ya en las betas de la versi&amp;oacute;n 2003 mand&amp;eacute; una petici&amp;oacute;n para que el cuadro de di&amp;aacute;logo de referencias se cargara de forma as&amp;iacute;ncrona, y desde entonces no se puede decir que me hubi&amp;eacute;sen hecho demasiado caso. La verdad es que tampoco creo que me lo hayan hecho ahora, pero al menos alguien debe haber llegado a la misma conclusi&amp;oacute;n: El cuadro de di&amp;aacute;logo de agregar referencias tardaba horrores en cargar. &lt;/p&gt;
&lt;p align="justify"&gt;La verdad es que es normal, ya que en la versi&amp;oacute;n 2008 todav&amp;iacute;a tenemos el mismo di&amp;aacute;logo que en Visual Studio 6.0, ya ha llovido un poco.&lt;/p&gt;
&lt;p align="justify"&gt;Ahora, a partir de la beta 2 de 2010, este cuadro de di&amp;aacute;logo se abre por defecto en la pesta&amp;ntilde;a &amp;lsquo;Projects&amp;rsquo; en lugar de mostrar las referencias de .NET, y esto es mucho m&amp;aacute;s r&amp;aacute;pido.&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VS2010AleluyaMejorasenProjectRefrences_7E14/ref1.png"&gt;&lt;img height="412" width="486" src="http://www.uyssoft.com/blog/images/VS2010AleluyaMejorasenProjectRefrences_7E14/ref1_thumb.png" alt="ref1" border="0" title="ref1" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;Pero eso no es todo, ahora en las dos primeras pesta&amp;ntilde;as, la carga de ensamblados se realiza ahora de forma as&amp;iacute;ncrona, de forma que no paraliza el IDE hasta que estan todos los ensamblados cargados en la lista.&lt;/p&gt;
&lt;p align="justify"&gt;Si, se que es una tonteria&amp;hellip; pero a veces estos peque&amp;ntilde;os cambios hacen que uno sea bastante m&amp;aacute;s productivo, o que al menos no se cabree con la herramienta cuando por error le das a esta ventana :-P&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://www.uyssoft.com/blog/images/VS2010AleluyaMejorasenProjectRefrences_7E14/ref2.png"&gt;&lt;img height="412" width="486" src="http://www.uyssoft.com/blog/images/VS2010AleluyaMejorasenProjectRefrences_7E14/ref2_thumb.png" alt="ref2" border="0" title="ref2" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p align="justify"&gt;Art&amp;iacute;culo original:&lt;/p&gt;
&lt;p align="justify"&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2009/10/29/add-reference-dialog-improvements-vs-2010-and-net-4-0-series.aspx" title="http://weblogs.asp.net/scottgu/archive/2009/10/29/add-reference-dialog-improvements-vs-2010-and-net-4-0-series.aspx"&gt;http://weblogs.asp.net/scottgu/archive/2009/10/29/add-reference-dialog-improvements-vs-2010-and-net-4-0-series.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Saludos a todos!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=159165" width="1" height="1"&gt;</content><author><name>lfranco</name><uri>http://geeks.ms/members/lfranco/default.aspx</uri></author><category term=".NET" scheme="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx" /><category term="Visual Studio" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Visual+Studio/default.aspx" /><category term="2010" scheme="http://geeks.ms/blogs/lfranco/archive/tags/2010/default.aspx" /><category term="Beta" scheme="http://geeks.ms/blogs/lfranco/archive/tags/Beta/default.aspx" /></entry></feed>