SharePoint 2010: Despliegue de elementos como páginas y otros en el Sandbox!

Las soluciones de tipo sandbox en SharePoint 2010 son muy flexibles en cuanto a que nos permiten desplegar distintos tipos de elementos en nuestros sitios de SharePoint sin necesidad de que tenga que intervenir personal de IT ya que basta conque carguemos las soluciones en la galería de soluciones de una cierta colección de sitios y las activemos posteriormente. Entre los elementos que podemos desplegar se encuentran páginas aspx, archivos javascript, páginas maestras, hojas de estilos, etc. Y la forma de desplegarlos es a través de un módulo. En la red hay un montón de ejemplos de este tipo de despliegue como los siguientes:

SharePoint2010_thumb

SharePoint 2013: Novedades en manejadores de eventos!

A nivel de manejadores de eventos, en SharePoint 2013 nos encontramos con los siguientes cambios con respecto a SharePoint 2010:

  • A nivel de soluciones Sanbox y granja, se soportan los mismos tipos de eventos.
  • En lo que al nuevo modelo de aplicaciones se refiere, se introducen los manejadores de eventos remotos:
    • Permiten a las Aplicaciones responder a eventos que tienen lugar en elementos de SharePoint como Listas o elementos de Listas.
    • Permiten reaccionar a cambios en sistemas externos: las listas externas soportan manejadores de eventos
  • Además, se introducen manejadores específicos para la gestión de aplicaciones:
    • Nos permiten responder a eventos qué tienen lugar cuando una aplicación se ha instalado, una aplicación está siendo desinstalada y una aplicación se ha actualizado.

A nivel de herramientas, la experiencia de creación de manejadores de eventos clásicos, de aplicaciones y remotos es similar…si bien nos encontraremos con ciertas peculiaridades:

  • El asistente para crear el manejador de eventos remoto es idéntico al de crear manejadores de eventos clásicos con la diferencia de qué tendremos menos eventos a manejar. Por ejemplo, no tenemos la posibilidad de crear manejadores de eventos para flujos de trabajo.
  • A nivel de estructura de proyecto, tendremos por una parte el proyecto de la aplicación en el que se crea un SPI (SharePoint Project Item).
image image
  • El SPI contiene el manifiesto con la definición del manejador: plantilla de lista a la que aplica, nombre del manejador y evento a controlar…además de indicar la Url del servicio con la lógica del workflow.
   1: <?xml version="1.0" encoding="utf-8"?>

   2: <Elements xmlns="http://schemas.microsoft.com/sharepoint/">

   3:   <Receivers ListTemplateId="100">

   4:       <Receiver>

   5:         <Name>RemoteERSampleItemAdding</Name>

   6:         <Type>ItemAdding</Type>

   7:         <SequenceNumber>10000</SequenceNumber>

   8:         <Url>~remoteAppUrl/RemoteERSample.svc</Url>

   9:       </Receiver>

  10: </Receivers>

  11: </Elements>

  • Por otra parte, tendremos el proyecto web con el servicio WCF en el qué se define la lógica del manejador remoto que pasa por implementar dos métodos:
   1: public class RemoteERSample : IRemoteEventService

   2: {

   3:     public SPRemoteEventResult ProcessEvent(RemoteEventProperties properties)

   4:     {

   5:         SPRemoteEventResult result = new SPRemoteEventResult();

   6:         //Código para eventos síncronos        

   7:  

   8:         return result;

   9:     }

  10:  

  11:     public void ProcessOneWayEvent(RemoteEventProperties properties)

  12:     {

  13:         //Código para eventos asíncronos

  14:     }

  15: }

    • ProcessEvent() que se encarga de gestionar los eventos que tienen lugar antes de qué la acción ocurra, es decir, define la lógica para eventos de tipo síncrono.
    • ProcessOneWayEvent(), que se encarga de gestionar aquellos eventos que tienen lugar después de qué la acción ocurra, es decir, define la lógica de tratamiento de eventos de tipo asíncrono.

Referencias:

SharePoint 2013: Concepto de autorización en el uso de aplicaciones!

