Partager via


Exemple de complément SharePoint de migration des propriétés de profil utilisateur

L’exemple Core.ProfileProperty.Migration vous montre comment migrer des données de profil utilisateur de SharePoint Server vers SharePoint Online.

Cet exemple inclut deux applications console. Les deux utilisent le service web userprofileservice.asmx pour extraire des données de profil utilisateur uniques et à plusieurs valeurs dans un fichier XML, et pour importer les données extraites dans le service de profil utilisateur dans SharePoint Online.

Utilisez cet exemple de code si vous souhaitez :

  • Extrayez les données de profil utilisateur dans SharePoint Server.
  • Importer des données de profil utilisateur dans SharePoint Online.

Avant de commencer

Pour commencer, téléchargez l’exemple de complément Core.ProfileProperty.Migration à partir du projet Office 365 Developer Patterns and Practices sur GitHub.

Remarque

Le code dans cet article est fourni tel quel, sans garantie d’aucune sorte, expresse ou implicite, y compris mais sans s’y limiter, aucune garantie implicite d’adéquation à un usage particulier, à une qualité marchande ou une absence de contrefaçon.

L’exemple de code contient deux projets :

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

Projet Contoso.ProfileProperty.Migration.Extract

Étant donné que cet exemple de code utilise le modèle objet côté serveur, assurez-vous que vous exécutez le projet sur un serveur sur lequel SharePoint Server est installé.

  • Utilisez un compte disposant des autorisations d’administrateur de batterie de serveurs SharePoint.
  • Modifiez le fichier App.config à l’aide des informations de configuration répertoriées dans le tableau 1.
  • Pour tous les utilisateurs, vérifiez que la propriété Profil utilisateur de messagerie professionnelle n’est pas vide. Si la valeur de la propriété de profil utilisateur de messagerie professionnelle est vide, le processus d’extraction se termine prématurément.

Cet exemple de code extrait les profils utilisateur de SharePoint Server 2010. Si vous extrayez des profils utilisateur à partir de SharePoint Server 2013, procédez comme suit :

  1. Ouvrez le menu contextuel (cliquez avec le bouton droit) pour Propriétés Contoso.ProfileProperty.Migration.Extract>.

  2. Sous Application, dans Framework cible, choisissez .NET Framework 4.

  3. Choisissez Oui, puis Enregistrer.

Tableau 1. Paramètres de configuration du fichier App.config

Nom du paramètre de configuration Description Exemple
MYSITEHOSTURL URL de mon site sur la batterie de serveurs SharePoint Server source. http://my.contoso.com
PROPERTYSEPARATOR Caractère utilisé pour séparer plusieurs valeurs dans une propriété de profil utilisateur à valeurs multiples.
USERPROFILESSTORE Chemin d’accès au fichier XML à utiliser pour écrire les données de profil utilisateur extraites. C:\temp\ProfileData.xml
LOGFILE Chemin d’accès au fichier XML à utiliser pour écrire les données de profil utilisateur extraites. C:\temp\Extract.log
ENABLELOGGING Active la journalisation des disques. Vrai
TESTRUN Effectue une extraction de test pour vérifier que vos paramètres de configuration dans App.config sont corrects. Définir TESTRUN=true si vous effectuez une extraction de test. La série de tests extrait un seul utilisateur du service de profil utilisateur.

Définissez TESTRUN=false si vous extrayez tous les utilisateurs du service de profil utilisateur.

Projet Contoso.ProfileProperty.Migration.Import

  • Vérifiez que les profils utilisateur existent dans Office 365.

  • Vérifiez que l’adresse e-mail professionnelle de l’utilisateur est la même dans le service de profil utilisateur sharePoint Server local et Office 365.

  • Dans le fichier App.config, modifiez l’élément value du paramètre Contoso_ProfileProperty_Migration_Import_UPSvc_UserProfileService pour inclure une référence au service de profil utilisateur dans votre Centre d’administration SharePoint Online, comme illustré dans l’exemple suivant.

      <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>
    
  • Modifiez le fichier App.config à l’aide des paramètres de configuration répertoriés dans le tableau 2.

Tableau 2. App.config paramètres de configuration de fichier

Nom du paramètre de configuration Description Exemple
tenantName Il s’agit du nom de votre locataire. Si votre URL de locataire est http://contoso.onmicrosoft.com, entrez contoso comme nom de locataire.
PROPERTYSEPARATOR Caractère utilisé pour séparer les valeurs d’une propriété de profil utilisateur à valeurs multiples.
USERPROFILESSTORE Fichier XML à utiliser pour lire les données de profil utilisateur extraites. C:\temp\ProfileData.xml
LOGFILE Fichier journal utilisé pour la journalisation des événements. C:\temp\Extract.log
ENABLELOGGING Active la journalisation des disques. Vrai
SPOAdminUserName Nom d’utilisateur d’un administrateur Office 365. Non applicable
SPOAdminPassword Mot de passe de l’administrateur Office 365. Non applicable

