Script para vaciar la papelera de reciclaje secundaria

Un script que nos puede ser de utilidad es el siguiente, ya que muchas veces tenemos mucha informacion que no esta ocupando mucho espacio en base de datos, y que se encuentra en la papelera de reciclaje.

Cuando tu eliminas un contenido en SharePoint, va a la pepelera de reciclaje y si posteriormente lo eliminas de esta pepalera, el contenido, va a una secundaria…

Para ejecutar el script, lo unico que has de modificar el la url del sitio en el que quieres vaciar la papelera de reciclaje secundaria… en este ejemplo he usado “http://url_intranet”, pero deberas sustituirlo por la url de tu sitio…

$mySite = New-Object Microsoft.SharePoint.SPSite("http://url_intranet");
$papeleraQuery = New-Object Microsoft.SharePoint.SPRecycleBinQuery;
$papeleraQuery.ItemState = [Microsoft.SharePoint.SPRecycleBinItemState]::SecondStageRecycleBin;
$papeleraQuery.OrderBy = [Microsoft.SharePoint.SPRecycleBinOrderBy]::Default;
$papeleraElementos = $mySite.GetRecycleBinItems($papeleraQuery);
$Contador = $papeleraElementos.Count;
for($Elemento = 0; $Elemento -lt $Contador; $Elemento++)
{
    $unElemento = New-Object System.Guid($papeleraElementos[$Elemento].ID);
    $papeleraElementos.Delete($unElemento);
}
$mySite.Dispose()

Por ultimo y si te interesa el tema, la clase que posibilita esta funcionalidad es: Microsoft.SharePoint.SPRecycleBinQuery.

 

Modificar la propiedad NoCrawl de un campo

Se me plantea la necesidad de modificar un atributo NoCrawl, de un campo de una lista creada en base a una plantilla de lista… es algo muy sencillo, aunque parezca un trabalenguas :)

El atributo NoCrawl a nivel de SPField, indica si dicho campo puede ser reastreado por el buscador (a través de un valor buleano: TrueFalse), aqui tienes toda la informacion con respecto a esta propiedad.

En este caso, lo que se quiere es que el buscador reastee contenido almacenado en un campo, que tiene el atributo NoCrawl = True. Cambiar esto a través del modelo de objetos es una labor muy sencilla, aqui teneis un ejemplo de como podriamos modificarlo.

using (SPWeb oWebsite = SPContext.Current.Site.AllWebs["MiSitio"])
{
    SPList oList = oWebsite.GetList("Lists/Announcements/AllItems.aspx");
    SPFieldCollection collFields = oList.Fields;
    SPField oField = collFields.GetField("MiColumna");
    oField.NoCrawl = true;
    oField.Update();
    oList.Update();
}

Hay que tener en cuenta, que si quieres modificar esta propiedad en varias listas de la misma coleccion de sitios, deberas primero recorer y almacenar cual van a ser las listas que has de modificar, y posteriormente modificarlas o de lo contrario SharePoint te dará un error, ya que se esta haciendo una llamada al metodo Update de la lista…

Como enviar un email con SharePoint programaticamente

Si necesitáis enviar un email utilizando SharePoint 2010 a través de programación, tendremos que utilizar la clase  SPUtility.SendEmail, para ello y como requisito previo has de haber configurado en tu servidor/granja los parámetros necesarios en Correo electrónico saliente en:

Central Admin -> System Settings -> Configure outgoing e-mail settings

No voy a entrar en detalles, ya que la configuración de esta sección es muy sencilla…

Una vez configurado el correo, ya podrás usar la clase SPUtility.SendEmail para el envio de correos:

public static string EnviarEmail(SPWeb Web, string De, string Para, string Copia, string CopiaOculta, string Asunto, string Cuerpo, bool FormatoHTML)
{
	string emailSummary;
	var messageHeaders = new StringDictionary();
	messageHeaders.Add("to", Para);
	messageHeaders.Add("from", De);
	messageHeaders.Add("subject", Asunto);
	messageHeaders.Add("cc", Copia);
	messageHeaders.Add("bcc", CopiaOculta);
	string mimeType = "text/plain";
	if (FormatoHTML){ mimeType = "text/html"; }
	messageHeaders.Add("content-type", mimeType);
	bool sendMail = SPUtility.SendEmail(Web, messageHeaders, Cuerpo);
	if (sendMail)
	{
		emailSummary = "" + "" + Para + "" + "" + De + "" +
		"" + SPEncode.HtmlEncode(Asunto) + "" +
		"" + Copia + "" + "" + CopiaOculta + "" +
		"" + SPEncode.HtmlEncode(Cuerpo) + "" + "";
	}
	else { throw new SafException("Error al enviar el email"); }
	return emailSummary;
}

