Office 365: ¿Se soporta las carpetas públicas en Exchange Online?

Pues la respuesta es qué no, ya que si bien la plataforma base de Exchange Online que es Exchange 2010 si que incluye soporte (opcional) de public folders, su homólogo en Office 365 no. La recomendación pasa por usar SharePoint Online (SPO) como sustitutivo de las carpetas públicas de Exchange. Podéis leer más información al respecto en:

El tablet de Microsoft ya está aquí: Microsoft Surface!

Pues eso, ayer (ya de madrugada en España) Microsoft hizo publico en Los Ángeles el misterioso anuncio que nos tenía a todos intrigados y que no es otro que la llegada del tan esperado tablet bajo la marca de Surface. La verdad es qué el “trasto” tiene una pinta estupenda como podéis ver en el video que Microsoft ha preparado al respecto:

Para conocer algún detalle más sobre el tablet de Microsoft os recomiendo este artículo de Mary-Jo Foley y el sitio oficial. Más fotos aquí.

SharePoint 2010: Como inventariar componentes en nuestro entorno (II)!

Como os comentaba en este artículo, una de las formas que tenemos para inventariar componentes en nuestro entorno de cara a una posible migración de nuestro ambiente de SharePoint es mediante el uso de STSADM y la opción enumallwebs. Si bien esta aproximación es válida para el caso de migraciones desde SharePoint 2007 a 2010, cuando hablamos de actualizar o mover instalaciones de SharePoint 2010 también podemos aprovechar la potencia que nos da Windows PowerShell y en concreto el cmdlet Get-SPWeb que nos permite obtener información similar a la que nos da enumallwebs:

  • Para conocer la sintaxis de uso de Get-SPWeb, ejecutaremos en la consola de administración de SharePoint 2010 Get-Help Get-SPWeb.
  • A partir de aquí, podemos empezar a jugar con Get-SPWeb para comenzar a inventariar artefactos. Por ejemplo, para listar las características disponibles basta con ejecutar la siguiente secuencia de comandos PowerShell:
   1: $SharePointSite=Get-SPWeb –Identity "http://demo2010a:100"

   2: $SharePointSite.Features

  • Por supuesto, la salida de la secuencia anterior se podría volcar en un archivo.
image image image

Y haciendo algo más elaborado, podemos crear un script que enumere todos las colecciones de sitios por cada aplicación web, todos los sitios por cada colección y acceder a la información de inventariado que nos permita tener todo controlado de cara a mover nuestro ambiente de SharePoint de forma exitosa.

CompartiMOSS: El # 12 ya está disponible para descarga!

Pues eso, como han comentado el amigo Gustavo y el amigo Fabián, acaba de ver la luz una nuevo número de CompartiMOSS y ya vamos por el 12 que viene lleno de artículos interesantes…desde aquí agradecer a todos los autores el contenido de calidad que han preparado. Los artículos que forman parte de este número son los siguientes:

  • Editorial
  • Desarrollo de aplicaciones Metro en Windows 8 conectadas a SharePoint (Edin Kapic)
  • Usuarios externos en SharePoint Online en Office 365 (Alberto Diaz Martin)
  • Novedades en Desarrollo para SharePoint Onpremise y Online con Visual Studio 2012 RC (Juan Carlos González Martín )
  • Exposición de un sitio web con autenticación por claims usando ADFS – Parte 2 (Diego Gatti)
  • 10 puntos para entender a Project Server 2010 (Juan Pablo Pussacq Laborde)
  • Entrevista con Vielka Rojas
  • River, el foro avanzado de SharePoint (Luis Máñez)
  • Movimiento de documentos a gestor documental (DMS) desde SharePoint 2010 (Angel Suárez Guisuraga)
  • ALM y SharePoint (I) (David Martos)
  • Introducción a PowerView sobre SharePoint 2010 (Pablo Álvarez Doval)
  • Diseño de Granjas de Servicios: Gobernabilidad de SharePoint para Corporaciones y Naciones (Juan Andrés Valenzuela Jofré )
  • Metadatos Administrados en SharePoint 2010 (Carlos Ariel Dantiags)
  • ControlPoint – Explora, Protege, Analiza y Controla (Tony Carballo)

