jueves 2 de julio de 2009

Bitácora de Recuperación de un Servidor de SharePoint Server 2007 por error en los servicios de Búsqueda

Nivel: Avanzado.  Ya haya realizado recuperaciones de Servidor SharePoint 2007.

Antecedentes:

Todo empezó con el siguiente error de los servicios de búsqueda de SharePoint en el servidor.  El error era el siguiente:

Event Type:    Error
Event Source:    Office SharePoint Server
Event Category:    Servicios compartidos de Office Server
Event ID:    6482
Date:        6/26/2009
Time:        3:44:41 PM
User:        N/A
Computer:    SERVER NAME
Description:
No se pudo ejecutar el trabajo de administración del servidor de aplicaciones para la instancia de servicio Microsoft.Office.Server.Search.Administration.SearchServiceInstance (88adad9f-110e-4b6b-b166-a4ca60c522b5).

Motivo: La cadena de conexión de base de datos no está disponible. 

Detalles de soporte técnico:
System.Runtime.InteropServices.COMException (0xC0041228): La cadena de conexión de base de datos no está disponible. 
   at Microsoft.Office.Server.Search.Administration.SearchApi.RunOnServer[T](CodeToRun`1 remoteCode, CodeToRun`1 localCode, Boolean useCurrentSecurityContext, Int32 versionIn)
   at Microsoft.Office.Server.Search.Administration.SearchApi.AddApp(Role role)
   at Microsoft.Office.Server.Search.Administration.SearchServiceInstance.InstallGathererApplicationIf()
   at Microsoft.Office.Server.Search.Administration.SearchServiceInstance.Synchronize()
   at Microsoft.Office.Server.Administration.ApplicationServerJob.ProvisionLocalSharedServiceInstances(Boolean isAdministrationServiceJob)

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.

A pesar de instalar el HotFix 946517 que les reportó a mis amigos lectores no corrigió el problema.

Luego revisando mas a detalle el visor de evento encontré el siguiente error:

Event Type:    Error
Event Source:    MSSQLSERVER
Event Category:    (2)
Event ID:    17310
Date:        6/26/2009
Time:        3:51:59 PM
User:        N/A
Computer:    SERVER NAME
Description:
A user request from the session with SPID 63 generated a fatal exception. SQL Server is terminating this session. Contact Product Support Services with the dump produced in the log directory.

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
Data:
0000: 9e 43 00 00 14 00 00 00   ?C......
0008: 0c 00 00 00 56 00 53 00   ....
0010: 52 00 2d 00 4e 00 50 00  
0018: 4f 00 52 00 54 00 41 00  
0020: 4c 00 00 00 00 00 00 00   .......

Este error reportan los foros que se corrige con el Service Pack 2.0 de SQL Server 2005 el problema es que en mi caso ya lo tenía instalado.  Y por si fuera poco este error crea unos Dump Files de 2Mb cada uno que en poco tiempo nos que damos sin espacio en disco en el servidor.  La única forma de aplacar este consumidor de espacio fue apagando los servicios de Search SharePoint Services desde la consola de Services.

A pesar que intente de todo e inclusive crear un nuevo Proveedor de Servicios Compartidos de SharePoint no dio resultado.

Cuando intentaba configurar la búsqueda de SharePoint me mostraba el siguiente error:

image

No habiendo otra opción decidí realizar la recuperación de la instalación de SharePoint.  Pero antes de empezar debemos de hacer una lista que verificaremos para tener todo listo.  A continuación la lista:

Que necesitamos tener para la instalación de un producto como SharePoint Server 2007.

Si asumimos que lo que no vamos a reinstalar es el servidor de Windows que por el momento la mayoría de instalaciones de mis clientes es Windows Server 2003 (STD,ENT,R2).

El software que necesitamos tener a la mano es:

Copia del directorio I386 (Por si requerimos re-instalar el IIS) de Windows Server 2003.

.Net Framework Redistributable V 2.0 y 3.0 Requerido por SharePoint y 3.5 Si utiliza soluciones personalizados que utilicen dicho Framework.

La media de SQL Server 2005 y su SP2.

La media de SharePoint Server 2007 y su SP1.