Otra de las grandes novedades de SharePoint 2013 es que introduce el concepto autorización a través de implementar el protocolo OAuth a la hora de permitir que las aplicaciones del nuevo modelo de aplicaciones tengan permiso o no para interactuar con el despliegue de SharePoint dónde se van a instalar. Básicamente el mecanismo de autorización de SharePoint 2013 permite que los usuarios autoricen a una aplicación a actuar en su nombre sin compartir su usuario y contraseña:

  • Por ejemplo: permitir que los usuarios compartan recursos privados o datos que residen en un sito en otro sitio: lista de contactos, docs, etc
  • La clave es que los usuarios no tienen que proporcionar las credenciales cada momento.

OAuth en SharePoint 2013 proporciona “tokens” de acceso, no de “sign-in” y sólo soporta WS-Fed.

¿Cómo funciona OAuth en SharePoint? Pues de acuerdo a las siguientes puntos

  • Permite a los usuarios autorizar a SharePoint para proporcionar tokens de acceso a las aplicaciones.
  • Estos tokens se pueden usar para devolver datos de SharePoint.
  • Cada token permite acceder:
    • A un sitio específico.
    • A un recurso especifico (documentos en una carpeta).
  • Y este acceso tiene una duración definida.

Como hemos comentado, el mecanismo de autorización se utiliza a la hora de indicar si una aplicación tiene permisos o no para interactuar con SharePoint. ¿Cómos se asignan los permisos a la aplicación?

  • Durante el proceso de instalación.
  • Los permisos que necesita la aplicación se definen en el archivo de manifiesto de la misma
  • Es el usuario quien “confía” en la aplicación y asegura qué los permisos se asignen a la aplicación mientras se instala.
  • Los usuarios sólo pueden proporcionar los permisos que ellos tienen.

En cuanto a ámbitos de permisos para aplicaciones:

  • Se definen en el manifiesto de la aplicación (= que los permisos)
  • Indican en qué nivel de la jerarquía de SharePoint la aplicación está solicitando permisos:.
    • SPSite.
    • SPWeb.
    • SPList.
    • Tenancy.
    • Otros para consultas de búsqueda, acceso a los perfiles de usuario, acceso a los datos de una taxonomía, …

Los permisos que se garantizan en un cierto ámbito, aplican en todos sus “hijos”…y me explico, los permisos que se den en un ámbito de tipo SPSite aplicarán en todos los subsitios que se definan por debajo, así como en listas y elementos de listas.

Referencias

SharePoint 2013: Creación de subsitios desde la interfaz de usuario!

Siguiendo con las novedades en cuanto a uso de SharePoint se refiere, en esta ocasión vamos a ver cuál es la mecánica para crear un nuevo sitio bajo el sitio actual:

  • Tenemos que pulsar sobre el menú “Configuración” y pulsar sobre “Ver todo el contenido del sitio”.
  • La página “Contenido del sitio” muestra las aplicaciones que tenemos instaladas en el sitio actual, el listado de subsitios definidos bajo el sitio actual y un enlace “nuevo sitio” para crear nuevos sitios.
  • Si pulsamos ese enlace, seremos redirigidos a la clásica de creación de sitios de SharePoint 2013.
image image image
  • Especificamos los parámetros de creación del sitio, pulsamos “Aceptar” y al cabo de unos instantes tendremos el nuevo sitio creado.

image

SharePoint 2013: Como crear un cmdlet personalizado (I)!

