Uso de SPBasePermissions para verificar o establecer permisos en diversos objetos de SharePoint

En este post, añado una lista de algunas de las propiedades y métodos que devuelven el enumerador  SPBasePermissions, y algunos métodos que toman como parámetro SPBasePermissions para comprobar si un usuario tiene ciertos derechos sobre un objeto en SharePoint.

Los siguientes son algunos de los componentes más comunes de SharePoint que se puede utilizar para obtener o establecer los permisos, o comprobar si son eficaces ciertos permisos para un usuario sobre el objeto:

Obtener o establecer los permisos de la base de una definición de función en un objeto SPWeb:

  • SPWeb.RoleDefinitions.BasePermissions 

Obtener los permisos del usuario actual o especificado tiene los permisos especificados sobre un objeto:

  • SPSite.EffectiveBasePermissions
  • SPSite.GetEffectiveRightsForAcl (SPReusableAcl)
  • SPWeb.EffectiveBasePermissions 
  • SPWeb.GetUserEffectivePermissions (Nombre de usuario String)
  • SPList.EffectiveBasePermissions 
  • SPList.EffectiveFolderPermissions 
  • SPList.GetUserEffectivePermissions (Nombre de usuario String)
  • SPFolder.EffectiveRawPermissions 
  • SPFile.EffectiveRawPermissions 
  • SPListItem.EffectiveBasePermissions 
  • SPListItem.GetUserEffectivePermissions (Nombre de usuario String)

Comprobar si el usuario actual o especificado tiene los permisos especificados y lanza UnauthorizedAccessException si no:

  • SPSite.CheckForPermissions (SPReusableAcl, SPBasePermissions) 
  • SPWeb.CheckPermissions (SPBasePermissions) 
  • SPList.CheckPermissions (SPBasePermissions) 
  • SPListItem.CheckPermissions (SPBasePermissions)

Devuelve verdadero/falso indicando si el usuario tiene el permisos específicos:

  • SPSite.DoesUserHavePermissions (SPReusableAcl, SPBasePermissions) 
  • SPSite.DoesUserHavePermissions (SPReusableAcl, SPBasePermissions, SPWeb) 
  • SPWeb.DoesUserHavePermissions (SPBasePermissions) 
  • SPWeb.DoesUserHavePermissions (String, SPBasePermissions) 
  • SPList.DoesUserHavePermissions (SPBasePermissions) 
  • SPList.DoesUserHavePermissions (SPUser, SPBasePermissions) 
  • SPListItem.DoesUserHavePermissions (SPBasePermissions) 
  • SPListItem.DoesUserHavePermissions (SPUser, SPBasePermissions) 

Diseño de páginas base – Permisos necesarios para acceder a una LayoutPageBase

  • LayoutsPageBase.RightsRequired 
  • LayoutsPageBase.DefaultLayoutsRights 

Recortar contenido de una página (Obtener o establecer permisos)

  • SPSecurityTrimmedControl.Permissions 

Permisos base asociados a un objeto SPPermission

  • SPPermission.BasePermissions 

Obtener los permisos base necesarios para utilizar un objeto o ConsoleAction ConsoleNode

  • ConsoleAction.UserRights 
  • ConsoleNode.UserRights 

Obtener los permisos necesarios para ver el Panel de Control de desarrolladores

  • SPDeveloperDashboardSettings.RequiredPermissions 

Obtener o establecer los permisos para una Aplicación Web

  • SPWebApplication.RightsMask 
  • SPSite.ApplicationRightsMask 

Permisos necesarios para acceder a una página móvil

  • SPMobilePage.RightsRequired 

Botón de la barra de menú

  • ToolBarMenuButton.CallbackVisibilityPermission 

Otros:

  • SPSecurableObject.GetUserEffectivePermissions (Nombre de usuario String) 
  • SPRibbon.Permissions 
  • MenuItemTemplate.Permissions 
  • SPUserCustomAction.Rights
De una forma gráfica, una manera de entender las dependencias de permisos que maneja SharePoint por defecto, es esta (pincha sobre ella para verla en grande):





Muy al hilo de esta información, creo que es de recomendada lectura el siguiente articulo de Microsoft: User permissions and permission levels (SharePoint Server 2010), donde se trata el tema de los permisos mas a fondo.


Script para controlar el tamaño de los Sitios en SharePoint

Si tienes multiples subsitios dentro de una coleccion de sitios en SharePoint 2010 y quieres saber por cada uno de ellos, cuanto espacio ocupa, en diferentes medidas, aqui os dejo un script de PowerShell muy útil. Además este script, da el tamaño total de la suma de todos.

