Compartir a través de


Migración de un complemento de SharePoint de ejemplo de propiedades de perfil de usuario

El ejemplo Core.ProfileProperty.Migration muestra cómo migrar datos de perfil de usuario de SharePoint Server a SharePoint Online.

Este ejemplo incluye dos aplicaciones de consola. Ambos usan el servicio web userprofileservice.asmx para extraer datos de perfil de usuario únicos y multivalor en un archivo XML e importar los datos extraídos en el servicio de perfiles de usuario en SharePoint Online.

Use este ejemplo de código si desea:

  • Extraer datos de perfil de usuario en SharePoint Server.
  • Importar datos de perfil de usuario a SharePoint Online.

Antes de empezar

Para empezar, descargue el complemento de ejemplo Core.ProfileProperty.Migration del proyecto Office 365 Developer Patterns and Practices en GitHub.

Nota:

El código de este artículo se proporciona tal cual, sin garantía de ningún tipo, expresa o implícita, incluidas las garantías implícitas de aptitud para un propósito particular, comerciabilidad o ausencia de infracción.

El ejemplo de código contiene dos proyectos:

  • Contoso.ProfileProperty.Migration.Extract
  • Contoso.ProfileProperty.Migration.Import

Proyecto Contoso.ProfileProperty.Migration.Extract

Dado que este ejemplo de código usa el modelo de objetos del lado servidor, asegúrese de que está ejecutando el proyecto en un servidor con SharePoint Server instalado.

  • Use una cuenta que tenga permisos de administrador de granja de servidores de SharePoint.
  • Edite el archivo App.config con la información de configuración que se muestra en la tabla 1.
  • Para todos los usuarios, asegúrese de que la propiedad Perfil de usuario de correo electrónico del trabajo no está vacía. Si el valor de la propiedad Perfil de usuario de correo electrónico de trabajo está vacío, el proceso de extracción finalizará prematuramente.

Este ejemplo de código extrae perfiles de usuario de SharePoint Server 2010. Si va a extraer perfiles de usuario de SharePoint Server 2013, haga lo siguiente:

  1. Abra el menú contextual (haga clic con el botón derecho) para Contoso.ProfileProperty.Migration.Extract>Properties.

  2. En Aplicación, en Plataforma de destino, elija .NET Framework 4.

  3. Elija y, a continuación, elija Guardar.

Tabla 1. Configuración del archivo App.config

Nombre del valor de configuración Descripción Ejemplo
MYSITEHOSTURL Dirección URL de mi sitio en la granja de servidores de SharePoint Server de origen. http://my.contoso.com
PROPERTYSEPARATOR Carácter usado para separar varios valores en una propiedad de perfil de usuario multivalor.
USERPROFILESSTORE Ruta de acceso del archivo XML que se va a usar para escribir datos de perfil de usuario extraídos. C:\temp\ProfileData.xml
LOGFILE Ruta de acceso del archivo XML que se va a usar para escribir datos de perfil de usuario extraídos. C:\temp\Extract.log
ENABLELOGGING Habilita el registro de disco. Verdadero
TESTRUN Realiza una extracción de prueba para confirmar que los valores de configuración de App.config son correctos. Establezca TESTRUN=true si está realizando una extracción de prueba. La ejecución de prueba extrae solo un usuario del servicio de perfil de usuario.

Establezca TESTRUN=false si va a extraer todos los usuarios del servicio de perfil de usuario.

Proyecto Contoso.ProfileProperty.Migration.Import

  • Asegúrese de que los perfiles de usuario existen en Office 365.

  • Asegúrese de que la dirección de correo electrónico de trabajo del usuario es la misma en el servicio de perfil de usuario de SharePoint Server local y Office 365.

  • En el archivo App.config, cambie el elemento value de la configuración de Contoso_ProfileProperty_Migration_Import_UPSvc_UserProfileService para incluir una referencia al servicio de perfil de usuario en el centro de administración de SharePoint Online, como se muestra en el ejemplo siguiente.

      <applicationSettings>
      <Contoso.ProfileProperty.Migration.Import.Properties.Settings>
      <setting name="Contoso_ProfileProperty_Migration_Import_UPSvc_UserProfileService" serializeAs="String">
      <value>https://contoso-admin.sharepoint.com/_vti_bin/userprofileservice.asmx</value>
      </setting>
      </Contoso.ProfileProperty.Migration.Import.Properties.Settings>
      </applicationSettings>
    
  • Edite el archivo App.config mediante los valores de configuración enumerados en la tabla 2.

Tabla 2. App.config configuración de archivos

Nombre del valor de configuración Descripción Ejemplo
tenantName Este es el nombre del inquilino. Si la dirección URL del inquilino es http://contoso.onmicrosoft.com, escriba contoso como nombre del inquilino.
PROPERTYSEPARATOR Carácter usado para separar valores en una propiedad de perfil de usuario multivalor.
USERPROFILESSTORE Archivo XML que se va a usar para leer los datos de perfil de usuario extraídos. C:\temp\ProfileData.xml
LOGFILE Archivo de registro usado para el registro de eventos. C:\temp\Extract.log
ENABLELOGGING Habilita el registro de disco. Verdadero
SPOAdminUserName Nombre de usuario de un administrador de Office 365. No procede.
SPOAdminPassword Contraseña de administrador de Office 365. No procede.

Uso del complemento de ejemplo Core.ProfileProperty.Migration

Este ejemplo de código se ejecuta como una aplicación de consola. Cuando se ejecuta el ejemplo de código, la función Main de Program.cs realiza las siguientes tareas:

  • Se conecta al host Mi sitio y usa UserProfileManager para conectarse al servicio de perfil de usuario. UserProfileManager pertenece al ensamblado Microsoft.Office.Server.UserProfiles.dll .
  • Crea una lista denominada pData para almacenar los datos de perfil de usuario extraídos.
  • Para todos los usuarios del servicio de perfil de usuario, hace lo siguiente:
    • Usa GetSingleValuedProperty para copiar las propiedades de perfil de usuario WorkEmail y AboutMe en un objeto UserProfileData denominado userData.
    • Usa GetMultiValuedProperty para copiar la propiedad de perfil de usuario SPS-Responsibility en userData.
    • Usa UserProfileCollection.Save para serializar userData en un archivo XML. El archivo XML se guarda en la ruta de acceso del archivo que especificó en App.config.