La data que necesitamos respaldar es:

  • Dado que no recuperaremos las bases de datos del Search, ni Mi Sitio o My Sites.  Solo realizaremos el respaldo de la base de datos de Contenido .
  • Copia de hojas de estilo, imágenes, animaciones en Flash guardadas en el directorio 12 hive SharePoint.
  • El Web.Config del portal normalmente tiene configuración personalizada que será bueno tener una copia.  Aunque no recomiendo el remplazo total del archivo, identifique lo que esta personalizado y vaya cambiando y revisando que no afecte su configuración.

 

El Procedimiento fue:

  1. Se desinstalo la granja de servidores con el asistente, se desinstalo el Software de SharePoint.
  2. Se desinstalo SQL-Server 2005.
  3. Desinstalación de Framework y Service Pack 2.0, 3.0 y 3.5
  4. Se Reinstaló el Framework 2.0 y 3.0.  Al instalar el 3.5 instaló el Service pack 1 de los Framework anteriores y requirió el reinicio del servidor (para que lo tome en cuenta).
  5. Se Instaló de nuevo incluyendo los servicios de Integración de SQL Server 2005 además del Motor de SQL y las herramientas Cliente. Ya que algunas opciones de SharePoint Server los requiere.
  6. Instalación y verificación del SP2 de SQL server 2005 se instaló exitosamente.
  7. Instalación del bits del SharePoint (Si tuvo algún error favor de revisar el siguiente artículo).
  8. Se instaló una nueva granja de Servidores.
  9. Se configuraron los servicios (monitoreando los eventos en el visor y no reportó ningún error).
  10. Se configuro el correo saliente (el ip del servidor de correo de salida, funcionalidad básica en SharePoint para enviar correos).
  11. Se creo la aplicación web puerto 80, para reservar dicho puerto para iniciar restaurando el contenido del portal.
  12. Se desconecto la base de datos de contenido.
  13. Se reinicio el IIS (Con línea de comando: IISreset )
  14. Se restauro la copia de la base de datos de contenido.
  15. Se conecto de nuevo a la aplicación del puerto 80 por medio de la línea de comando en el directorio 12 hive SharePoint. La línea de comando fue: ststadm.exe -o addcontentdb -url http://servername -databasename wss_content.
  16. Se modificó la línea que afecta los permisos de ejecución de los elementos Web a Full  de la siguiente forma: <trust level="Full" originUrl="" />
  17. Se agregaron las líneas personalizadas en el Web.Config en la sección <appSettings/>
  18. Se copiaron los assemblies en el directorio bin de la aplicación Web puerto 80. Generalmente esta ubicada en c:\inetpub\wwwroot\virtual directories\wss\80\bin.   
  19. Se realizó el deployment de la solución (fuera del alcance de este articulo).
  20. Puede verificar y encontrar que todo esta en donde debe en el portal.
  21. Se creo el Proveedor de Servicios Compartidos de SharePoint, colocando el mismo puerto para los sitios personales o My Sites. Advertencia no intente realizar el procedimiento para recuperara la base de contenido del portal para My Sites, no funciona, ya que los servicios compartidos en la aplicación de administración hacen referencia a la aplicación de My Sites y algunas cosas las configuran desde la administración de SSP a diferencia de la creencia que todo esta en My Sites.  Se ahorrará un error de la licencia de SharePoint a caducado y solo desconectando la granja actual y creándola de nuevo logrará eliminar dicho error. Así que no lo haga.
  22. Se agregaron los atributos personalizados para los perfiles utilizados en el portal.  Si hizo una importación completa de los perfiles del Directorio Activo y se programó para que se hiciera regularmente.
  23. Se hizo una carga del contenido de búsqueda y todo funcionó correctamente.

Eso es todo amigos, se que no inquirí en muchos detalles pero puede ver otros artículos que he escrito que si los tiene.  El propósito de este artículo fue dar un panorama general de una recuperación y dejar la experiencia registrará para guiar y prepararse para una recuperación de un portal  por errores del motor de búsqueda de SharePoint Services.

Espero les sirva,

Manolo Herrera

Error Event ID 11706 al intentar instalar SharePoint Server 2007 luego de haberlo desinstalado

