Migración de perfiles en SharePoint 2010

diciembre 26, 2011
By

En esta entrega estaremos debatiendo sobre la migración de perfiles en SharePoint 2010 así como los problemas que pueden suceder por el camino. Migrar un perfil se hace necesario en los siguientes escenarios:

  1. Se renombró el usuario en el Active Directory: En este caso habría que migrar el perfil desde CONTOSO\juan hacia CONTOSO\juancito ya que el primer login no existe más. Si la migración no se hace, SharePoint automáticamente creará un nuevo perfil y se tendrían dos perfiles diferentes.
  2. Se borró un usuario accidentalmente en el Active Directory y se recreó: Como el SID del nuevo usuario es diferente, hay que hacer una migración del perfil para que SharePoint no agregue un nuevo perfil.
  3. Se cambió de proveedor de autenticación (Claims Based Authentication): Como todos sabréis en SharePoint 2010 es posible validarse desde diferentes proveedores de autenticación siguiendo el enfoque basado en Claims (en concreto de tres formas diferentes: a través de Windows/Active Directory, utilizando validación por Forms y finalmente a través de SAML SSO). El problema consiste en que el login es diferente en cada escenario, aunque sea el mismo usuario, por ejemplo, i:0#.w|contoso\juan sería un identificador cuando se utiliza la autenticación de windows y i:0e.t|sts provider|juan@contoso.com cuando se configura ADFS (Active Directory Federation Services). Desde el punto de vista de SharePoint son usuarios diferentes con dos perfiles diferentes.

El tercer escenario es probablemente el más complejo. Si se desactiva la autenticación de Windows y se deja solamente el Trusted Provider, se tendría un único perfil, pero no se recomienda hacer esto ya que existen servicios como el buscador que dependen de la autenticación de Windows. Entonces, en este caso, se hace necesario migrar el perfil de la identidad de Windows hacia la identidad del Trusted Provider, de forma tal que el usuario pueda validarse utilizando el IP-STS (Identity Provider Secure Token Service) y acceder a su perfil, pero si se valida utilizando autenticación de Windows, pues que la opción de acceder al perfil no aparezca para que no haya duplicidad.

Migrar un perfil es relativamente sencillo en SharePoint 2010 ya que disponemos de un Cmdlet de PowerShell Move-SPUser que hace precisamente esta operación. Primeramente hay que iniciar la consola “SharePoint 2010 Management Shell” (Menú Inicio –> Microsoft SharePoint 2010 Products) que es un entorno PowerShell que incorpora los Cmdlets de SharePoint. Un ejemplo de uso sería el siguiente:

Get-SPUser -web http://sp2010 -identity "i:0#.w|contoso\juan" | Move-SPUser -identity "i:0e.t|sts provider|juan@contoso.com" –ignoresid

Como se muestra en el ejemplo, se accede al farm http://sp2010 en este caso, se obtiene el usuario i:0#.w|contoso\juan y luego se transforma en "i:0e.t|sts provider|juan@contoso.com". Note que hay un parámetro –ignoresid que hace el trabajo del cambio de SID.

El post Painless user migration in SharePoint 2010 brinda un script en PowerShell para automatizar este proceso… aunque no es tan “painless” ya que pueden ocurrir errores graves… realmente recomiendo hacer un Backup antes de realizar cualquier migración. Por ejemplo:

ADVERTENCIA! El Cmdlet Move-SPUser tiene que ejecutarse con una cuenta que sea administrador del farm, ya que si se ejecuta con una cuenta con solo permisos de administración, se realizará la migración de la identidad del usuario pero el perfil de sharepoint quedará en un estado inconsistente, con la identidad anterior y se mostrará el siguiente error:

Move-SPUser : Value cannot be null.
Parameter name: userProfileApplicationProxy

¿Cómo se resuelve esta inconsistencia entre la identidad y el perfil?

Con SharePoint nunca se sabe; el “susto” está a la vuelta de la esquina. Cuando se tiene un farm en producción con más de mil usuarios donde la mayoría utilizan el perfil y se hace necesario hacer una migración masiva de autenticación de Windows hacia SAML, pues no tiene ninguna gracia que ocurra ese error (Y créanme que no da gracia ya que me pasó tal y como se los cuento). Vamos que si el comando tuviese una suerte de transacción en donde si da el error se hace rollback y no se modifica nada pues todos seríamos felices, pero la verdad es otra.

Bueno, encontré dos soluciones que no sé si son las mejores pero me resolvieron el problema:

  1. Utilizar programáticamente el Object Model para listar los perfiles y cambiar la propiedad AccountName (que es por donde se mapea perfil con identidad) o hacerlo manualmente a través de la interfaz gráfica de la administración central (uno a uno).
  2. Acceder directamente a la Base de Datos que almacena los perfiles de SharePoint y hacer algunos cambios.

Note que lo primero que dice Microsoft es que NO TOQUEN LA BASE DE DATOS por lo que cada cual bajo su responsabilidad.

Bueno, lo primero consiste en acceder a la Administración Central, User Profile Service Application y entramos en Manage User Properties. Luego accedemos a Account Name y le damos Edit como muestra la figura.

image

El objetivo es hacer la propiedad AccountName editable, ya que de otra forma obtendríamos el error “Property not editable: This property can not be modified” cuando cámbiesenos el valor. Para ello se debe activar la opción “Allow users to edit values for this property”. Tenga en cuenta que esta modificación es temporal y una vez que hayamos terminado debe desactivarse ya que esta propiedad no debería ser editable.

