Archivo de la etiqueta: Permisos

“Configurar grupos para este sitio” en SharePoint 2010

sharepoint2010Una de las cosas que echo de menos de SharePoint 2007 en SharePoint 2010 es la pagina de “Configurar grupos para este sitio” o en inglés “Set up Groups for this site“, donde el usuario puede especificar quién puede tener acceso a un  sitio en concreto. Esta claro que he mejorado mucho la forma de gestionar los grupos y usuarios, pero hecho en falta esta pagina (y sobre todo su funcionalidad)…

 

ConfigurarGrupos

Por algún motivo, el equipo de SharePoint decidió que esta funcionalidad “Configurar grupos de este sitio” debía de estar oculta en el menú de Permisos del Sitio. Si que esta visible, cuando creas un Sitio nuevo (si lo creas con la opción de permisos únicos), la malo es que luego, no hay forma de ver los grupos asignados a cada perfil.

Si necesitas realizar cambios en la asignación de grupos y como esta funcionalidad sigue estando en SharePoint 2010, siempre es posible acceder a la pagina por url: /_layouts/permsetup.aspx

 

Listado de permisos de usuarios de un sitio en SharePoint 2010

powershellUna de las ultimas cosas que me han solicitado es recuperar todos los usuarios y sus permisos de una colección de sitio o subsitio en SharePoint 2010

La forma mas rápida que se me ocurrió es la de crear un script de PowerShell para ello. Como creo que os podría ser de utilidad, lo comparto con todos vosotros:

function Get-UsersPermissions([string]$portalurl, [String[]]$excludewebs, [string]$onesite) 
{ 
    [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") 
    $farm = [Microsoft.SharePoint.Administration.SPFarm]::Local 
	#añade la barra si no existe
    if (-not $portalurl.EndsWith("/")) { $portalurl = $portalurl + "/" } 
	#recorre todos los servicios de la granaja
    foreach ($spService in $farm.Services) 
	{ 
        if (!($spService -is [Microsoft.SharePoint.Administration.SPWebService])) { continue; } 
        foreach ($webApp in $spService.WebApplications) 
		{ 
            if ($webApp -is [Microsoft.SharePoint.Administration.SPAdministrationWebApplication]) { continue; } 
			$webAppUrl = $webApp.GetResponseUri('Default').AbsoluteUri 
			if ($webAppUrl.ToUpper() -eq $portalurl.ToUpper())
			{ 
				#recorre las colecciones que existen en la aplicacion web
				foreach ($site in $webApp.Sites) 
				{ 
					#si existe algun parametro 
					if (($onesite -ne $null) -and ($onesite -ne "")) 
					{ 
						#verifica si se ha incluido el parametro Web
						if ($site.Url.ToUpper() -ne $onesite.ToUpper()) { continue; } 
					} 
					#recorre los sitios que existen en la coleccion
					foreach ($web in $site.AllWebs) 
					{ 
						if ($excludewebs -contains $web.Url) 
						{ 
							Write-Host "Se ha excluido el sigioente sitio: " $web.Url 
							continue 
						} 
						foreach ($user in $web.SiteUsers)
						{ 
							#excluye al usuario: sharepoint\system 
							if ($user.Loginname.StartsWith("SHAREPOINT\")) { continue; } 
							#recupera la informacion a mostrar
							$data = @{ 
										"Coleccion" = $site.Url 
										"Url sitio" = $web.Url 
										"Nombre sitio" = $web.Title 
										"Usuario" = $user.Loginname 
										"Nombre" = $user.Name 
										"Roles" = $user.Roles 
										"Grupos" = $user.Groups 
							} 
							New-Object PSObject -Property $data 
						} 
						$web.Dispose(); 
					} 
					$site.Dispose() 
				} 
			} 
		} 
	} 
}

#---------------------------------------------------------------
#Opcion 1: Listas de los usuarios y sitio del la Aplicacion Web: http://intranet, pero solo muestra los usuarios y permisos del subsitio: http://intranet/sites/test
# Get-UsersPermissions -portalurl:http://intranet/  -onesite:http://intranet/sites/test | Out-GridView
#---------------------------------------------------------------
#Opcion 2: Listas de los usuarios y sitio del la Aplicacion Web http://intranet, pero excluye los 3 sitios: /gastos, /docs y /rrhh
# Get-UsersPermissions -portalurl:http://intranet/ -excludewebs:@('http://intranet/gastos','http://intranet/docs','http://intranet/rrhh')  | Out-GridView
#---------------------------------------------------------------
#Opcion 3: Lista todas los sitios y usuarios de la Aplicacion Web: http://intranet
# Get-UsersPermissions -portalurl:http://intranet/ | Out-GridView
#---------------------------------------------------------------

Excel Services – The workbook cannot be opened

sharepoint2010Si estas intentado abrir un archivo Excel en SharePoint 2010, a través de Excel Services (partimos que el servicio ya esta instalado en la granja) y recibes este mensaje de error: “The workbook cannot be opened“, sin duda, se trata de un problema de permisos de base de datos.

excel_f1

Para solucionar este problema, has de dar permiso de “db_owner” a la cuenta de servicio que estas usando para ejecutar Excel Services, siguiendo los siguientes pasos:

1) Abre el administrador de bases de datos “SQL Server Management Studio” y localiza la base de datos o bases de datos de contenido (puedes verlo en el Visor de Eventos de Windows “<Content Database Name>” y selecciona “Security“.

2) Dentro de esta sección, posicionate en “Users” y con el botón derecho, selecciona “New User …

excel_f2

3) Introducimos la cuenta de servicio que ejecuta el servicio de Excel Service (que puedes localizar en Security -> Configure Service Accounts, seleccionado el pool del servicio) y le asignamos el rol de “db_owner“.

excel_f3

 

4) Guarda los cambios y verás como los archivos Excel ser abren correctamente en tu navegador web.

 