Script para borrar Colecciones de Sitio sin confirmación

Anteriormente os había habrado de como hacer un backup/restore de una Colección de Sitios en SharePoint 2010 con PowerShell, pues ahora os voy a comentar como borrar cualquier Colección de Sitio.

Este proceso es también muy rápido y sencillo y con una linea puedes llegar a borrar si Sitio que no desees:

#Elimina la Coleccion de Sitio
Remove-SPSite -Identity "http://micoleccionsitio" -GradualDelete -Confirm:$false

Hay que tener en cuenta que no existe una marcha atrás para este proceso a no ser que dispongas de una copia de seguridad.

En cuanto a la ejecución del este script sin confirmación, únicamente se debe al parámetro: -Confirm:$false. Este puede ser usando con mas objetos que implementen el uso de la propiedad -Confirm, para evitar que tengamos que interacturar con los scripts.

Script para la copia de seguridad de Colecciones de Sitio

Hola, hoy quiero mostraros como se puede hacer con PowerShell de una forma rápida y sencilla una copia de seguridad de una Colección de Sitio de SharePoint 2010, con una simple línea de código.

Esta copia lo que hace es generar un archivo fisico en el que se guarda toda la estructura e información del sitio en concreto:

#Backup de la Coleccion de Sitio
Backup-SPSite -Identity http://micoleccionsitio -Path C:\backup_micoleccionsitio.bak

Tan sencillo como la copia es la restauración:

#Restauracion de la Coleccion de Sitio
Restore-SPSite -Identity http://micoleccionsitio_nueva -Path C:\backup_micoleccionsitio.bak

Es importante tener en cuenta que cuando realizamos un backup o copia de seguridad, SharePoint deja en modo lectura la colección de sitios, por lo que no se puede hacer mientras los usuarios estén trabajando, por lo que habrá que programarlo.

Paquetes de actualizaciones de SharePoint 2010 (Cumulative Update y Services Pack)

Como SharePoint 2010 es un producto vivo, es necesario realizar un mantenimiento de este Una de las formas de identificar las diferentes versiones (niveles de parches) de SharePoint es a través de la BuildVersion del producto.

Para obtener el numero de versión, puedes seguir las indicaciones de este post: Como obtener la version de SharePoint 2010.

Aprovechando la salida este viernes pasado, del ultimo Cumulative Update del mes de Diciembre 2011, he realizado una recopilacion de todos ellos:

BuildVersion Release Objetos Afectados KB
14.0.4763.1000 RTM All components
14.0.4762.1000 RTM Farm Build Version
 
14.0.5114.5003 June 2010 CU SharePoint Foundation 2010 KB2028568
14.0.5114.5003 June 2010 CU Microsoft Shared Components KB2281364
14.0.5114.5003 June 2010 CU Microsoft SharePoint Portal KB983497
14.0.5114.5003 June 2010 CU Microsoft User Profiles KB983497
14.0.5114.5003 June 2010 CU Microsoft Search Server 2010 Core KB983497
14.0.5114.5003 June 2010 CU Microsoft Web Analytics Web Front End Components KB2204024
 
14.0.5123.5000 August 2010 CU SharePoint Foundation 2010 KB2352346
14.0.5123.5000 August 2010 CU SharePoint Server 2010 KB2352342
 
14.0.5128.5000 October 2010 CU SharePoint Foundation 2010 KB2394323
14.0.5128.5000 October 2010 CU SharePoint Server 2010 KB2394320
 
14.0.5130.5002 December 2010 CU SharePoint Foundation 2010 KB2459125
14.0.5130.5002 December 2010 CU SharePoint Server 2010 KB2459257
 
14.0.5136.5002 February 2011 CU SharePoint Foundation 2010 KB2475880
14.0.5136.5002 February 2011 CU SharePoint Server 2010 KB2475878
 
14.0.5138.5000 April 2011 CU SharePoint Foundation 2010 KB2512804
14.0.5138.5000 April 2011 CU SharePoint Server 2010 KB2512800
14.0.5138.5000 April 2011 CU Project Server 2010 KB2512801
 
14.0.6029.1000 Service Pack 1 SharePoint Server 2010 KB2460045
14.0.6029.1000 Service Pack 1 Office Web Apps KB2460073
14.0.6029.1000 Service Pack 1 Project Server 2010 KB2460047
14.0.6029.1000 Service Pack 1 SharePoint Foundation 2010 KB2460058
 
14.0.6105.5000 June 2011 CU Version 1 SharePoint Server 2010 KB2536599
14.0.6105.5000 June 2011 CU Version 1 SharePoint Foundation 2010 KB2536601
14.0.6105.5000 June 2011 CU Version 1 Project Server 2010 KB2536590
 