No se equivoque como yo este error no le esta dando porque la media de instalación esta mala, ni porque faltan dichos archivos.  Es un error del producto que he encontrado luego de haber hecho una desinstalación del mismo. 

Como solucionarlo:

Encuentre los archivos con extensión “msi” que indica los errores, y ejecútelos, esto hará que los instale y que generé el siguiente error, y eso lo guiará al próximo nombre de archivo. Máximo tuve que instalar 3 archivos y luego la instalación de SharePoint Server 2007 pudo continuar. 

Donde encontrarlos basado en el nombre es fácil encontrarlos, pero aquí una guía:

\x86\WSS.es-es –> wssmui.msi

\x86\OSRCHAPP –> osrchapp.msi

 

Eso es todo amigos, los dejo con el detalle de los errores abajo:

Event Type:    Error
Event Source:    MsiInstaller
Event Category:    None
Event ID:    11706
Date:        7/2/2009
Time:        10:31:10 AM
User:        user name
Computer:    SERVER NAME
Description:
Product: Microsoft Search -- Error 1706. An installation package for the product Microsoft Search cannot be found. Try the installation again using a valid copy of the installation package 'osrchapp.msi'.

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
Data:
0000: 7b 39 30 31 32 30 30 30   {9012000
0008: 30 2d 31 30 46 43 2d 30   0-10FC-0
0010: 30 30 30 2d 30 30 30 30   000-0000
0018: 2d 30 30 30 30 30 30 30   -0000000
0020: 46 46 31 43 45 7d         FF1CE} 

Event Type:    Error
Event Source:    MsiInstaller
Event Category:    None
Event ID:    11706
Date:        7/2/2009
Time:        10:00:52 AM
User:        user name
Computer:    server names
Description:
Producto: Microsoft Windows SharePoint Services 3.0 3082 Lang Pack -- Error 1706. No se encuentra ningún paquete de instalación para el producto Microsoft Windows SharePoint Services 3.0 3082 Lang Pack. Vuelva a intentar la instalación utilizando una copia válida del paquete de instalación 'wssmui.msi'.

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
Data:
0000: 7b 39 30 31 32 30 30 30   {9012000
0008: 30 2d 31 30 31 35 2d 30   0-1015-0
0010: 43 30 41 2d 30 30 30 30   C0A-0000
0018: 2d 30 30 30 30 30 30 30   -0000000
0020: 46 46 31 43 45 7d         FF1CE} 

Hasta la próxima,

Manolo Herrera

Error event ID 18456 luego de desconectarse de una granja de servidores en SharePoint

No es un error que según la documentación se debe a falta de permisos en SQL Server en la cuenta nt_authority\system. Revise la cuenta en SQL-Server con SQL Management Studio, en propiedades de la cuenta mapee a la base de datos que indica el error. que en este caso es la “Master” y dele los permisos requeridos.

Es necesario reiniciar los servicios de SQL-Server para que corrija el error.

El detalle del error es el siguiente:

Event Type: Failure Audit
Event Source: MSSQLSERVER
Event Category: (4)
Event ID: 18456
Date: 7/1/2009
Time: 10:07:00 AM
User: NT AUTHORITY\SYSTEM
Computer: SERVER NAME
Description:
Login failed for user 'NT AUTHORITY\SYSTEM'. [CLIENT: <local machine>]

For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
Data:
0000: 18 48 00 00 0e 00 00 00 .H......
0008: 0c 00 00 00 56 00 53 00 ....
0010: 52 00 2d 00 4e 00 50 00
0018: 4f 00 52 00 54 00 41 00
0020: 4c 00 00 00 07 00 00 00 .......
0028: 6d 00 61 00 73 00 74 00 m.a.s.t.
0030: 65 00 72 00 00 00 e.r...

Solución Extrema pero efectiva: Al no corregirse decidí desinstalar SharePoint, y SQL server 2005 e instalar de nuevo. Esto si hizo desaparecer el error.

Hasta la próxima,

Manolo Herrera

miércoles 1 de julio de 2009

Peculiaridades de los permisos en SharePoint