Se puede descargar desde el sitio de SkunkWorks (http://www.gavd.net/servers/compartimoss/compartimoss_main.aspx) o visite el sitio de CompartiMOSS en Facebook (http://www.facebook.com/group.php?gid=128911147140492). Como siempre, desde la dirección de la revista os invitamos a colaborar en la misma con nuevos artículos en torno a SharePoint y tecnologías y plataformas afines.

SharePoint 2010: ¿Se soporta la integración de Reporting Services con SQL Server Express?

Pues siempre había pensado que la respuesta era que sí, lamentablemente preparando alguna demo para el webcast sobre SharePoint Foundation 2010 de la semana que viene y tras pegarme un par de “leches” configurando la integración de un SQL Server Express + Advanced Services, me puse a investigar los errores infames que me daba la configuración de integración y llegue a esta referencia en la que claramente se afirma que no esta soportado…vaya #fail, y os dejo el bonito error en la página de configuración de los parámetros de integración:

image

SharePoint 2010: Añadiendo propiedades a la Toolpart (IV)!

Siguiendo con la serie de posts sobre como añadir propiedades a la toolpart de configuración de una WebPart, en esta ocasión vamos a ver como añadir estas propiedades a través de la definición de una clase de tipo EditorPart. Pero antes de empezar, os dejo la referencia a los artículos previos de la serie:

El ejemplo que os voy a comentar es relativo a como crear una EditorPart para poder definir propiedades personalizadas que luego se utilicen en una WebPart de tipo visual (para una WebPart de tipo clásico la filosofía es la misma). Lo primero que tenemos que tener claro es que una Editor Part no es más que un control hospedado en una zona de WebParts específica denominada EditorZone, es decir, a todos los efectos es como una WebPart sólo que hereda de la clase base EditorPart. Es esta clase la que proporciona el vínculo  entre la WebPart en cuestión y la EditorPart asociada. Para poder añadir propiedades personalizadas a nuestra WebPart a través de una EditorPart:

  • En primer lugar, en la clase que representa nuestra WebPart tenemos que sobreescribir el método CreateEditorParts() que es el que nos permite devolver una o varias EditorParts que interactúen con nuestra WebPart. Este método devuelve una colección de EditorParts Además, habitualmente se añade una propiedad de tipo WebBrowsableObject que devuelve la instancia de WebPart actual.
   1: public override EditorPartCollection CreateEditorParts()

   2: {

   3:     List<EditorPart> epEditorParts = new List<EditorPart>();

   4:     epEditorParts.Add(new FContactoToolPart());

   5:     return new EditorPartCollection(epEditorParts);

   6: }

   7:  

   8: object IWebEditable.WebBrowsableObject

   9: {

  10:     get { return this; }

  11: }

  • Creamos una clase que herede de EditorPart y en la que configuraremos los elementos que queremos añadir a la Toolpart de nuestra WebPart, es decir, tanto la distribución de las propiedades que formarán parte del la ToolPart, como el tipo de la misma y cualquier otra información adicional:
    • Esta configuraciones las realizaremos en el método CreateChildControls(). Por ejemplo, una parte de implementación tipo sería la siguiente:
   1: /// <summary>

   2: /// Añade los controles de la ToolPart

   3: /// </summary>

   4: protected override void CreateChildControls()

   5: {

   6:     ////******************************************

   7:     ////Tabla

   8:     ////******************************************       

   9:     tblContenedor = new Table();

  10:  

  11:     //Fila para la Url de la Intranet

  12:     tblRow = new TableRow();

  13:  

  14:     //Etiqueta para la Url de la Intranet

  15:     tblCell=new TableCell();

  16:     tblCell.Controls.Add(new LiteralControl("Url de la Intranet"));

  17:     tblRow.Cells.Add(tblCell);

  18:  

  19:     //Caja de texto para la Url de la Intranet

  20:     txtIntranetUrl = new TextBox();

  21:     txtIntranetUrl.ID = "txtIntranetUrl";

  22:     txtIntranetUrl.Text = wpOrigen.IntranetUrl.ToString();

  23:     tblCell = new TableCell();

  24:     tblCell.Controls.Add(txtIntranetUrl);

  25:     tblRow.Cells.Add(tblCell);

  26:  

  27:     //Añadimos la fila a la tabla                    

  28:     tblContenedor.Rows.Add(tblRow);

  29:  

  30:     //Fila para la Url de la Web

  31:     tblRow = new TableRow();

  32:  

  33:     //Etiqueta para la Url de la Web

  34:     tblCell = new TableCell();

  35:     tblCell.Controls.Add(new LiteralControl("Url de la Web"));

  36:     tblRow.Cells.Add(tblCell);

  37:  

  38:     //Caja de texto para la Url de la Web

  39:     txtWebUrl = new TextBox();

  40:     txtWebUrl.ID = "txtWebUrl";

  41:     txtWebUrl.Text = wpOrigen.WebUrl.ToString();

  42:     tblCell = new TableCell();

  43:     tblCell.Controls.Add(txtWebUrl);

  44:     tblRow.Cells.Add(tblCell);

  45:  

  46:     //Añadimos la fila a la tabla

  47:     tblContenedor.Rows.Add(tblRow);

  48:  

  49:     //Añadimos la tabla a la colección de controles

  50:     this.Controls.Add(tblContenedor);  

  51:  

  52:     base.CreateChildControls();

  53: }

    • A continuación lo que se suele hacer es añadir implementaciones de los métodos ApplyChanges() y SyncChanges() que permiten guardar cambios realizados en la WebPart editada o bien cargar datos de configuración de la misma:
   1: /// <summary>

   2: /// Aplica los cambios realizados en la Toolaprt

   3: /// </summary>

   4: /// <returns></returns>

   5: public override bool ApplyChanges()

   6: {

   7:     EnsureChildControls();

   8:     FContactoCIINWP wpOrigen = 

   9:         (FContactoCIINWP)this.WebPartToEdit;

  10:                         

  11:     if (!string.IsNullOrEmpty(Page.Request.Form[txtIntranetUrl.UniqueID]) &&

  12:         !string.IsNullOrEmpty(Page.Request.Form[txtWebUrl.UniqueID]))

  13:         if (txtIntranetUrl.Text!="" && txtWebUrl.Text!="")

  14:         {

  15:             wpOrigen.IntranetUrl = txtIntranetUrl.Text;

  16:             wpOrigen.WebUrl = txtWebUrl.Text;

  17:             return true;

  18:         }

  19:  

  20:     return false;

  21: }

  22:  

  23: /// <summary>

  24: /// Sincroniza los cambios realizados!

  25: /// </summary>

  26: public override void SyncChanges()

  27: {

  28:     EnsureChildControls();

  29:     FContactoCIINWP wpOrigen = (FContactoCIINWP)this.WebPartToEdit;

  30:     txtIntranetUrl.Text = wpOrigen.IntranetUrl.ToString();

  31:     txtWebUrl.Text = wpOrigen.WebUrl.ToString();

  32: }

  • Y con esto y un bizco…digo, el resultado obtenido sería como sigue:

image

SUGES: Disponibles los materiales del chat de expertos!

Ya tenéis disponibles en SUGES para descarga los materiales (video en este caso) del chat de expertos de SharePoint que realizamos ayer. Del mismo modo, podéis descargaros la grabación del chat anterior desde este enlace. Agradecer a los compañeros del metal (Gustavo, Fabián, Mario, André, Alberto y David) su participación en el chat y a los asistentes por las preguntas realizadas. Aprovecho el post para comentar algunas de las cuestiones que se plantearon y dejar registro de la solución a las mismas (o al menos el camino a mirar):

  • Escaneo de documentos hacía SharePoint, hay varias alternativas disponibles como:
  • Alta disponibilidad en SharePoint 2010, cero tiempo de caída y de pérdida de información sensible. Aquí la idea es usar Clustering a nivel de SQL Server, Mirroring o bien una combinación de ambos. Algo que no se comentó en el chat es el uso de Log Shipping, la definición conceptual de estos términos es la siguiente:
    • Clustering, es decir, configure un “failover cluster” a nivel de SQL Server que se define como una combinación de uno o más nodos o servidores y uno o más discos compartidos configurados como si se tratase una única máquina física, pero con capacidad de respuesta a fallos entre los nodos del clúster de manera que si uno de los nodos cae, automáticamente entra en funcionamiento otro de los nodos disponibles y de forma agnóstica para SharePoint 2010 que ve el clúster como un conjunto sin considerar las particularidades de su implementación.
    • Mirroring, que al contrario que en el caso de Clustering implica disponer de un servidor principal de BD’s y otro Espejo al que se envían las transacciones desde el servidor principal. En un escenario de alta disponibilidad de SQL Server con Mirroring, se dispone de un servidor testigo que continuamente monitoriza la salud del servidor principal de manera que si este cae, le cede el testigo al servidor espejo de manera que la granja de SharePoint 2010 no se resienta y continúe funcionando de manera ininterrumpida (es cuestión de segundos el paso del testigo). Además de este mecanismo para proporcionar alta disponibilidad, la técnica de Mirroring proporciona redundancia de BD’s de contenidos y de configuración así como para muchas de las BD’s de las aplicaciones de servicio de SharePoint 2010.
    • Log Shipping, que permite realizar copias de seguridad el log de transacciones de una instancia principal de SQL Server de forma regular en una o varias instancias secundarias de SQL Server.

Lo habitual en despliegues de alta disponibilidad de SharePoint 2010 es usar alguna de estas técnicas, cada una con sus ventajas e inconvenientes, e incluso combinarlas (mecanismos híbridos para garantizar la alta disponibilidad y que aprovechen lo mejor de cada técnica). Al final se trata de buscar un equilibrio entre el coste y la garantía de unos tiempos de recuperación mínimos de servicio y de datos. Si estos tiempos se quieren minimizar, será a base de aumentar el coste. Si el coste no se quiere disparar, entonces tendremos unos tiempos de recuperación peores. Algunas referencias al respecto:

   1: function PreSaveAction() 

   2: {

   3:  

   4:     //Variables de comprobación

   5:     var bDataValid=false;

   6:     if (//Comrpobar datos) {

   7:         //Lógica adicional de comprobación

   8:         bDataValid = true;

   9:     }

  10:  

  11:  

  12:     if (bDataValid==false) {

  13:         alert("Datos introducidos no correctos");

  14:         return false;

  15:     }

  16:  

  17:     return true;  // OK para realizar el guardado

  18: }

Y en principio estas fueron algunas de las cuestiones más relevantes. Como comenté en el WebCast, os animo a plantear las dudas que tengáis en torno a SharePoint en los foros o bien contactado con nosotros directamente:

image