Cómo actualizar usuarios huérfanos en SharePoint 2007 & 2010

diciembre 1, 2009
By

Tanto en SharePoint 2007 como en la versión 2010 existe una lista especial llamada User Information List. Esta lista aparece en el ámbito de la colección de sitios y es la encargada de almacenar información relativa a los usuarios validados en SharePoint. Cuando nos validamos por primera vez en SharePoint, agregamos un nuevo usuario a algún grupo/rol o utilizamos programáticamente el método EnsureUser, SharePoint automáticamente agrega una nueva entrada al User Information List (en caso de que no exista ya) con el nombre del Usuario, el Correo y otros datos que obtiene desde Active Directory o desde las cuentas locales de Windows según como esté instalado el Servidor.

Cada Usuario en Windows tiene un identificador único llamado SID, como por ejemplo:

 
S-1-5-21-2206390045-3246304011-1536494069-1000

En el User Information List se registra el SID de cada usuario para posteriormente ser utilizado por las características de seguridad (Autenticación y Validación, ACL, etc).

Si por error, descuido o alguna otra causa borramos de Active Directory (o de las cuentas locales del Servidor) algún usuario, perdemos automáticamente el SID para dicho usuario y es a lo que nos referiremos con usuario huérfano, es decir, aquel usuario que tiene una entrada en el User Information List pero no tiene un SID válido asociado.

En Windows Server 2008 R2, el Active Directory trae la característica Papelera de Reciclaje que nos permite restaurar aquellos usuarios borrados por equivocación.

Podríamos pensar que si recreamos el usuario con el mismo nombre se resolvería el problema, pero lamentablemente no es tan trivial porque tendríamos el mismo nombre de usuario pero con un SID diferente.

Aún cuando quisiéramos olvidarnos del SID viejo y agregar manualmente el nuevo usuario a SharePoint (desde la página web) no lo lograríamos y recibiríamos el siguiente error:

The file exists. (Exception from HRESULT: 0×80070050)

SOLUCIONES TEÓRICAS:

  1. (RECOMENDADA) Actualizar en el User Information List el nuevo SID para la vieja entrada de usuario.
  2. Borrar la(s) entrada(s) en el User Information List del usuario con problemas. Esta segunda variante puede traer problemas futuros porque se perdería el tp_ID original y el usuario perdería todos sus Items guardados en SharePoint.
    Lamentablemente, utilizando las herramientas que nos brinda SharePoint, no tenemos ninguna forma de modificar el User Information List para resolver este problema. Sin embargo, podemos hacer lo que Microsoft NO RECOMIENDA y NO APOYA, que es modificar directamente la Base de Datos de SharePoint en el Servidor SQL.

He creado un programa (asistente gráfico con código fuente incluido) que nos permite resolver este problema. No obstante al ser una herramienta que modifica directamente la Base de Datos de SharePoint debe ser utilizada bajo su propia responsabilidad.
Requiere .NET Framework 2.0:

Descargar SharePoint SID Hacker (SPHackSID.zip ~ 55Kb)

A continuación explicaré lo que hace este programa para resolver el problema.

Cómo funciona SharePoint SID Hacker

El User Information List aparece virtualmente en el ámbito de la colección de sitios, pero físicamente es una tabla de SQL llamada UserInfo que contiene a todos los usuarios que se han registrado en la Aplicación Web de SharePoint a que corresponde dicha base de datos.

  • La Base de Datos SharePoint_AdminContent_[GUID] pertenece a la Web Administración Central que tiene su propio User Information List. Por ejemplo, los Administradores de la Granja (Farm Administrators) se registran en esta Base de Datos.
  • La(s) Base(s) de Datos WSS_Content y WSS_Content_[GUID] pertenecen a Sitios Web de SharePoint creados por el usuario (WSS_Content es el predeterminado).

La tabla UserInfo tiene los siguientes campos significativos:

  • tp_SiteID Identificador de la colección de sitios.
  • tp_ID autonumérico por colección de sitios que identifica al usuario.
  • tp_SystemID Es el SID del Usuario.
  • tp_Deleted Si es mayor que cero marca al usuario como eliminado.
  • tp_Login Es el login del usuario con formato DOMINIO\usuario
  • tp_Title es el nombre de usuario que se muestra en el User Information List.
  • tp_Email es el correo electrónico asociado al usuario.

La llave de esta tabla es (tp_SiteID, tp_ID) ya que los valores de este último campo se repiten (son únicos para cada colección sitio). Además hay una serie de índices únicos de los cuales el índice UserInfo_Login (tp_SiteID, tp_Login, tp_Deleted) es el causante del error The file exists. (Exception from HRESULT: 0×80070050).

El programa SharePoint SID Hacker básicamente ejecuta por cada usuario que se seleccione la siguiente consulta SQL:

 

UPDATE UserInfo SET tp_SystemID = {0} FROM UserInfo WHERE tp_Login=’{1}’

 

Donde:

  • En {0} se sustituye el SID en formato Hexadecimal.
  • En {1} se especifica el usuario que se desea modificar con formato DOMINIO\usuario

Para obtener el SID del nuevo usuario, se utiliza la Biblioteca (Wrapper) para .NET creada por Martin Budar, llamada SidTranslatorLib que básicamente utiliza las API ConvertSidToStringSid, ConvertStringSidToSid, LookupAccountName y LookupAccountSid expuestas por la DLL de Windows advapi32.dll.

    Algunos Pantallazos

    img1 img2 img3

Tags: , , ,

One Response to Cómo actualizar usuarios huérfanos en SharePoint 2007 & 2010

  1. Luis Arturo Bautista on febrero 18, 2013 at 10:17 am

    Me he reauelto el problema!

    Gracias!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Acerca del autor...

Alejandro Tamayo

Web: http://www.linkedin.com/in/atamayocastillo
Alejandro Tamayo
Professor, Researcher, Developer, Consultant and technology enthusiast. Master of Science (MSc) in Computer Science and member of Weboo Research Group.Leer completo