14.0.6106.5002 June 2011 CU Version 2 SharePoint Server 2010 KB2536599
14.0.6106.5002 June 2011 CU Version 2 SharePoint Foundation 2010 KB2536601
14.0.6106.5002 June 2011 CU Version 2 Project Server 2010 KB2536590
14.0.6105.5000 June 2011 CU Office Web Apps KB2553919
 
14.0.6109.5002 August 2011 CU SharePoint Server 2010 KB2553048
14.0.6109.5000 August 2011 CU SharePoint Foundation 2010 KB2553117
14.0.6109.5000 August 2011 CU Project Server 2010
 
14.6112.5000 October 2011 CU SharePoint Server 2010 KB2596505
14.6112.5000 October 2011 CU SharePoint Foundation 2010 KB2596508
14.6112.5000 October 2011 CU Project Server 2010 KB2596506
 
14.0.6114.5000 December 2011 CU SharePoint Server 2010 KB2597014
14.0.6114.5000 December 2011 CU SharePoint Foundation 2010 KB2597058
14.0.6114.5000 December 2011 CU Project Server 2010 KB2597015

Es recomendable visitar asiduamente la página Updates for SharePoint 2010 Products para estar al día de todas las actualizaciones publicadas por Microsoft.

 

Enlaces de mensajería instantánea

Parece una chorrada pero puede ser muy útil a la hora de crear paginas con información de contacto, o bien firmas para nuestro correo electrónico… estoy hablando de enlazar directamente con aplicaciones clientes de mensajería instantánea :)

Los protocolos de comunicación están por debajo de los protocolos generales que, cuando se usan, no se dirigen a una aplicación específica, pero abre la aplicación que se ha establecido como predeterminado para esa acción. Por ejemplo, el enlace mailto abre el cliente de correo electrónico predeterminado instalado en el equipo y por lo tanto no solo podría abrir Outlook, sino también Outlook Express, Windows Live Mail, Mozilla Thunderbird, etc …

  • Protocolo de comunicación general
Tipo de enlace Enlace Icono
E-mail mailto:you@domain.com mailto
Llamada callto:yourcallerID callto
  • Windows Live Messenger
Tipo de enlace Enlace Icono
Añadir msnim:add?contact=you@domain.com wlm add
LLamada msnim:voice?contact=you@domain.com wlm call
Chat msnim:chat?contact=you@domain.com wlm chat
Video msnim:video?contact=you@domain.com wlm video
  • Skype
Tipo de enlace Enlace Icono
Añadir skype:skypename?add skype add
Llamada skype:skypename?call skype call
Chat skype:skypename?chat skype chat
Voicemail skype:skypename?voicemail skype voicemail
Enviar archivo skype:skypename?sendfile skype send file
Información usuario skype:skypename?userinfo skype user info
  • AOL Instant Messenger (AIM)
Tipo de enlace Enlace Icono
Añadir aim:addbuddy?screenname=yourscreenname aim add
Añadir al grupo aim:addbuddy?screenname=yourscreenname&groupname=yourcompanyname aim add to group
Chat aim:goim?screenname=yourscreenname aim chat
Chat con mensaje aim:goim?screenname=yourscreenname&message=message aim chat with message
Chatroom aim:gochat?roomname=yourchatroomname aim chatroom
Enviar archivo aim:getfile?screenname=yourscreenname aim send file
  • ICQ
Tipo de enlace Enlace Icono
Añadir http://www.icq.com/people/cmd.php?uin=youruin&action=add icq add
Chat http://www.icq.com/people/cmd.php?uin=youruin&action=message icq chat
Información usuario http://www.icq.com/people/youruin icq user info
  • Microsoft Office Live Meeting
Tipo de enlace Enlace Icono
Meet http://yourlivemeetingserver.com/meet/yourloginname live meeting meet
  • Microsoft Office Communicator
Tipo de enlace Enlace Icono
Chat sip:you@domain.com office communicator chat
Llamada tel:yourphonenumber office communicator call
  • Yahoo Messenger
Tipo de enlace Enlace Icono
Añadir ymsgr:addfriend?yahooid yahoo
Llamada ymsgr:call?yahooid yahoo
Llamada telefónica ymsgr:callphone?phonenumber yahoo
Chat ymsgr:sendim?yahooid yahoo
Chat con mensaje ymsgr:sendim?yahooid&m=message yahoo
  • Google Talk
Tipo de enlace Enlace Icono
Chat gtalk:chat?jid=you@domain.com google
Llamada gtalk:call?jid=you@domain.com google


Referencia: http://www.howto-outlook.com

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.


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