miércoles, 25 de febrero de 2009

Aplicando permisos de Full Control a un usuario en SharePoint por medio de código

A pesar de las innumerables ejemplos en la red, me costo un mundo aplicar efectivamente el permiso de full control a un usuario. Al final fue la combinación de varios conceptos que detallo a continuación:

  1. Se debe de romper la herencia de roles del sitio padre para eso es el siguiente código:

if (!subWeb.HasUniqueRoleAssignments)
subWeb.BreakRoleInheritance(true);

2. Se debe de aplicar un rol al usuario en vez de al grupo. Entonces SharePoint asignará al usuario al grupo que tenga dicho rol. El código para hacer eso es el siguiente:

var oUser = subWeb.Users[LogIn];
SPRoleAssignment role = new SPRoleAssignment(oUser);
var roleDefinition = nuevoWeb.RoleDefinitions.GetByType(SPRoleType.Administrator);
role.RoleDefinitionBindings.Add(roleDefinition);
subWeb.RoleAssignments.Add(role);

3. Aseguremonos de estar en el sitio correcto donde vamos aplicar los permisos. Para eso es el siguiente código:

using (SPSite site = new SPSite(nuevoWeb.Url)) {
using (SPWeb subWeb = site.OpenWeb(nuevoWeb.Name)) {..}..}

En el código debe explicar los siguiente:

SPSecurity.RunWithElevatedPrivileges

Esto nos sirve para ejecutar un segmento de código con privilegios elevados necesario para aplicar los permisos a dicho nivel.

SPWeb nuevoWeb = miWeb.Webs.Add(nuevoSitioURL, IngresoNombreSitio.Text, "", _webHelper.ObtenerCodigoIdiomaTemplate(), mwsTemplate, false, false);

El siguiente código corresponde a la declaración de un control web de SharePoint para obtener un usuario de dominio de windows:

ArrayList peEntities = IngresoPropietario.Entities;

if (peEntities.Count > 0) {
PickerEntity pickEn = (PickerEntity)peEntities[0];
string LogIn = pickEn.Key;

la declaración de IngresoPropietario es la siguiente:

<SharePoint:PeopleEditor id="IngresoPropietario" runat="server" IsValid="false" AllowEmpty="false"
Height="20px" Width="400px" AllowTypeIn="true" MultiSelect="false" />

El siguiente parametro SPWeb nuevoWeb es de un sitio creado en base a un plantilla y se generó del siguiente código:

El código completo a continuación:

private void AplicaPermisos(SPWeb nuevoWeb) {
SPSecurity.RunWithElevatedPrivileges(delegate()
{
ArrayList peEntities = IngresoPropietario.Entities;
if (peEntities.Count > 0) {
PickerEntity pickEn = (PickerEntity)peEntities[0];
string LogIn = pickEn.Key;

using (SPSite site = new SPSite(nuevoWeb.Url)) {
using (SPWeb subWeb = site.OpenWeb(nuevoWeb.Name)) {
subWeb.Users.Add(LogIn, "", LogIn, "");
subWeb.Update();
if (!subWeb.HasUniqueRoleAssignments)
subWeb.BreakRoleInheritance(true);
var oUser = subWeb.Users[LogIn];
SPRoleAssignment role = new SPRoleAssignment(oUser);
var roleDefinition = nuevoWeb.RoleDefinitions.GetByType(SPRoleType.Administrator);
role.RoleDefinitionBindings.Add(roleDefinition);
subWeb.RoleAssignments.Add(role);

subWeb.Update();
}
}
}
});

Recuerda amigo, Code4Fun!

Manolo Herrera

lunes, 9 de febrero de 2009

Proxima Reunión de la Comunidad:Data model & Entity Framework

Amigos de la comunidad estaré con ustedes compartiendo el modelado de datos y la Entity Framework. Aquí les dejo la invitación:

Play it on expert: Data model & Entity Framework
Expositor: Manolo Herrera (MVP)
Fecha: Miércoles 18 de Febrero del 2009
Lugar: Executrain, Edificio Sixtino 3er Nivel
Hora: 6:30 pm.

Los desarrolladores de software odian la idea de crear a mano el SQL, pero aman la idea de especificar una consulta que la Entity Framework luego transformará por ellos en el lenguaje "nativo" de la base de datos. Esto los hace a ellos mucho más productivos y genera mejor código sin errores.

Nos vemos este próximo miércoles.

Manolo Herrera

viernes, 6 de febrero de 2009

Business Data Catalog MOSS2007: Can't connect to DBInstance

Síntoma:

under the default settings SQL Server does not allow remote connections

Plataforma:

Moss 2007 y SQL Server Express.

Solución:

  • Enable the TCP/IP protocol using the Surface Area Configuration Utility
  • Make sure the TCP/IP protocol is enabled in the SQL Server Configuration Utility
  • Make sure the SQL Server browser is started.
  • Ejecute la línea de comando: osql -E -S tcp:mherrera\sqlexpress [Enter]
    • Si no le marca error y le coloca un 1> escriba quit y ya esta habilitada la comunicación remota.

Si tiene alguna duda siga los pasos del articulo base no.1.

Artículos Base Referencia:

1) http://www.datamasker.com/SSE2005_NetworkCfg.htm

2) http://blah.winsmarts.com/2007-4-SharePoint_2007__BDC_-_The_Hello_World_Example.aspx

Hasta la próxima,

Manolo Herrera

Tip: Como validar una url en SharePoint

Valido también para aplicaciones Web en ASP.Net, obviamente. Simplemente se debe invocar el WebRequest con el método Create enviando el URL que deseamos validar y luego si nos tira una excepción WEB no encontró la URL indicada.

En el ejemplo de abajo si no encuentra la imagen muestra la imagen de persona que un sitio de SharePoint, sino se construyo correctamente el URL dará una excepción general que será bueno mostrarla para hacer las correcciones respectivas:

try {
var req = (HttpWebRequest)WebRequest.Create(urlImagen);
req.GetResponse();
writer.Write("<img alt=\"\" src=\"" + urlImagen + "\" width=\"70\" />");
}
catch (WebException) {
writer.Write("<img alt=\"\" src=\"/_layouts/images/person.gif\" />");

}
catch (Exception exGeneral) {
writer.Write(exGeneral.Message);
}

Recuerda, Code4Fun!

Manolo