Tipo de Audencia: Por lo menos el amigo lector haya tenido la experiencia de asignar los permisos predefinidos de SharePoint.

Pareciera que la “herencia” nos hace una mala jugada muchas veces en la Programación Orientada a Objetos según los patrones de diseño, y para la seguridad de SharePoint no es la excepción.  Aunque la motivación de SharePoint de heredar los permisos parece buena, no nos permite personalizar los sub-sitios a menos que “rompamos” o “cortemos” la herencia del sitio padre. Supongamos el siguiente caso:

Deseamos crear dentro del portal una sección de Documentación y dentro de ella por Departamento un sub-sitio, pero requerimos que la documentación de cada departamento este visible solamente al grupo de personas que se le indique. En tal caso podemos pensar que no todos tendrán acceso al sitio de documentación de cada departamento. 

La estructura de los sitios podría ser como esta:

image

Por la herencia si tenemos acceso de lectura a la colección de sitos tendremos acceso de lecturas en los demás sub-sitios, y esto no es lo deseable en este caso.  Entonces no tenemos otra alternativa que “romper” la herencia de permisos, eliminar los permisos heredados no deseables y posiblemente agregar algunos nuevos.

imageImagen de la opción de SharePoint para romper la herencia.

 

 

 

Para el primer nivel o sitio Document Center “romperemos” la herencia de la seguridad y agregaremos nuestros grupos personalizados como lo muestra la imagen de abajo:

image

Recomendaciones:

Utilice una nomenclatura estándar para el nombramiento de los grupos esto facilitará la búsqueda de los grupos y su asignación.  Esta inversión de tiempo luego tendrá sus réditos.

Póngale cuidado a los permisos de cada grupo, como lo muestra la siguiente tabla:

Administradores – Full Control

Colaboradores – Contribute

Lectores y Común - Read

El grupo SP-DOC-Común esta definido para un área común de acceso para los demás sub-sitios.

El grupo SP-DOC-Administradores para los administradores de todos los sub-sitios.  No falta alguien que debe de tener acceso a todos de “Full-Control”.

El grupo SP-DOC-Colaboradores para los responsables de subir los documentos en cada sub-sitio.

El grupo SP-DOC-Lectores para aquellas excepciones que si pueden ver todo la información de todos.

Podemos decir entonces que tendremos 6 grupos de seguridad por cada sub-sitio que representa el departamento; Uno para administradores, otro para colaboradores y el último para lectores del departamento y los tres del nivel superior. Como se muestra la imagen de abajo:

image

Adicionalmente a ello asociaremos a cada grupo de SharePoint un grupo del Directorio Activo de Windows, para que el mantenimiento de los permisos de seguridad sean responsabilidad al área de Infraestructura del departamento de IT, y lo hagan en un ambiente que conocen como lo es el Directorio Activo. 

Los nombres de los grupos en el Directorio activo serán:

    • DOC-DepartamentoX-Administradores
    • DOC-DepartamentoX-Colaboradores
    • DOC-DepartamentoX-Lectores.

image

Imagen de la creación de un grupo dentro de la consola de Grupos y Usuarios del Directorio Activo de Windows 2003.

Tip: Si esta dentro de un Bosque (Forest) defínalo local para que le permita ubicar los usuarios de diferentes dominios.

Finalmente debería obtener una lista como lo muestra la imagen de abajo:

image 

Abajo una imagen de SharePoint asignado a un usuario al grupo de SharePoint, que para este caso el usuario es un  grupo del Directorio Activo.

image

El resultado es el siguiente:

image

De tal forma que el departamento de IT, no tiene porque ingresar a SharePoint para asignar usuarios, sino desde la consola del controlador de dominio agregar los usuarios a los grupos definidos.

De esta forma podemos decir las siguientes afirmaciones:

  1. Luego de “romper” la herencia, al definir un grupo nuevo y asignarle permisos dentro del sitio.  Allí deberá asignarle los usuarios o grupos del directorio activo. Si este grupo es utilizado en otro sitio no necesitará asignar nuevamente a los usuarios miembros de dicho grupo.
  2. Ya que se definió un grupo de SharePoint y un grupo del Directorio Activo, esto me permitirá flexibilidad si cambia el directorio activo no afectará los permisos que he definido en SharePoint porque no están tan directamente relacionados.  Lo único que tendré que hacer es asignar le grupo nuevo del directorio activo o al usuario directamente al grupo de SharePoint.
  3. Aunque esta solución no es una de las recomendaciones (“romper la herencia”) de Microsoft. Cuando tenemos este tipo de requerimientos no tenemos otra manera de individualizar los permisos dentro de SharePoint.