static void Main(string[] args)
        {
            int userCount = 1;

            try
            {

                if (Convert.ToBoolean(ConfigurationManager.AppSettings["TESTRUN"]))
                {
                    LogMessage(string.Format("******** RUNNING IN TEST RUN MODE **********"), LogLevel.Debug);
                }
                
                LogMessage(string.Format("Connecting to My Site host: '{0}'...", ConfigurationManager.AppSettings["MYSITEHOSTURL"]), LogLevel.Info);
                using (SPSite mySite = new SPSite(ConfigurationManager.AppSettings["MYSITEHOSTURL"]))
                {
                    LogMessage(string.Format("Connecting to My Site host: '{0}'...Done!", ConfigurationManager.AppSettings["MYSITEHOSTURL"]), LogLevel.Info);

                    LogMessage(string.Format("getting Service Context..."), LogLevel.Info);
                    SPServiceContext svcContext = SPServiceContext.GetContext(mySite);
                    LogMessage(string.Format("getting Service Context...Done!"), LogLevel.Info);

                    LogMessage(string.Format("Connecting to Profile Manager..."), LogLevel.Info);
                    UserProfileManager profileManager = new UserProfileManager(svcContext);
                    LogMessage(string.Format("Connecting to Profile Manager...Done!"), LogLevel.Info);

                    // Size of the List is set to the number of profiles.
                    List<UserProfileData> pData = new List<UserProfileData>(Convert.ToInt32(profileManager.Count));
                    
                    // Initialize Serialization Class.
                    UserProfileCollection ups = new UserProfileCollection();

                    foreach (UserProfile spUser in profileManager)
                    {
                        // Get profile information.
                        LogMessage(string.Format("processing user '{0}' of {1}...", userCount,profileManager.Count),LogLevel.Info);                       
                        UserProfileData userData = new UserProfileData();
                        
                        userData.UserName = GetSingleValuedProperty(spUser, "WorkEmail");
                        
                        if (userData.UserName != string.Empty)
                        {
                            userData.AboutMe = GetSingleValuedProperty(spUser, "AboutMe");
                            userData.AskMeAbout = GetMultiValuedProperty(spUser, "SPS-Responsibility");
                            pData.Add(userData);
                            // Add to Serialization Class List of Profiles.
                            ups.ProfileData = pData;
                        }
                        
                        LogMessage(string.Format("processing user '{0}' of {1}...Done!", userCount++, profileManager.Count), LogLevel.Info);

                        // Only process the first item if we are in test mode.
                        if (Convert.ToBoolean(ConfigurationManager.AppSettings["TESTRUN"]))
                        {
                            break;
                        }

                    }
                    
                    // Serialize profiles to disk.
                    ups.Save();

                }
            }
            catch(Exception ex)
            {
                LogMessage("Exception trying to get profile properties:\n" + ex.Message, LogLevel.Error);
            }

El método GetSingleValuedProperty usa userprofileservice.asmx para recuperar una propiedad de perfil de usuario de un solo valor. GetSingleValuedProperty hace lo siguiente, como se muestra en el siguiente ejemplo de código:

  • Obtiene el objeto de propiedad del que se van a extraer datos mediante spuser[userProperty].
  • Devuelve el primer valor de UserProfileValueCollection si el valor no es NULL.
private static string GetSingleValuedProperty(UserProfile spUser,string userProperty)
        {
            string returnString = string.Empty;
            try
            {
                UserProfileValueCollection propCollection = spUser[userProperty];

                if (propCollection[0] != null)
                {
                    returnString = propCollection[0].ToString();
                }
                else
                {
                    LogMessage(string.Format("User '{0}' does not have a value in property '{1}'", spUser.DisplayName, userProperty), LogLevel.Warning);                       
                }
            }
            catch 
            {
                LogMessage(string.Format("User '{0}' does not have a value in property '{1}'", spUser.DisplayName, userProperty), LogLevel.Warning);                       
            }


            return returnString;
            
        }

El método GetMultiValuedProperty usa userprofileservice.asmx para recuperar una propiedad de perfil de usuario multivalor. GetMultiValuedProperty hace lo siguiente, como se muestra en el siguiente ejemplo de código:

  • Obtiene el objeto de propiedad de perfil de usuario que se va a actualizar mediante spuser[userProperty].
  • Compila una cadena de valores de propiedad de perfil de usuario separados por el PROPERTYSEPARATOR especificado en el archivo App.config.
private static string GetMultiValuedProperty(UserProfile spUser, string userProperty)
        {
            StringBuilder sb = new StringBuilder("");
            string separator = ConfigurationManager.AppSettings["PROPERTYSEPARATOR"];

            string returnString = string.Empty;
            try
            {

                UserProfileValueCollection propCollection = spUser[userProperty];

                if (propCollection.Count > 1)
                {
                    for (int i = 0; i < propCollection.Count; i++)
                    {
                        if (i == propCollection.Count - 1) { separator = ""; }
                        sb.AppendFormat("{0}{1}", propCollection[i], separator);
                    }
                }
                else if (propCollection.Count == 1)
                {
                    sb.AppendFormat("{0}", propCollection[0]);
                }

            }
            catch
            {
                LogMessage(string.Format("User '{0}' does not have a value in property '{1}'", spUser.DisplayName, userProperty), LogLevel.Warning);
            }

            return sb.ToString();

        }

Uso del complemento de ejemplo Contoso.ProfileProperty.Migration.Import

Este ejemplo de código se ejecuta como una aplicación de consola. Cuando se ejecuta el ejemplo de código, el método Main de Program.cs hace lo siguiente:

  • Inicializa la aplicación de consola mediante InitializeConfiguration e InitializeWebService.
  • Deserializa el archivo XML que contiene los datos de perfil de usuario extraídos.
  • Para todos los usuarios del archivo XML, hace lo siguiente:
    • Extrae la propiedad UserName del archivo XML.
    • Usa SetSingleMVProfileProperty para establecer SPS-Responsibility en el perfil del usuario.
    • Usa SetSingleMVProfileProperty para establecer AboutMe en el perfil del usuario.

InitializeWebService se conecta a SharePoint Online y establece una referencia del servicio de perfil de usuario en una variable de instancia. Otros métodos de este ejemplo de código usan esta variable de instancia para escribir valores en las propiedades de perfil de usuario. Para administrar el perfil de usuario, este ejemplo de código usa el servicio web userprofileservice.asmx en el Centro de administración de SharePoint Online.

static bool InitializeWebService()
        {
            try
            {
                string webServiceExt = "_vti_bin/userprofileservice.asmx";
                string adminWebServiceUrl = string.Empty;
                
                if (_profileSiteUrl.EndsWith("/"))
                    adminWebServiceUrl = _profileSiteUrl + webServiceExt;
                else
                    adminWebServiceUrl = _profileSiteUrl + "/" + webServiceExt;

                LogMessage("Initializing SPO web service " + adminWebServiceUrl, LogLevel.Information);

                SecureString securePassword = GetSecurePassword(_sPoAuthPasword);
                SharePointOnlineCredentials onlineCred = new SharePointOnlineCredentials(_sPoAuthUserName, securePassword);

                string authCookie = onlineCred.GetAuthenticationCookie(new Uri(_profileSiteUrl));

                CookieContainer authContainer = new CookieContainer();
                authContainer.SetCookies(new Uri(_profileSiteUrl), authCookie);

                // Setting up the user profile web service.
                _userProfileService = new UPSvc.UserProfileService();
                _userProfileService.Url = adminWebServiceUrl;

                // Assign previously created auth container to admin profile web service. 
                _userProfileService.CookieContainer = authContainer;
                return true;
            }
            catch (Exception ex)
            {
                LogMessage("Error initiating connection to profile web service in SPO " + ex.Message, LogLevel.Error);
                return false;

            }
            
        }

El método SetSingleMVProfileProperty establece una propiedad de perfil de usuario multivalor, como SPS-Responsibility, haciendo lo siguiente:

  • Dividir PropertyValue en una matriz de cadenas denominada arrs para almacenar valores de propiedad de perfil de usuario. La cadena se divide mediante el valor de configuración PROPERTYSEPARATOR especificado en App.config.

  • Asignar los valores de arrs a una matriz ValueData en el servicio de perfil de usuario.

  • Crear una matriz PropertyData en el servicio de perfil de usuario. El nombre de la propiedad de perfil de usuario y la matriz ValueData se pasan a las propiedades del objeto PropertyData . Esta matriz solo tiene un elemento porque solo se importará una propiedad de perfil de usuario multivalor.

Los datos se escriben en el servicio de perfil de usuario mediante ModifyUserPropertyByAccountName en el servicio web userprofileservice.asmx en el Centro de administración de SharePoint Online. El usuario que ejecuta este ejemplo de código debe ser un administrador Office 365.

static void SetSingleMVProfileProperty(string UserName, string PropertyName, string PropertyValue)
        {

            try
            {
                string[] arrs = PropertyValue.Split(ConfigurationManager.AppSettings["PROPERTYSEPARATOR"][0]);
                
               UPSvc.ValueData[] vd = new UPSvc.ValueData[arrs.Count()];
               
               for (int i=0;i<=arrs.Count()-1;i++)
               {
                    vd[i] = new UPSvc.ValueData();
                    vd[i].Value = arrs[i];
                }
               
                UPSvc.PropertyData[] data = new UPSvc.PropertyData[1];
                data[0] = new UPSvc.PropertyData();
                data[0].Name = PropertyName;
                data[0].IsValueChanged = true;
                data[0].Values = vd;
                               
                _userProfileService.ModifyUserPropertyByAccountName(string.Format(@"i:0#.f|membership|{0}", UserName), data);

            }
            catch (Exception ex)
            {
                LogMessage("Exception trying to update profile property " + PropertyName + " for user " + UserName + "\n" + ex.Message, LogLevel.Error);
            }

        }


El método SetSingleValuedProperty establece propiedades de perfil de usuario de un solo valor, como AboutMe. SetSingleValuedProperty implementa la misma técnica que SetSingleMVProfileProperty, pero usa una matriz ValueData con un solo elemento.

static void SetSingleProfileProperty(string UserName, string PropertyName, string PropertyValue)
        {

            try
            {
                UPSvc.PropertyData[] data = new UPSvc.PropertyData[1];
                data[0] = new UPSvc.PropertyData();
                data[0].Name = PropertyName;
                data[0].IsValueChanged = true;
                data[0].Values = new UPSvc.ValueData[1];
                data[0].Values[0] = new UPSvc.ValueData();
                data[0].Values[0].Value = PropertyValue;
                _userProfileService.ModifyUserPropertyByAccountName(UserName, data);
            }
            catch (Exception ex)
            {
                LogMessage("Exception trying to update profile property " + PropertyName + " for user " + UserName + "\n" + ex.Message, LogLevel.Error);
            }

        }

Vea también