Pasión por la tecnología…

julio 31, 2008

MOSS: Cómo actualizar los User Profiles!

Archivado en: MOSS — Juan Carlos González Martín @ 22:10

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.

Eye on Earth: Observatorio online medioambiental!

Archivado en: Noticias,SQL Server 2008,Virtual Earth — Juan Carlos González Martín @ 07:04

Sin duda, la tecnología y el entorno que nos rodea son elementos que se dan claramente la mano, y como prueba tenemos el reciente lanzamiento de Eye on Earth. Se trata de un observatorio medioambiental lanzado conjuntamente por Microsoft y la Agencia Europea de Medio Ambiente (EEA):

image

La primera aplicación incluida en Eye on Earth es Water Wath, que nos permitirá elegir dentro del territorio europeo que zona es más idónea para darnos un baño a partir de comparar la limpieza de las aguas de 27 países. ¿Y cómo funciona esto? Pues Eye on Earth recupera datos de 21.000 puntos de monitorización, aprovechando las capacidades geoespaciales de SQL Server 2008 y luego los plasma en el mapa de Europa a través de Microsoft Virtual Earth. Tenéis más información sobre Eye on Earth en este enlace a la noticia aparecida en el diario El Mundo (Edición Dígital). Sin más, aquí os dejo el estado de a playa de los Peligros en Santander…muy apta para el baño ;)

image

El tema Rubric. Blog de WordPress.com.

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 40 seguidores