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:
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; |
![]() |
![]() |
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 😉
![]() |
![]() |
Espero que el post os haya parecido interesante.