Hasta la próxima,

Manolo Herrera

martes 23 de junio de 2009

Pasos sencillos para corregir la conversión de licencia luego de aplicado el SP2 de SharePoint Server 2007

Aunque pareciera alarmante el bug que vino con el SP2 de SharePoint Server, no lo es realmente y la corrección es muy sencilla.  Solo debe de ingresar nuevamente la llave de producto en la consola de administración de SharePoint y listo.  Abajo el detalle paso a paso:

  1. Ingrese a la administración central en el servidor de SharePoint o Central Administración.
  2. Haga clic sobre Operations.
  3. Haga clic sobre Convert Lincense Type.
  4. Ingrese su llave de producto o Product Key.
  5. Presione el botón Aceptar u OK.

Y eso es todo como lo muestra la imagen de abajo:

image

Hasta la próxima,

Manolo Herrera

miércoles 10 de junio de 2009

Tip del día: El uso del SPEncode.UrlDecode() en SharePoint

Me tope con el problema que necesitaba codificar el ID de una librería de documentos que es de tipo GUID y tiene le siguiente formato {NNNNNNNN-NNNN-NNNN-NNNNNNNN}.

Pero necesitaba pasarlo como parámetro en el URL con el siguiente formato: %7BNNNNNNNN%2DNNNN%2DNNNN%2DNNNN%2DNNNNNNNN%7D.

Al notar esto rápidamente identifiqué que estaba codificado de una forma especial, intenté con Context.Server.UrlEncode, pero me dejaba los guiones sin convertir ya que es un carácter válido... Investigando encontré que el API de SharePoint tiene una clase SPEncode para realizar este propósito. Entonces finalmente mi código quedo de la siguiente forma:

   1:      private string ObtenerListID() {


   2:              string id = null;


   3:              SPSecurity.RunWithElevatedPrivileges(delegate


   4:                 {


   5:                     using (var miWeb = SPControl.GetContextSite(Context).OpenWeb()) {


   6:                         id = miWeb.GetList(ObtenerNombreLista()).ID.ToString();


   7:                     }


   8:                 });


   9:              id = "{" + id + "}";


  10:              return SPEncode.UrlEncode(id);//Context.Server.UrlEncode(id);


  11:          }






Así que Code4Fun!,



Manolo Herrera

lunes 1 de junio de 2009

Convirtiendo un arreglo de caracteres a una cadena de caracteres

Algo que siempre me intrigó sobre esta conversión es lo fácil que se hace de la otra forma.  Es decir convertir de una cadena de caracteres a un arreglo y esto se puede hacer en una sola línea con el método Split.  Pero de la otra forma aunque también se puede hacer en una sola línea de código no es muy conocida, después de hacer mis investigaciones aquí les comparto el código:

   1: using System;



   2: using System.Linq;



   3:  



   4: namespace ArraryToString {



   5:     class Program {



   6:         static void Main(string[] args) {



   7:  



   8:             var arreglo = new[] { "Hola", "Hello", "buongiorno" };



   9:  



  10:             var cadena = String.Join(", ", arreglo);



  11:  



  12:             Console.WriteLine("Método Join: {0}\n", cadena);



  13:  



  14:             var cadena2 = arreglo.Aggregate((x, y) => x + ", " + y);



  15:  



  16:             Console.WriteLine("LinQ Way: {0}\n", cadena2);



  17:  



  18:             var arreglo2 = cadena2.Split(Convert.ToChar(","));



  19:  



  20:             foreach (var s in arreglo2) {



  21:                 Console.WriteLine("Elemento: {0}", s.Trim());



  22:             }



  23:             Console.ReadLine();



  24:         }



  25:  



  26:     }



  27: }




 


Code4Fun!,


Manolo Herrera