Como cambiar los permisos a nivel del Aplicación Web en SharePoint 2010

Existe un nivel de permisos de usuario que se pueden especificar a nivel de Aplicación Web o Web Application, que afecta a todas las Colecciones de Sitio que se encuentren ahí alojadas. Este nivel de permisos es muy útil, si quieres restringir los permisos a nivel global, como por ejemplo, si hablamos de los My Site personales de los empleados de una empresa, aquí os dejo una captura de pantalla para aclarar a que funcionalidad me refiero, dentro de la Administración Central…

Para poder realizar estos cambios de permisos usando el modelo de objetos, he creado dos funciones las cuales se basan en el uso de la propiedad SPWebApplication.RightsMask, una primera función DesactivarPermisos() en la cual de todos los posibles permisos se han comentado los permisos que deseamos desactivar. En la segunda función ActivarPermisos(), lo que hago es volver a activar todos los permisos.

//funcion para desactivar los permisos del WebApplication de My Site
private static void DesactivarPermisos(string WebAppUrl)
{
  try
  {
    SPSecurity.RunWithElevatedPrivileges(delegate()
    {
      //instancia el objeto WebApplication
      SPWebApplication webApp = SPWebApplication.Lookup(new Uri(WebAppUrl));
      //definie los permisos del obejto WebApplication
      webApp.RightsMask =
        //============ List Permissions ============
        //SPBasePermissions.ManageLists |
        SPBasePermissions.CancelCheckout |
        SPBasePermissions.AddListItems |
        SPBasePermissions.EditListItems |
        SPBasePermissions.DeleteListItems |
        SPBasePermissions.ViewListItems |
        SPBasePermissions.ApproveItems |
        SPBasePermissions.OpenItems |
        SPBasePermissions.ViewVersions |
        SPBasePermissions.DeleteVersions |
        SPBasePermissions.CreateAlerts |
        SPBasePermissions.ViewFormPages |
        //============ Site Permissions ============
        //SPBasePermissions.ManagePermissions |
        //SPBasePermissions.ViewUsageData |
        //SPBasePermissions.ManageSubwebs |
        //SPBasePermissions.ManageWeb |
        //SPBasePermissions.AddAndCustomizePages |
        //SPBasePermissions.ApplyThemeAndBorder |
        //SPBasePermissions.ApplyStyleSheets |
        //SPBasePermissions.CreateGroups |
        SPBasePermissions.BrowseDirectories |
        SPBasePermissions.CreateSSCSite |
        SPBasePermissions.ViewPages |
        SPBasePermissions.EnumeratePermissions |
        SPBasePermissions.BrowseUserInfo |
        //SPBasePermissions.ManageAlerts |
        //SPBasePermissions.UseRemoteAPIs |
        //SPBasePermissions.UseClientIntegration |
        SPBasePermissions.Open |
        SPBasePermissions.EditMyUserInfo |
        //============ Personal Permissions ============
        SPBasePermissions.ManagePersonalViews;
      //SPBasePermissions.AddDelPrivateWebParts |
      //SPBasePermissions.UpdatePersonalWebParts;
      webApp.Update();
      Console.WriteLine("Permisos desactivados correctamente para: " + WebAppUrl);
    });
  }
  catch (Exception ex) { Console.WriteLine(string.Format("***ERROR*** {0}|{1}", ex.ToString(), ex.StackTrace)); }
}

//funcion para activar los permisos del WebApplication de My Site
private static void ActivarPermisos(string WebAppUrl)
{
  try
  {
    SPSecurity.RunWithElevatedPrivileges(delegate()
    {
      //instancia el objeto WebApplication
      SPWebApplication webApp = SPWebApplication.Lookup(new Uri(WebAppUrl));
      //definie los permisos del obejto WebApplication
      webApp.RightsMask = SPBasePermissions.FullMask;
      webApp.Update();
      Console.WriteLine("Permisos activados correctamente para: " + WebAppUrl);
    });
  }
  catch (Exception ex) { Console.WriteLine(string.Format("***ERROR*** {0}|{1}", ex.ToString(), ex.StackTrace)); }
}

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.