MOSS: Cómo actualizar los User Profiles!

Hace un tiempo os comentaba como podemos leer User Profiles de MOSS. Como sabéis, cuando hablamos de los User Profiles de MOSS el primer punto a tener en cuenta es que MOSS a través de los Shared Services Providers (SSP), y en concreto el SSP referente a User Profiles, nos permite cargar la información de todos los usuarios de una organización de manera manual o automática definiendo un origen de importación que puede ser un DA, un recurso de DA, un directorio LDAP o bien un Business Data Catalog (BDC). Como os comentaba en aquel post, listar la información de los User Profiles es relativamente sencillo:

  • A través de crear un sitio de búsqueda específico pare personas, de manera que una vez realizada la correspondiente indexación podremos buscar usuarios concretos en el listado importado.
  • Atacando el servicio web UserProfile.asmx de nuestra máquina MOSS y mostrando el listado de usuarios en una web part o en una lista de MOSS.
  • Atacando el modelo de objetos de MOSS y mostrando el listado de usuarios en una web part o en una lista.

Por lo tanto, listar los user profiles no tiene mayor complejidad…pero, ¿se pueden actualizar los user profiles? Esta pregunta viene a raíz de un comentario que me han hecho recientemente en el blog respecto a esta cuestión. El escenario sería el siguiente: Supongamos que la información de los user profiles de una organización está almacenada en dos orígenes distintos. Por un lado, la información clave se encuentra en el directorio activo de la organización, pero por otro tenemos que hay ciertas informaciones que se encuentra en otro origen distinto como puede ser una BD SQL Server. Entonces, ¿se puede actualizar el almacén de los user profiles con la información que está almacenada en la BD SQL Server? La respuesta es que sí, y para realizarlo tendremos dos alternativas principales:

  • A través del modelo de objetos de SharePoint.
  • Atacando el servicio wbe UserProfile.asmx.

En este post os voy a mostrar como se actualizaría los datos de los user profiles utilizando el modelo de objetos de SharePoint. Empecemos.

Actualizando los user profiles de MOSS

Para demostrar como actualizar los user profiles de MOSS, lo primero que vamos a hacer es crear una BD en SQL Server que contenga los datos a actualizar. Esta BD es realmente sencilla y contendrá únicamente una tabla MD_Usuarios que almacena dicha información:

MOSS_User_Profiles_Post_4

Una vez que ya tenemos disponible la información a actualizar, vamos a crear un proyecto de aplicación de consola de C#. Necesitaremos añadir las siguientes referencias al proyecto:

using System.Web;

using Microsoft.Office.Server;

using Microsoft.Office.Server.UserProfiles;

using Microsoft.SharePoint;

using System.Data;

using System.Data.SqlClient;

MOSS_User_Profiles_Post_1  MOSS_User_Profiles_Post_3 image

Lo siguiente que haremos es definir en el código de la clase asociada a la aplicación de consola un método qe realice lo siguiente:

  • Acceda a la BD SQL Server para obtener la información de los User Profiles que no está en el Profile Store.
  • Acceda al contexto de nuestro servidor MOSS para poder instanciar el Profile Store.
  • Compruebe si la propiedad a actualizar del Profile Store tiene un valor nulo o no. En caso de tener un valor nulo, se actualiza con el valor almacenado en la BD.

El código necesario para realizar lo anterior es el siguiente (os adjunto el código completo):

using System;

using System.Collections.Generic;

using System.Text; 

//Espacios de nombres necesarios!

using System.Web;

using Microsoft.Office.Server;

using Microsoft.Office.Server.UserProfiles;

using Microsoft.SharePoint;

using System.Data;

using System.Data.SqlClient; 

namespace CIIN_MOSSUserProfiles_Service

{

    class Program

    {

        //Constants needed

        const string SPS_SITIO = “http://litwaredemo”;

        const string PROFILE_PROPERTY_DEPARTMENT = “Department”;

        const string sCadenaConexion =

            “Data Source=localhost;Initial Catalog=BD_Usuarios;Integrated Security=True”;

        const string sQuery = “Select * from MD_Usuarios”;

        //***************************************************

        //Campos Ususario BD

        //***************************************************

        const string CAMPO1_USER = “sAccountName”;

        const string CAMPO2_USER = “sDepartment”; 

        static void Main(string[] args)

        {                   

            UpdateUserProfile();

            Console.ReadLine();

        } 

        public static void UpdateUserProfile()

        {

            //********************************************************************

            //Data connection!

            //********************************************************************

            SqlDataAdapter sqldaAdaptador =

                new SqlDataAdapter(sQuery, sCadenaConexion);

            DataTable dtUsuarios = new DataTable();

            sqldaAdaptador.Fill(dtUsuarios); 

            using (SPSite spsSitio=new SPSite(SPS_SITIO))

            {

                //********************************************************************

                //Server Context!

                //********************************************************************

                ServerContext scContexto =

                    ServerContext.GetContext(spsSitio);

                UserProfileManager upmProfiles =

                    new UserProfileManager(scContexto);

                UserProfile upProfile;  

                foreach (DataRow drFila in dtUsuarios.Rows)

                {

                    upProfile =

                        upmProfiles.GetUserProfile(drFila[CAMPO1_USER].ToString());                   

                    if (upProfile[PROFILE_PROPERTY_DEPARTMENT].Value == null)

                    {

                        upProfile[PROFILE_PROPERTY_DEPARTMENT].Value = drFila[CAMPO2_USER];

                        upProfile.Commit();

                        Console.WriteLine(“Se ha actualizado la propiedad {0} del usuario {1}”,

                            PROFILE_PROPERTY_DEPARTMENT, drFila[CAMPO1_USER].ToString());

                    }

                    else

                    {

                        Console.WriteLine(“No se ha actualizado la propiedad {0} del usuario {1}”,

                            PROFILE_PROPERTY_DEPARTMENT, drFila[CAMPO1_USER].ToString());

                    }

                }             

            }

        }

    }

}