En SharePoint 2013 como en la versión predecesora, es posible crear comandos PowerShell personalizados para añadir nueva funcionalidad no existente en los comandos disponibles por defecto (+ de 750). Una primera aproximación para crear un cmdlet personalizado pasa por crear un ensamblado con el cmdlet e importarlo luego en la Consola de Administración de SharePoint 2013 mediante Import-Module. En este post veremos una de las opciones posibles para crear un comando personalizado:

  • En Visual Studio 2012, creamos un proyecto de tipo “Biblioteca de clases” eligiendo como versión de .NET Framework la 4.0.
  • Añadimos las siguientes referencias al proyecto:
    • System.Management.Automation.dll, ubicada en “C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\v3.0”.
    • System.Configuration.Install.dll, ubicada en “C:\Windows\Microsoft.NET\Framework\v2.0.50727”.
    • Microsoft.SharePoint.dll, ubicada en el “..\15\ISAPI”.
    • Microsoft.SharePoint.PowerShell.dll ubicada en “C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SharePoint.PowerShell\v4.0_15.0.0.0__71e9bce111e9429c”.
  • Añadimos directivas “using” a Microsoft.SharePoint, Microsoft.SharePoint.Administration, Microsoft.SharePoint.PowerShell y System.Management.Automation.
  • Codificamos el archivo de clase de acuerdo al siguiente código:
   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:   
   6:  //Espacios de nombres necesarios
   7:  using Microsoft.SharePoint;
   8:  using Microsoft.SharePoint.Administration;
   9:  using Microsoft.SharePoint.PowerShell;
  10:  using System.Management.Automation;
  11:   
  12:  namespace CIIN.SharePoint.PowerShell
  13:  {
  14:      [Cmdlet(VerbsCommon.Get,"SPSolutionsFromSolutionStore")]
  15:      public class SPCmdletCopySolutions : SPGetCmdletBase<string>
  16:      {
  17:          protected override IEnumerable<string> RetrieveDataObjects()
  18:          {
  19:              try
  20:              {
  21:                  Console.WriteLine("Iniciando el proceso de extracción de soluciones");
  22:                  int iNumeroSoluciones = 0;
  23:                  SPSolutionCollection spColeccionSoluciones =
  24:                      SPFarm.Local.Solutions;
  25:                  Console.WriteLine("Se han encontrado {0} soluciones a extraer",
  26:                      spColeccionSoluciones.Count);
  27:                  foreach (SPSolution spSolucion in spColeccionSoluciones)
  28:                  {
  29:                      SPPersistedFile spArchivoSolucion =
  30:                          spSolucion.SolutionFile;
  31:                      spArchivoSolucion.SaveAs(spArchivoSolucion.DisplayName);
  32:                      iNumeroSoluciones += 1;
  33:                  }
  34:                  return new string []
  35:                  {
  36:                      "Proceso de extración de soluciones concluido",
  37:                      "Nº Total de soluciones extraidas: " +
  38:                      iNumeroSoluciones.ToString()
  39:                  };
  40:              }
  41:              catch (Exception ex)
  42:              {
  43:                  return new string[]
  44:                  {
  45:                     ex.Message
  46:                  };                
  47:              } 
  48:          }
  49:      }
  50:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

  • Compilamos el proyecto para comprobar que no hay errores.Ejecutamos la Consola de Administración de SharePoint 2013 y para registrar el comando en la sesión iniciada, ejecutamos la siguiente sentencia:

Import-Module “<Path_Ensamblado>\<NombreEnsamblado.dll

  • Ejecutamos a continuación el commando PowerShell que acabamos de registrar: Get-SPSolutionsFromSolutionStore.
  • Comprobamos que las soluciones se han extraido como se esperaba:
image image

SharePoint 2013: Despliegue de Aplicaciones (I)!

Una vez que tenemos creado y configurado nuestro entorno de desarrollo para crear y desplegar aplicaciones (os recomiendo revisar estos tips al respecto), no está demás conocer las opciones que tenemos para desplegar una aplicación que hayamos creada…comenzando con VS 2012:

  • VS 2012 nos provee de todo lo necesario para crear aplicaciones para SharePoint 2013: plantillas de proyecto, elementos de proyecto, … y por supuesto, un diseñador de manifiesto de aplicación que nos permita parametrizar al máximo el archivo de aplicación a desplegar.
  • VS 2012 incorpora las correspondientes opciones de despliegue de aplicaciones como podéis comprobar en la sección SharePoint de las propiedades del proyecto. Aparece una nueva opción denominada “Deploy App for SharePoint”.
  • Esta nueva opción usa los dos pasos de despliegue definidos para aplicaciones: “Install” y “Uninstall”.
image image image
  • Si desplegamos una aplicación y observamos la ventana de resultado de VS 2012, podremos ver qué el proceso de despliegue consiste en esencia en desinstalar la aplicación si ya se ha desplegado en el sitio para a continuación proceder a instalarla.
   1:  ------ Operación Compilar iniciada: proyecto: SPBasicApp, configuración: Debug Any CPU ------
   2:    Successfully created package at: C:\Users\Administrator\Documents\Visual Studio 2012\Projects\SPAppsSample\SPBasicApp\bin\Debug\app.publish\SPBasicApp.app
   3:  ------ Operación Implementar iniciada: proyecto: SPBasicApp, configuración: Debug Any CPU ------
   4:  Active Deployment Configuration: Deploy App for SharePoint
   5:  Uninstall App for SharePoint:
   6:    Retraction is in progress (00:00:00)
   7:    Retraction is in progress (00:00:01)
   8:    Retraction is in progress (00:00:02)
   9:    Retraction is in progress (00:00:03)
  10:    Retraction is in progress (00:00:04)
  11:    Successfully uninstalled the App for SharePoint.
  12:  Install App for SharePoint:
  13:    Uploading the App for SharePoint...
  14:    Installation is in progress (00:00:00)
  15:    Installation is in progress (00:00:01)
  16:    Installation is in progress (00:00:02)
  17:    Installation is in progress (00:00:03)
  18:    Installation is in progress (00:00:04)
  19:    Installation is in progress (00:00:05)
  20:    Installation is in progress (00:00:06)
  21:    Installation is in progress (00:00:07)
  22:    Installation is in progress (00:00:08)
  23:    Installation is in progress (00:00:09)
  24:    Installation is in progress (00:00:10)
  25:    Installation is in progress (00:00:11)
  26:    Installation is in progress (00:00:12)
  27:    Installation is in progress (00:00:13)
  28:    Installation is in progress (00:00:14)
  29:    Installation is in progress (00:00:15)
  30:    App was installed at http://app-747a5045ca4123.apps.domain.local/SPBasicApp/.
  31:    Successfully installed App for SharePoint.
  32:  ========== Compilar: 1 correctos o actualizados, 0 incorrectos, 0 omitidos ==========
  33:  ========== Implementar: 1 correctos, 0 incorrectos, 0 omitidos ==========

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

  • A partir de aquí, sólo resta acceder al sitio configurado en las propiedades del proyecto y comprobar que la aplicación se ha instalado y ya está lista para usar.

image

SharePoint 2010: Como importar proyectos de SharePoint de VS 2008 a VS 2010!

Cuando estamos pensando en migrar de SharePoint 2007 a 2010, una pregunta que surge en el aire es la de ¿qué pasa con mis desarrollos? ¿También se migrarán? La respuesta es que depende de factores como la forma en que hayas construido tus desarrollos en cuanto a plataforma (32 bits vs 64 bits), que hayas usado métodos o tipos del modelo de objetos que en SharePoint 2010 se han “depreciado”, de como hayas empaquetado esos desarrollos para ser desplegados en SharePoint 2007, etc. Vamos, que te puedes encontrar con dos escenarios:

  • Puedo migrar mis desarrollos sin problemas a plataforma SharePoint 2010 porque hice las cosas proveyendo los cambios que Microsoft iba a introducir en la plataforma en lo que a desarrollo se refiere: 64 bits y empaquetado de artefactos en .WSP principalmente. Aquí te diré: qué buen ojo tuviste amigo Guiño.
  • Ni por asomo pensé que Microsoft fuese a pasar de los 32 bits que normalmente todo el mundo usaba para SharePoint 2007 a sólo 64 bits para SharePoint 2010, con lo cuál te diré: mala suerte amigo, a recompilar todo y cruzar los dedos para que te funcione en SharePoint 2010.

Sin embargo, no todo está perdido y si has para desarrollo en SharePoint 2007 utilizaste las Visual Studio Extensions para WSS (que curiosamente no estaban soportadas de forma oficial por Microsoft) podrás migrar tus soluciones de una forma automatizada gracias a esta extensión para Visual Studio 2010. Puedes ver un ejemplo bastante completo de como importar proyectos de SharePoint de Visual Studio 2008 a Visual Studio 2010.

SharePoint2010_thumb

SharePoint 2010: Como activar programáticamente el rating o clasificación de contenidos!

Hace tiempo preguntaban en este thread del foro de desarrollo de SharePoint en torno a si es posible activar programáticamente el rating de contenidos que forma parte de SharePoint Server 2010. Por suerte, y como suele ser habitual, es posible realizar está activación como se puede comenta en los siguientes enlaces:

Fue comentarlo en el foro, y rápidamente Oscar Martín (participante habitual de los foros de SharePoint en castellano) se  puso manos a la obra para ver si las ideas comentadas le servían…por suerte así fue, y el bueno de Oscar no dudo en compartir en el foro la solución que finalmente generó para su caso particular y que os reproduzco en este artículo:

   1: private void EnableRating(SPList list) 

   2: {

   3:  

   4:   SPFieldCollection listfields = list.Fields; 

   5:   SPFieldCollection availfields = list.ParentWeb.AvailableFields;

   6:  

   7:   if (!listfields.Contains(FieldId.AverageRatings)) 

   8:   { 

   9:     SPField field = availfields[FieldId.AverageRatings]; 

  10:     list.Fields.AddFieldAsXml(field.SchemaXmlWithResourceTokens, true,SPAddFieldOptions.AddFieldToDefaultView | SPAddFieldOptions.AddFieldInternalNameHint | SPAddFieldOptions.AddToAllContentTypes); 

  11:   }

  12:  

  13:   if (!listfields.Contains(FieldId.RatingsCount) && availfields.Contains(FieldId.RatingsCount)) 

  14:   { 

  15:     SPField field2 = availfields[FieldId.RatingsCount]; 

  16:     list.Fields.AddFieldAsXml(field2.SchemaXmlWithResourceTokens, false,SPAddFieldOptions.AddFieldInternalNameHint | SPAddFieldOptions.AddToAllContentTypes); 

  17:   } 

  18:     list.Update(); 

  19:  }

SharePoint 2013: Problemas en la integración con SSRS 2012 (I)!

Como es lógico, cuando un producto está en beta (o ya en RTM), a veces te encuentras con errores que no te esperas y que te llevan a preguntarte: “y ahora que c… pasa”….digo a solucionarlo. Bueno, pues esto es lo que me pasó el otro día probando la integración de SharePoint 2013 y SSRS 2012 que tengo que decir que no está del todo fina lo que no deja de sorprenderme si tenemos en cuenta que la integración de SharePoint 2010 SP 1 y SSRS 2012 funciona a las mil maravillas. El caso es qué tras configurar la integración, crear y publicar un primer informe en un sitio de SharePoint, me encontré con este error tan majo al visualizar el error:

  • Error al procesar el informe. (rsProcessingAborted)
    • No se puede suplantar al usuario para el origen de datos ‘dsAdventureWorks’. (rsErrorImpersonatingUser)
      • No se pueden convertir las notificaciones de identidad al símbolo (token) de Windows. (rsClaimsToWindowsTokenError)
      • No se puede recuperar una identidad de Windows válida.

No se pudo distribuir el mensaje porque el servicio en la dirección de extremo ‘net.pipe://localhost/s4u/022694f3-9fbd-422b-b4b2-312e25dae2a2’ no está disponible para el protocolo de la dirección.

En este caso, la solución al problema es sencilla y pasa por iniciar el servicio Notificaciones del Servicio de Token de Windows dese la Administración Central o PowerShell y que en mi caso estaba parado. Tras iniciarlo, el informe publicado se muestra sin problemas.

image

SharePoint 2013: Cambios en la experiencia de acceso a sitios (I)!

A nivel de experiencia de usuario, SharePoint 2013 viene con algunas novedades que mejoran a la versión predecesora. Una de ellas es la experiencia de usuarios no autorizados a sitios a los que no tienen acceso. En lugar de mostrarse la típica página de “Acceso denegado” se les da la posibilidad de solicitar acceso a dicho sitio:

  • Cuando el usuario intenta acceder a un sitio en el que no tiene acceso, se muestra una página en la que puede solicitar acceso explicando el motivo por el que solicita acceso. Una vez que se pulsa “Enviar solicitud”, se le notifica al administrador de la colección de sitios por correo electrónico y se registra en la lista de solicitudes de acceso.
  • En la misma página se muestra una barra indicando que la solicitud está en espera de aprobación y la página muestra el mensaje enviado en la solicitud.
  • Nos validamos en el sitio con un usuario administrador y nos vamos a la página de configuración. Bajo la sección “Usuarios y personas”, pulsamos sobre el enlace “Solicitudes de acceso a invitaciones”.
image image image
  • A continuación accedemos a la página “Solicitudes de acceso” dónde vemos el listado de personas (o usuarios) que han solicitado acceso al sitio.
  • A través del menú contextual de un usuario, podemos aprobar o rechazar su solicitud.
  • Cualquiera de las dos acciones hace que el usuario desaparezca de la lista de solicitudes.
image image image
  • Si rechazamos una solicitud e intentamos acceder de nuevo al sitio con el mismo usuario, veremos que en la página de solicitud se indica que se ha rechazado su petición de acceso.
  • Por supuesto, podemos volver a solicitar de nuevo acceso al sitio.
image image