Utilisation de l’exemple de complément Core.ProfileProperty.Migration

Cet exemple de code s’exécute en tant qu’application console. Lorsque l’exemple de code s’exécute, la fonction Main dans Program.cs effectue les tâches suivantes :

  • Se connecte à l’hôte Mon site et utilise UserProfileManager pour se connecter au service de profil utilisateur. UserProfileManager appartient à l’assembly Microsoft.Office.Server.UserProfiles.dll .
  • Crée une liste appelée pData pour stocker les données de profil utilisateur extraites.
  • Pour tous les utilisateurs du service de profil utilisateur, il effectue les opérations suivantes :
    • Utilise GetSingleValuedProperty pour copier les propriétés de profil utilisateur WorkEmail et AboutMe dans un objet UserProfileData appelé userData.
    • Utilise GetMultiValuedProperty pour copier la propriété de profil utilisateur SPS-Responsibility dans userData.
    • Utilise UserProfileCollection.Save pour sérialiser userData dans un fichier XML. Le fichier XML est enregistré au niveau du chemin d’accès que vous avez spécifié dans 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);
            }

La méthode GetSingleValuedProperty utilise userprofileservice.asmx pour récupérer une propriété de profil utilisateur à valeur unique. GetSingleValuedProperty effectue les opérations suivantes, comme indiqué dans l’exemple de code suivant :

  • Obtient l’objet de propriété à partir duquel extraire des données à l’aide de spuser[userProperty].
  • Retourne la première valeur dans UserProfileValueCollection si la valeur n’est pas 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;
            
        }

La méthode GetMultiValuedProperty utilise userprofileservice.asmx pour récupérer une propriété de profil utilisateur à plusieurs valeurs. GetMultiValuedProperty effectue les opérations suivantes, comme indiqué dans l’exemple de code suivant :

  • Obtient l’objet de propriété de profil utilisateur à mettre à jour à l’aide de spuser[userProperty].
  • Génère une chaîne de valeurs de propriété de profil utilisateur séparées par la propriété PROPERTYSEPARATOR spécifiée dans le fichier 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();

        }

Utilisation de l’exemple de complément Contoso.ProfileProperty.Migration.Import

Cet exemple de code s’exécute en tant qu’application console. Lorsque l’exemple de code s’exécute, la méthode Main dans Program.cs effectue les opérations suivantes :

  • Initialise l’application console à l’aide de InitializeConfiguration et InitializeWebService.
  • Désérialise le fichier XML contenant les données de profil utilisateur extraites.
  • Pour tous les utilisateurs du fichier XML, il effectue les opérations suivantes :
    • Extrait la propriété UserName du fichier XML.
    • Utilise SetSingleMVProfileProperty pour définir SPS-Responsibility sur le profil de l’utilisateur.
    • Utilise SetSingleMVProfileProperty pour définir AboutMe sur le profil de l’utilisateur.

InitializeWebService se connecte à SharePoint Online et définit une référence du service de profil utilisateur sur une variable instance. D’autres méthodes de cet exemple de code utilisent cette variable instance pour écrire des valeurs dans les propriétés de profil utilisateur. Pour administrer le profil utilisateur, cet exemple de code utilise le service web userprofileservice.asmx dans le Centre d’administration 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;

            }
            
        }

La méthode SetSingleMVProfileProperty définit une propriété de profil utilisateur à plusieurs valeurs, telle que SPS-Responsibility, en procédant comme suit :

  • Fractionnement de PropertyValue en un tableau de chaînes appelé arrs pour stocker les valeurs de propriété de profil utilisateur. La chaîne est fractionnée à l’aide du paramètre de configuration PROPERTYSEPARATOR spécifié dans App.config.

  • Affectation des valeurs d’arrs à un tableau ValueData sur le service de profil utilisateur.

  • Création d’un tableau PropertyData sur le service de profil utilisateur. Le nom de la propriété de profil utilisateur et le tableau ValueData sont transmis aux propriétés de l’objet PropertyData . Ce tableau a un seul élément, car une seule propriété de profil utilisateur à valeurs multiples sera importée.

Les données sont écrites dans le service de profil utilisateur à l’aide de ModifyUserPropertyByAccountName sur le service web userprofileservice.asmx dans le Centre d’administration SharePoint Online. L’utilisateur exécutant cet exemple de code doit être administrateur 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);
            }

        }


La méthode SetSingleValuedProperty définit les propriétés de profil utilisateur à valeur unique, telles que AboutMe. SetSingleValuedProperty implémente la même technique que SetSingleMVProfileProperty, mais utilise un tableau ValueData avec un seul élément.

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);
            }

        }

Voir aussi