#====================================================================================
function GetWebSizes ($StartWeb)
{
    $web = Get-SPWeb $StartWeb
    [long]$total = 0
    $total += GetWebSize -Web $web
    $total += GetSubWebSizes -Web $web
    $totalInMb = ($total/1024)/1024
    $totalInMb = "{0:N2}" -f $totalInMb
    $totalInGb = (($total/1024)/1024)/1024
    $totalInGb = "{0:N2}" -f $totalInGb
    write-host "El tamaño de los subsitios bajo:" $StartWeb " es de " $total "Bytes, el cual es " $totalInMb " MB o" $totalInGb "GB"
    $web.Dispose()
}
#====================================================================================
function GetWebSize ($Web)
{
    [long]$subtotal = 0
    foreach ($folder in $Web.Folders)
    {
        $subtotal += GetFolderSize -Folder $folder
    }
    write-host "Sitio:" $Web.Title " tiene " $subtotal "KB"
    return $subtotal
}
#====================================================================================
function GetSubWebSizes ($Web)
{
    [long]$subtotal = 0
    foreach ($subweb in $Web.GetSubwebsForCurrentUser())
    {
        [long]$webtotal = 0
        foreach ($folder in $subweb.Folders)
        {
            $webtotal += GetFolderSize -Folder $folder
        }
        write-host "Sitio:" $subweb.Title " tiene " $webtotal "Bytes"
        $subtotal += $webtotal
        $subtotal += GetSubWebSizes -Web $subweb
    }
    return $subtotal
}
#====================================================================================
function GetFolderSize ($Folder)
{
    [long]$folderSize = 0
    foreach ($file in $Folder.Files)
    {
        $folderSize += $file.Length;
    }
    foreach ($fd in $Folder.SubFolders)
    {
        $folderSize += GetFolderSize -Folder $fd
    }
    return $folderSize
}
#====================================================================================
$siteurl = "http://intracepsa.cepsacorp.com"
#Llamada a la funcion para devolver el tamaño del la Intranet
GetWebSizes $siteurl

Script para el aprovisionamiento de My Site en SharePoint

Este es uno de los primeros de una serie posts, cuyo objetivo es mostrar como se pueden realizar muchas de las labores de administracion de SharePoint 2010 habituales, con scripts de PowerShell.

Comenzamos con un sencillo script que permite aprovisionar el My Site de un usuario, unicamente hay que llamar a la siguiente funcion:

[Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
[Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server")
Function CreateMySite($siteurl, $loginname)
{
	$site = New-Object Microsoft.SharePoint.SPSite($siteurl)
	$context = [Microsoft.Office.Server.ServerContext]::GetContext($site)
	$upm = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context)
	if ($upm.UserExists($loginname)) {
		$profile = $upm.GetUserProfile([string]$loginname)
		trap [Microsoft.Office.Server.UserProfiles.PersonalSiteExistsException]
		{
			Write-Host "WARNING: Ya existe el sitio personal del usuario: $loginname" -ForeGroundColor Red
			continue
		}
		write-host "Creando el sitio personal para el usuario: $loginname" -ForeGroundColor Green
		$profile.CreatePersonalSite();
	} else {
		Write-Host "WARNING: No existe el usuario: $loginname" -ForeGroundColor Red
	}
	$site.Dispose()
}

$siteurl = "http://misitio"
$loginname = "DOMINIO\USUARIO"
#Llamada a la funcion para crear el My Site
#CreateMySite $siteurl $loginname

En el caso que quieras provisionar todos los usuarios existentes en el UserProfile, en vez de utilizar la función anterior puedes usar esta otra:

[Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
[Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server")
Function CreateMySite($siteurl)
{
	$site = New-Object Microsoft.SharePoint.SPSite($siteurl)
	$context = [Microsoft.Office.Server.ServerContext]::GetContext($site)
	$upm = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context)
	foreach ($userobject in $Profiles ) {
		$loginname = $userobject.item("AccountName")
		if ($upm.UserExists($loginname)) {
			$profile = $upm.GetUserProfile([string]$loginname)
			trap [Microsoft.Office.Server.UserProfiles.PersonalSiteExistsException]
			{
				Write-Host "WARNING: Ya existe el sitio personal del usuario: $loginname" -ForeGroundColor Red
				continue
			}
			write-host "Creando el sitio personal para el usuario: $loginname" -ForeGroundColor Green
			$profile.CreatePersonalSite();
			trap
			{
				Write-Host "ERROR: Se ha producido un error al crear el sitio para: $loginname" -ForeGroundColor Red
				continue
			}
		}else{
			Write-Host "WARNING: No existe el usuario: $loginname" -ForeGroundColor Red
		}
	}
	$site.Dispose()
}

$siteurl = "http://misitio"
#Llamada a la funcion para crear el My Site
#CreateMySite $siteurl

Escribir en ULS con SharePoint 2010

SharePoint 2007/20010 dispone de un sistema de logs/trazar llamado Unified Logging System (ULS). Si quieres mas información sobre ULS puedes consultar este artículo de Microsoft: Introducción al registro del sistema de creación de registros unificado (ULS).

Cuando implementamos una aplicación sobre esta plataforma, es muy conveniente, registrar cualquier excepción al ULS para un futuro análisis, que nos permita evaluar y corregir el problema.

En SharePoint 2010 se implementa la clase SPDiagnosticsServiceBase, con la que podemos acceder de una forma mas cómoda que en versiones anteriores a este tipo de información, ya que cuenta con los métodos WriteEvent y WriteTrace, para ello.

El siguiente codigo muestra un ejemplo de como escribir en ULS volcando la información de una excepción capturada:

try
{
    var i = 0;
    var a = 2 / i;
}
catch (Exception ex)
{
    SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory("Mi Categoria", TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected, ex.Message, ex.StackTrace);
}

En el caso que queramos volcar información al ULS sin necesidad de estar dentro de un “catch” puedes usar esto:

SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory("Mi Categoria", TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected, "Mi descripcion del error", string.Empty);

Por ultimo, existe una herramienta de Microsoft, para visualizar estos archivos de logs, llamada ULS Viewer, que puedes descargar de forma gratuita desde aquí.

 

Error en el control TaxonomyPicker.ascx

Revisando el visor de eventos de los entornos de producción, donde está instalado SharePoint 2010, me he encontrado un error muy curioso, relacionado con el control TaxonomyPicker.ascx. La descripción del error es:

Error al cargar el archivo de plantilla de control /_controltemplates/TaxonomyPicker.ascx: Could not load type ‘Microsoft.SharePoint.Portal.WebControls.TaxonomyPicker’ from assembly ‘Microsoft.SharePoint.Portal, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c’.

Revisando el codigo del control TaxonomyPicker.ascx me he dado cuenta que en vez de aparecer una “,” aparece “,”.

<%@ Control className=”TaxonomyPickerControl” Language=”C#” Inherits=”Microsoft.SharePoint.Portal.WebControls.TaxonomyPicker&#44;Microsoft.SharePoint.Portal,Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c” %>

Para solucionar este problema existen dos opciones:

  • La primera es cambiar “&#44;” por “,” en todos los servidores de la granja.
  • La otra opción es, como el control TemplatePicker.ascx no se utiliza desde la versión de SharePoint 2010 RTM, se puede renombrear el archivo con una extensión que no sea “.ascx”, por ejemplo “TemplatePicker.ascx.error” y dejará de compilarse.

Existe un articulo de soporte donde Microsoft, trata este error: KB2481844

Etiquetas: , , , ,
Etiquetado en SharePoint 2010 por OMG. Sin comenrtarios

Como crear un subsitio en SharePoint 2010

Como hacer las cosas desde la interface web de SharePoin, no tiene mucho misterio y además puedes encontrarlo facilmente buscando en Internet, prefiero detallar como se harian las cosas programaticamente, ya que esto es lo que nos va a permitir personalizar SharePoint a nuestro gusto/necesidad.

Este es el caso de la creación de un subsitio y mas contratamente un sitio de tipo blog en idioma Español. A continuación os dejo una funcion, que crea un nuevo sitio utilizando la plantilla de blog: SPWebTemplate.WebTemplateBLOG (aunque se puede usar cualquier otra que necesitemos, para ello puedes consultar el listado de plantillas de sitio de SharePoint 2010). He de destacar que el idioma de creacion de estas plantillas enla funcion es el Spanish – Spain (Modern Sort), pero se puede usar cualquier otro, solo tienes que cambiar el LCID:

private void CreateBlogSite(SPWeb web, string siteUrl, string siteTitle, string siteDescription)
{
  string siteTemplate = SPWebTemplate.WebTemplateBLOG; //epecifica la plantilla de sitio (Blog)
  uint siteLocationID = 3082; //idioma Spanish - Spain (Modern Sort)
  SPWebCollection subsite = web.Webs;
  subsite.Add(siteUrl, siteTitle, siteDescription, siteLocationID, siteTemplate, true, false);
}

Para más informacion puedes consultar el metodo SPWebCollection.Add.

Como establecer el administrador primario y secundario de una colección de sitios

Esta es la forma de establecer a través de código el administrador primario y secundario de una coleccion de sitios en SharePoint 2010. Para ello vamos a usar las propiedades SPSite.Owner y SPSite.SecondaryContact. Esta es un funcion de ejemplo que puede mejorarse verificando si los usuarios vienen vacios, o si el objeto SPSite es nulo… pero espero que os sirva a modo plantilla sobre la que partir. He decidido pasarle como parámetro el objeto SPSite, ya que asi puede ser llamada, por ejemplo, desde un WebPart de administración como desde la activación de una característica:

private bool SetAdministrators(SPSite site, string admPrimary, string admSecondary)
{
  bool result = false;
  try
  {
      SPUser PrimaryUser = site.RootWeb.EnsureUser(admPrimary);
      SPUser SecondaryUser = site.RootWeb.EnsureUser(admSecondary);
      site.Owner = PrimaryUser; //asigna el administrador primario
      site.SecondaryContact = SecondaryUser; //asigna el administrador secundario
      result = true;
  }
  catch (Exception) { }
  return result;
}

Listado de plantillas de sitio en SharePoint 2010

Como me ha tocado crear nuevos sitios a través del modelo de objetos, he tenido que pegarme con las plantillas estandar que trae por defecto SharePoint 2010… Como creo que es util tener tanto la definición, como el listado de plantillas que se pueden usar, adjunto un listado de estas:

Más información sobre las plantillas de sitio de SharePoint 2010: aquí.