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

No hay comentarios.: