Exemple de propriétés de profil utilisateur SharePoint de migration
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 à valeurs unique 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
To get started, download the Core.ProfileProperty.Migration sample add-in from the Office 365 Developer Patterns and Practices project on GitHub.
Notes
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 SharePoint server installé.
- Utilisez un compte qui dispose d’autorisations SharePoint’administrateur de batterie de serveurs.
- Modifiez le App.config à l’aide des informations de configuration répertoriées dans le tableau 1.
- Pour tous les utilisateurs, assurez-vous que la propriété de profil utilisateur de messagerie work n’est pas vide. Si la valeur de la propriété de profil utilisateur de messagerie work 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 SharePoint Server 2013, faites les choses suivantes :
Ouvrez le menu raccourci (clic droit) pour Contoso.ProfileProperty.Migration.Extract > Properties.
Sous Application, dans l’infrastructure cible, choisissez .NET Framework 4.
Choisissez Oui, puis sélectionnez Enregistrer.
Tableau 1. Paramètres de configuration pour App.config fichier
| Nom du paramètre de configuration | Description | Exemple |
|---|---|---|
| MYSITEHOSTURL | URL du site Mon site sur la batterie de serveurs SharePoint 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 des données de profil utilisateur extraites. | C:\temp\ProfileData.xml |
| LOGFILE | Chemin d’accès au fichier XML à utiliser pour écrire des données de profil utilisateur extraites. | C:\temp\Extract.log |
| ENABLELOGGING | Active la journalisation du disque. | Vrai |
| TESTRUN | Effectue une extraction de test pour vérifier que vos paramètres de configuration App.config sont corrects. | Définissez TESTRUN=true si vous effectuez une extraction de test. L’exécuter n’extrait qu’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
Assurez-vous que les profils utilisateur existent dans Office 365.
Assurez-vous que l’adresse e-mail de travail de l’utilisateur est la même dans le service SharePoint Server local et Office 365 service de profil utilisateur.
Dans le fichier App.config, modifiez l’élément de valeur 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 App.config à l’aide des paramètres de configuration répertoriés dans le tableau 2.
Tableau 2. App.config de configuration des fichiers
| Nom du paramètre de configuration | Description | Exemple |
|---|---|---|
| tenantName | Il s’agit du nom de votre client. | Si l’URL de votre http://contoso.onmicrosoft.com client est , entrez contoso comme nom de client. |
| 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 du disque. | Vrai |
| SPOAdminUserName | Nom Office 365'utilisateur d’un administrateur. | Non applicable |
| SPOAdminPassword | Mot Office 365'administrateur. | Non applicable |
Utilisation de l’exemple de add-in 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'Microsoft.Office.Server.UserProfiles.dll assembly.
- 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 doit :
- 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é dans le 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 fait les choses suivantes, comme illustré dans l’exemple de code suivant :
- Obtient l’objet de propriété pour extraire des données de l’utilisation de spuser[userProperty].
- Renvoie 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 à valeurs multiples. GetMultiValuedProperty fait les choses suivantes, comme illustré dans l’exemple de code suivant :
- Obtient l’objet de propriété de profil utilisateur à mettre à jour à l’aide de spuser[userProperty].
- Crée une chaîne de valeurs de propriété de profil utilisateur séparées par PROPERTYSEPARATOR spécifiée dans App.config fichier.
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 add-in 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 exécute les procédures suivantes :
- Initialise l’application console à l’aide d’InitializeConfiguration et d’InitializeWebService.
- Désérialise le fichier XML contenant les données de profil utilisateur extraites.
- Pour tous les utilisateurs dans le fichier XML, il fait les choses 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 à une variable d’instance. D’autres méthodes de cet exemple de code utilisent cette variable d’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 sur 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 à valeurs multiples, telle que SPS-Responsibility, en faisant ce qui suit :
Fractionnement de PropertyValue en tableau de chaînes appelé arrs pour stocker les valeurs des propriétés de profil utilisateur. La chaîne est fractionne à 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 n’a qu’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 sur le centre d’administration SharePoint Online. L’utilisateur qui exécute cet exemple de code doit être un administrateur Office 365 client.
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 des 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);
}
}