Sin más, lo que hace el código anterior es consultar la tabla MD_Usuarios de la BD y para cada fila devuelta va a buscar el correspondiente user profile en el objeto Profile Manager definido. Para cada user profile encontrado, se comprueba si la propiedad a actualizar tiene un valor nulo o no. En caso de tener un valor nulo, se actualiza con el valor de la propiedad almacenado en la BD. Sin más, aquí os dejo los consiguientes pantallazos en los que se puede apreciar que todo ha ido como la seda 😉

MOSS_User_Profiles_Post_7 MOSS_User_Profiles_Post_5 MOSS_User_Profiles_Post_6

Espero que el post os haya parecido interesante.

Publicado por

Juan Carlos González

Juan Carlos es Ingeniero de Telecomunicaciones por la Universidad de Valladolid y Diplomado en Ciencias Empresariales por la Universidad Oberta de Catalunya (UOC). Cuenta con más de 12 años de experiencia en tecnologías y plataformas de Microsoft diversas (SQL Server, Visual Studio, .NET Framework, etc.), aunque su trabajo diario gira en torno a SharePoint & Office 365. Juan Carlos es MVP de Office Servers & Services desde 2015 (anteriormente fue reconocido por Microsoft como MVP de Office 365 y MVP de SharePoint Server desde 2008 hasta 2015), coordinador del grupo de usuarios .NET de Cantabria (Nuberos.Net, www.nuberos.es), co-fundador y coordinador del Grupo de Usuarios de SharePoint de España (SUGES, www.suges.es), así como co-director de la revista gratuita en castellano sobre SharePoint CompartiMOSS (www.compartimoss.com). Hasta la fecha, ha publicado 8 libros sobre SharePoint & Office 365 y varios artículos en castellano y en inglés sobre ambas plataformas.

7 comentarios en “MOSS: Cómo actualizar los User Profiles!”

  1. Buenos días!

    Durante la última semana se nos planteo la misma pregunta, ¿Es posible actualizar los user profiles? Puesto que queríamos incluir la URL de la foto para cada usuario.

    Justamente, la misma semana publicas un post acerca de como hacerlo! je je je tiene gracia…

    Ahora ya metidos en faena, crees que atacar directamente a la base de datos de contenidos es la mejor manera?

    He echado un vistazo rápido por la MSDN y he encontrado lo siguiente:

    //get portal site context from topology
    string strUrl = “http://SampleName”;
    TopologyManager tm = new TopologyManager();
    PortalSite ps = tm.PortalSites[new Uri(strUrl)];
    PortalContext pc = PortalApplication.GetContext(ps);

    //initialize user profile config manager object
    UserProfileManager upm = new UserProfileManager(pc);
    //create user sample
    string sAccount = “mydomain\myalias”;
    if (!upm.UserExists(sAccount))
    upm.CreateUserProfile(sAccount);

    //to set prop values on user profile
    UserProfile u = upm.GetUserProfile(sAccount);
    string sPropName = “PreferredName”;
    u[sPropName] = sAccount;
    u.Commit();

    Con lo cual tambien parece que es posible actualizar los user profiles utilizando el modelo de objetos de MOSS.

    ¿No crees que seria mas adecuado?

    Un Saludo!!!

  2. Hola Fernando,
    Si te fijas estoy haciendo lo mismo…no estoy atacando la BD de contenidos directamente, lo que estoy haciendo es coger los datos a actualizar de una BD externa y luego con el modeo de objetos realizar la actualización. Fíjate en el post que yo propongo dos formas principales de hacerlo:
    – Mediante el OM de MOSS.
    – Mediante el servicio web UserProfile.asmx
    Una tercera es la que comentas, atacando directamente la BD de contenidos…pero esta opción no es recomendable, recuerda que en SharePoint siempre nos quedamos en la capa de metadatos que se monta por encima de la BD de contenidos.

    Un saludo y gracias por el comentario

    JC’s

    p.d: Muy curiosos los objetos PortalSite y TopologyManager que usas en tu código 😉

  3. La verdad Carlos es que me has ayudado mucho, en verdad te lo agradezco, muchas gracias por el tiempo destinado a satisfacer mi consulta, el post está maravilloso,solo me queda probarlo, insisto, muchas gacias por tu dedicacion y tiempo.

    Atte.

  4. Hola!
    Nada Fernando, y me parece estupendo que os hayáis animado a escribir sobre MOSS en Solvay…os seguiré de cerca, que seguro que tenéis muchas cosas interesantes que contar.

    Alberto, nada para eso estamos…espero que te sirva el how-to.

    Saludos

    JC’s

Deja un comentario

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