Luego accedemos al perfil que queremos migrar y lo editamos. Como se muestra en la imagen a continuación, el campo “Account Name” aparecerá editable. En tal lugar actualizamos a la nueva identidad y guardamos.

image

Cuando el usuario se valide con la nueva identidad, automáticamente se le mapeará el viejo perfil con esta nueva identidad. Además del campo Account Name, deberá editar el campo “Manager” y “Assistant” según le convenga.

Manualmente se pueden hacer unos usuarios, pero cuando la cantidad de usuarios es grande, es mejor hacer un programa que automatice este trabajo. A continuación mostraré algunos snippets de código que les pueden servir:

Listado 1 – Código C# que permite iterar por todos los perfiles y cambiar las propiedades AccountName, Manager y Assisstant
using (var site = new SPSite("http://sp2010"))
{
    using (SPWeb web = site.OpenWeb())
    {
        SPServiceContext context = SPServiceContext.GetContext(site);
        UserProfileManager profileManager =
			new UserProfileManager(context);
        var pEnum = profileManager.GetEnumerator();
        while (pEnum.MoveNext())
        {
            var profile = (UserProfile)pEnum.Current;
            var oldUsername = profile[PropertyConstants.AccountName]
		.Value.ToString();

            // Account
            profile[PropertyConstants.AccountName].Value =
			getmigration(oldUsername);

            // Manager
            var oldManager = profile[PropertyConstants.Manager].Value;
            if (oldManager != null)
                profile[PropertyConstants.Manager].Value =
			getmigration(oldManager.ToString());

            // Assistant
            var oldAssistant = u[PropertyConstants.Assistant].Value;
            if (oldAssistant != null)
                profile[PropertyConstants.Assistant].Value =
			getmigration(oldAssistant.ToString());

            profile.Commit();
        }
    }
}

El método getmigration(…) debe hacerlo usted ya que depende directamente de su entorno; el objetivo es convertir la identidad de un formato hacia otro (por ejemplo, el string i:0#.w|contoso\juan en i:0e.t|sts provider|juan@contoso.com).

Note que este código hace lo mismo que manualmente hicimos con el editor de perfiles del servicio de perfiles de usuario en la administración central.

Si aún desea modificar la base de datos que almacena la información de los perfiles en SharePoint, deberá acceder a la tabla UserProfile_Full que aparece en la base de datos con nombre predeterminado User Profile Service Application_ProfileDB_{guid} y hacer el cambio en la columna NTName de una identidad por otra (ejemplo i:0#.w|contoso\juan por i:0e.t|sts provider|juan@contoso.com) directamente. Esta columna es la que almacena el valor de la propiedad AccountName.

¿Y que pasa con los datos sociales y los My Site?

Bueno, nada es perfecto. Las notas se guardan en la tabla SocialComments dentro de la base de datos que contiene en su nombre el texto _SocialDB_. Cada nota está asociada a una Url mediante el campo UrlID (asociado a la tabla Urls), en donde de manera particular está escrita burdamente la URL del perfil en el momento que se creó la nota. Eso significa, que aparecerán urls al estilo de http://sp2010/my/Person.aspx?accountname=contoso%5Calejandro%20tamayo en donde aparece la identidad vieja. Habrá entonces que cambiar esos valores (quizás utilizando una expresión regular) por uno que contenga la identidad nueva en el parámetro accountname. Dejar sin modificar la lista de Urls tiene el inconveniente de que las notas hechas en el perfil quedarán “huérfanas” y cuando se le haga click, pues redireccionará a un perfil que ya no existe. Otro detalle está en el campo Title de la tabla SocialComments donde cada vez que se crea una nota en el perfil, se agrega la identidad del usuario como título; esto es solo título, por lo que no tiene mucha repercusión, pero quizás usted quiera cambiarlo al nombre completo o algún otro valor. 

Finalmente quedaría el tema del My Site. Cada My Site, es una colección de sitios independiente (usualmente bajo la url my/personal/{nombre completo}) donde el usuario es el administrador de la colección. Lo que habría que hacer es sencillo, cambiar la identidad del administrador principal por la nueva identidad. Para ello habría que iterar por las colecciones de sitios bajo la URL donde se almacenan los my sites (my/personal) y actualizar el administrador de la colección de sitios.

Con esto finalizamos la migración Sonrisa. Por supuesto sería mucho mejor que no apareciesen errores para no tener que pasar este trabajo pero bueno, como les decía, nada es perfecto. Puede que hayan algunos detalles que queden fuera (quizás problema con los links de las imágenes y temas así) pero el gordo de la migración se resolvió; lo demás será cuestión de pulir el resultado.

One Response to Migración de perfiles en SharePoint 2010

  1. Jonathan Agudelo on febrero 14, 2013 at 8:59 am

    Buenos días,

    Mi pregunta es la siguiente:

    Yo necesito crear el mismo sitio de My profile para los empleados de mi empresa, yo como hago para establecer este sitio como plantilla para todos, que por ejemplo si hago un cambio en el perfil de uno cambie en todos los perfiles, para no tener que hacerlo manualmente en cada uno. En la empresa hay 25 empleados y cada persona va tener su perfil aparte.

    Muchas 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