Charger des exemples d’images de profil utilisateur pour le complément SharePoint
L’exemple Core.ProfilePictureUploader vous montre comment charger en bloc des données de profil utilisateur à partir d’un partage de fichiers ou d’une URL SharePoint Online, et comment lier les propriétés de profil utilisateur aux images chargées.
Utilisez cet exemple pour découvrir comment :
- Migrer les images de profil d’un utilisateur de SharePoint Server en local vers SharePoint Online.
- Correction des problèmes qui se produisent lorsque l’outil de synchronisation Azure Active Directory (dirsync) ne parvient pas à synchroniser les images de profil d’un utilisateur avec SharePoint Online.
- Remplacez les images de profil utilisateur de mauvaise qualité dans SharePoint Online.
Cet exemple utilise une application console pour effectuer les opérations suivantes :
- Lisez les noms d’utilisateur et les chemins d’accès aux fichiers image ou url à partir d’un fichier de mappage d’utilisateur.
- Récupérez et chargez une ou trois images dans une bibliothèque d’images sur l’hôte Mon site.
- Définissez les propriétés du profil utilisateur pour lier les images chargées au profil d’un utilisateur.
- Mettez à jour les propriétés de profil utilisateur supplémentaires (facultatives).
Avant de commencer
Pour commencer, téléchargez l’exemple de complément Core.ProfilePictureUploader à 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.
Avant d’exécuter cet exemple de code
- Stockez vos images utilisateur que vous avez l’intention de charger sur SharePoint Online sur un partage de fichiers ou un serveur web.
- Modifiez le fichier userlist.csv pour inclure les éléments suivants :
- Ligne d’en-tête contenant la valeur UserPrincipalName, SourceURL.
- Pour chaque utilisateur, ajoutez une nouvelle ligne contenant le compte d’organisation de l’utilisateur (ou le nom d’utilisateur principal) et le chemin d’accès au fichier ou l’URL de l’image à charger.
Exécuter cet exemple à partir de Visual Studio
Configurez le projet Core.ProfilePictureUploader avec les arguments de ligne de commande suivants : -SPOAdmin Username -SPOAdminPassword Password -Configuration filepath
où :
- Nom d’utilisateur est le nom d’utilisateur de votre administrateur Office 365.
- Le mot de passe est le mot de passe de votre administrateur Office 365.
- Filepath est le chemin d’accès du fichier configuration.xml.
Définir les arguments de ligne de commande sur le projet Core.ProfilePictureUploader
Dans Explorateur de solutions, ouvrez le menu contextuel (cliquez avec le bouton droit) pour les propriétés du projet >Core.ProfilePictureUploader.
Choisissez Déboguer.
Dans Arguments de ligne de commande, entrez les arguments de ligne de commande répertoriés précédemment.
Configurer le processus de chargement pour répondre à vos besoins
Modifiez le fichier configuration.xml en entrant les valeurs suivantes :
Nom de votre locataire Office 365 dans l’élément tenantName. Par exemple :
<tenantName>contoso.onmicrosoft.com</tenantName>
Chemin d’accès du fichier de mappage utilisateur dans l’élément pictureSourceCsv . Par exemple :
<pictureSourceCsv>C:\temp\userlist.csv</pictureSourceCsv>
Instructions de chargement d’image à l’aide de l’élément thumbs . Modifiez les attributs suivants dans l’élément thumbs :
aupload3Thumbs : définissez sur true si vous souhaitez charger trois images pour chaque utilisateur, ou sur false si vous ne souhaitez charger qu’une seule image.
createSMLThumbs : défini sur true si vous souhaitez créer trois images de taille différente (petite, moyenne et grande) de l’image source, ou défini sur false si vous souhaitez charger trois images de la même taille.
Propriétés supplémentaires à définir sur le profil de l’utilisateur à l’aide de l’élément additionalProfileProperties . Par exemple, le code XML suivant spécifie une propriété de profil utilisateur supplémentaire appelée SPS-PictureExchangeSyncState qui doit être définie sur zéro sur le profil de l’utilisateur lors de l’exécution de l’exemple de code.
<additionalProfileProperties> <property name="SPS-PictureExchangeSyncState" value="0"/> </additionalProfileProperties>
Chemin d’accès au fichier journal dans l’élément logfile , comme illustré dans l’exemple suivant.
<logFile path="C:\temp\log.txt" enableLogging="true" loggingLevel="verbose" />
Délai de chargement en millisecondes entre le chargement de différents fichiers image à l’aide de l’élément uploadDelay . Le paramètre recommandé pour uploadDelay est de 500 millisecondes.
Dans le fichier App.config, modifiez l’élément value du paramètre ProfilePictureUploader_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.
<Contoso.Core.ProfilePictureUploader.Properties.Settings>
<setting name="ProfilePictureUploader_UPSvc_UserProfileService"
serializeAs="String">
<value>https://contoso-admin.sharepoint.com/_vti_bin/userprofileservice.asmx</value>
</setting>
</Contoso.Core.ProfilePictureUploader.Properties.Settings>
Importante
La connexion au service web userprofileservice.asmx dans le Centre d’administration SharePoint Online vous permet de mettre à jour les propriétés de profil utilisateur d’autres utilisateurs. Lorsque vous exécutez cet exemple de code, utilisez un compte administrateur Office 365 qui dispose des autorisations nécessaires pour gérer les profils utilisateur.
Utilisation de l’exemple de complément Core.ProfilePictureUploader
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 SetupArguments et InitializeConfiguration.
Appelle InitializeWebService pour se connecter au service de profil utilisateur dans SharePoint Online.
Itère dans le fichier userlist.csv pour lire le nom d’utilisateur principal (UPN) de l’utilisateur et l’emplacement du fichier image de l’utilisateur.
Récupère l’image d’un utilisateur à l’aide des objets WebRequest et WebResponse dans GetImagefromHTTPUrl.
Appelle UploadImageToSpo pour charger l’image de l’utilisateur dans SharePoint Online.
Appelle SetMultipleProfileProperties pour définir les propriétés de profil utilisateur PictureURL et SPS-PicturePlaceholderState pour l’utilisateur.
Appelle SetAdditionalProfileProperties pour définir des propriétés supplémentaires sur le profil utilisateur après le chargement du fichier image.
static void Main(string[] args)
{
int count = 0;
if (SetupArguments(args)) // Checks if args passed are valid
{
if (InitializeConfiguration()) // Check that the configuration file is valid
{
if (InitializeWebService()) // Initialize the web service end point for the SharePoint Online user profile service.
{
using (StreamReader readFile = new StreamReader(_appConfig.PictureSourceCsv))
{
string line;
string[] row;
string sPoUserProfileName;
string sourcePictureUrl;
while ((line = readFile.ReadLine()) != null)
{
if (count > 0)
{
row = line.Split(',');
sPoUserProfileName = row[0];
sourcePictureUrl = row[1];
LogMessage("Begin processing for user " + sPoUserProfileName, LogLevel.Warning);
// Get source picture from source image path.
using (MemoryStream picturefromExchange = GetImagefromHTTPUrl(sourcePictureUrl))
{
if (picturefromExchange != null) // If we got image, upload to SharePoint Online
{
// Create SharePoint naming convention for image file.
string newImageNamePrefix = sPoUserProfileName.Replace("@", "_").Replace(".", "_");
// Upload source image to SharePoint Online.
string spoImageUrl = UploadImageToSpo(newImageNamePrefix, picturefromExchange);
if (spoImageUrl.Length > 0)// If upload worked:
{
string[] profilePropertyNamesToSet = new string[] { "PictureURL", "SPS-PicturePlaceholderState" };
string[] profilePropertyValuesToSet = new string[] { spoImageUrl, "0" };
// Set these two required user profile properties - path to uploaded image, and pictureplaceholder state.
SetMultipleProfileProperties(_sPOProfilePrefix + sPoUserProfileName, profilePropertyNamesToSet, profilePropertyValuesToSet);
// Set additional user profile properties based on your requirements.
SetAdditionalProfileProperties(_sPOProfilePrefix + sPoUserProfileName);
}
}
}
LogMessage("End processing for user " + sPoUserProfileName, LogLevel.Warning);
int sleepTime = _appConfig.UploadDelay;
System.Threading.Thread.Sleep(sleepTime); // A pause between uploads is recommended.
}
count++;
}
}
}
}
}
LogMessage("Processing finished for " + count + " user profiles", LogLevel.Information);
}
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 appliquer des mises à jour aux 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;
// Append the web service (ASMX) URL onto the admin website URL.
if (_profileSiteUrl.EndsWith("/"))
adminWebServiceUrl = _profileSiteUrl + webServiceExt;
else
adminWebServiceUrl = _profileSiteUrl + "/" + webServiceExt;
LogMessage("Initializing SPO web service " + adminWebServiceUrl, LogLevel.Information);
// Get secure password from clear text password.
SecureString securePassword = GetSecurePassword(_sPoAuthPasword);
// Set credentials from SharePoint Client API, used later to extract authentication cookie, so can replay to web services.
SharePointOnlineCredentials onlineCred = new SharePointOnlineCredentials(_sPoAuthUserName, securePassword);
// Get the authentication cookie by passing the URL of the admin website.
string authCookie = onlineCred.GetAuthenticationCookie(new Uri(_profileSiteUrl));
// Create a CookieContainer to authenticate against the web service.
CookieContainer authContainer = new CookieContainer();
// Put the authenticationCookie string in the container.
authContainer.SetCookies(new Uri(_profileSiteUrl), authCookie);
// Set up the user profile web service.
_userProfileService = new UPSvc.UserProfileService();
// Assign the correct URL to the admin profile web service.
_userProfileService.Url = adminWebServiceUrl;
// Assign previously created authentication container to admin profile web service.
_userProfileService.CookieContainer = authContainer;
// LogMessage("Finished creating service object for SharePoint Online Web Service " + adminWebServiceUrl, LogLevel.Information);
return true;
}
catch (Exception ex)
{
LogMessage("Error initiating connection to profile web service in SPO " + ex.Message, LogLevel.Error);
return false;
}
}
La méthode Main dans Program.cs appelle UploadImageToSpo pour charger l’image de profil de l’utilisateur dans SharePoint Online. Les images de profil de tous les utilisateurs sont stockées dans une bibliothèque d’images sur l’hôte Mon site. UploadImageToSpo effectue les tâches suivantes :
- Se connecte à SharePoint Online.
- Détermine le nombre d’images à charger pour chaque utilisateur.
- Si vous avez configuré l’application pour charger une image par utilisateur, l’image est chargée dans la bibliothèque d’images.
- Si vous avez configuré l’application pour charger trois images par utilisateur, l’application vérifie la valeur de createSMLThumbs dans le fichier de configuration pour déterminer si trois images de taille différente sont requises. Si trois images de taille différente sont requises, l’application utilise ResizeImageSmall et ResizeImageLarge pour créer trois images de taille différente à partir de l’image source. L’application charge ensuite les images redimensionnées dans la bibliothèque d’images. Si trois images de taille différente ne sont pas nécessaires, l’application charge trois images de la même taille dans la bibliothèque d’images.
static string UploadImageToSpo(string PictureName, Stream ProfilePicture)
{
try
{
string spPhotoPathTempate = "/User Photos/Profile Pictures/{0}_{1}Thumb.jpg"; // Path template to picture library on the My Site host.
string spImageUrl = string.Empty;
// Create SharePoint Online Client context to My Site host.
ClientContext mySiteclientContext = new ClientContext(_mySiteUrl);
SecureString securePassword = GetSecurePassword(_sPoAuthPasword);
// Provide authentication credentials using Office 365 authentication.
mySiteclientContext.Credentials = new SharePointOnlineCredentials(_sPoAuthUserName, securePassword);
if (!_appConfig.Thumbs.Upload3Thumbs) // Upload a single input image only to picture library, no resizing necessary.
{
spImageUrl = string.Format(spPhotoPathTempate, PictureName, "M");
LogMessage("Uploading single image, no resize, to " + spImageUrl, LogLevel.Information);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, ProfilePicture, true);
}
else if (_appConfig.Thumbs.Upload3Thumbs && !_appConfig.Thumbs.CreateSMLThumbs)// Upload three images of the same size.
{
// The following code is not optimal. Upload the same source image three times with different names.
// No resizing of images necessary.
LogMessage("Uploading threes image to SPO, no resize", LogLevel.Information);
spImageUrl = string.Format(spPhotoPathTempate, PictureName, "M");
LogMessage("Uploading medium image to " + spImageUrl, LogLevel.Information);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, ProfilePicture, true);
ProfilePicture.Seek(0, SeekOrigin.Begin);
spImageUrl = string.Format(spPhotoPathTempate, PictureName, "L");
LogMessage("Uploading large image to " + spImageUrl, LogLevel.Information);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, ProfilePicture, true);
ProfilePicture.Seek(0, SeekOrigin.Begin);
spImageUrl = string.Format(spPhotoPathTempate, PictureName, "S");
LogMessage("Uploading small image to " + spImageUrl, LogLevel.Information);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, ProfilePicture, true);
}
else if (_appConfig.Thumbs.Upload3Thumbs && _appConfig.Thumbs.CreateSMLThumbs) //Generate 3 different sized images.
{
LogMessage("Uploading threes image to SPO, with resizing", LogLevel.Information);
// Create three images based on recommended sizes for SharePoint Online.
// Create small-sized image.
using (Stream smallThumb = ResizeImageSmall(ProfilePicture, _smallThumbWidth))
{
if (smallThumb != null)
{
spImageUrl = string.Format(spPhotoPathTempate, PictureName, "S");
LogMessage("Uploading small image to " + spImageUrl, LogLevel.Information);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, smallThumb, true);
}
}
// Create medium-sized image.
using (Stream mediumThumb = ResizeImageSmall(ProfilePicture, _mediumThumbWidth))
{
if (mediumThumb != null)
{
spImageUrl = string.Format(spPhotoPathTempate, PictureName, "M");
LogMessage("Uploading medium image to " + spImageUrl, LogLevel.Information);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, mediumThumb, true);
}
}
// Create large-sized image. This image is shown when you open the user's OneDrive for Business.
using (Stream largeThumb = ResizeImageLarge(ProfilePicture, _largeThumbWidth))
{
if (largeThumb != null)
{
spImageUrl = string.Format(spPhotoPathTempate, PictureName, "L");
LogMessage("Uploading large image to " + spImageUrl, LogLevel.Information);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(mySiteclientContext, spImageUrl, largeThumb, true);
}
}
}
// Return URL of the medium-sized image to set properties on the user profile.
return _mySiteUrl + string.Format(spPhotoPathTempate, PictureName, "M");
}
catch (Exception ex)
{
LogMessage("User Error: Failed to upload thumbnail picture to SPO for " + PictureName + " " + ex.Message, LogLevel.Error);
return string.Empty;
}
}
SetMultipleProfileProperties définit plusieurs propriétés de profil utilisateur dans un appel de méthode unique. Dans cet exemple de code, SetMultipleProfileProperties définit les propriétés de profil utilisateur suivantes pour un utilisateur :
PictureURL : définissez sur l’URL de l’image chargée de taille moyenne dans la bibliothèque d’images sur l’hôte Mon site.
SPS-PicturePlaceholderState : définissez sur zéro pour indiquer que SharePoint Online doit afficher l’image chargée pour l’utilisateur.
static void SetMultipleProfileProperties(string UserName, string[] PropertyName, string[] PropertyValue)
{
LogMessage("Setting multiple SPO user profile properties for " + UserName, LogLevel.Information);
try
{
int arrayCount = PropertyName.Count();
UPSvc.PropertyData[] data = new UPSvc.PropertyData[arrayCount];
for (int x = 0; x < arrayCount; x++)
{
data[x] = new UPSvc.PropertyData();
data[x].Name = PropertyName[x];
data[x].IsValueChanged = true;
data[x].Values = new UPSvc.ValueData[1];
data[x].Values[0] = new UPSvc.ValueData();
data[x].Values[0].Value = PropertyValue[x];
}
_userProfileService.ModifyUserPropertyByAccountName(UserName, data);
// LogMessage("Finished setting multiple SharePoint Online user profile properties for " + UserName, LogLevel.Information);
}
catch (Exception ex)
{
LogMessage("User Error: Exception trying to update profile properties for user " + UserName + "\n" + ex.Message, LogLevel.Error);
}
}
SetAdditionalProfileProperties définit toutes les propriétés de profil utilisateur supplémentaires que vous souhaitez mettre à jour après le chargement des fichiers image. Vous pouvez spécifier des propriétés supplémentaires à mettre à jour dans le fichier configuration.xml.
static void SetAdditionalProfileProperties(string UserName)
{
if (_appConfig.AdditionalProfileProperties.Properties == null) // If there are no additional properties to update.
return;
int propsCount = _appConfig.AdditionalProfileProperties.Properties.Count();
if (propsCount > 0)
{
string[] profilePropertyNamesToSet = new string[propsCount];
string[] profilePropertyValuesToSet = new string[propsCount];
// Loop through each property in configuration file.
for (int i = 0; i < propsCount; i++)
{
profilePropertyNamesToSet[i] = _appConfig.AdditionalProfileProperties.Properties[i].Name;
profilePropertyValuesToSet[i] = _appConfig.AdditionalProfileProperties.Properties[i].Value;
}
// Set all properties in a single call.
SetMultipleProfileProperties(UserName, profilePropertyNamesToSet, profilePropertyValuesToSet);
}
}