Télécharger exemple d’images de profil utilisateur SharePoint du module
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 des propriétés de profil utilisateur à des images téléchargées.
Utilisez cet exemple pour apprendre à :
- Migrez les images de profil d’un utilisateur SharePoint Server local vers SharePoint Online.
- Résoudre les problèmes qui se produisent lorsque l’outil Azure Active Directory Sync (dirsync) ne parvient pas à synchroniser les images de profil d’un utilisateur avec SharePoint Online.
- Remplacez les images de profil utilisateur de qualité médiocre dans SharePoint Online.
Cet exemple utilise une application console pour :
- Lisez les noms d’utilisateur et les chemins d’accès aux fichiers image ou LES URL à partir d’un fichier de mappage utilisateur.
- Récupérer et télécharger une ou trois images dans une bibliothèque d’images sur l’hôte mon site.
- Définissez les propriétés de profil utilisateur pour lier les images téléchargées au profil d’un utilisateur.
- Mettre à jour des propriétés de profil utilisateur supplémentaires (facultatives).
Avant de commencer
Pour commencer, téléchargez l’exemple de add-in Core.ProfilePictureUploader à partir du projet Pratiques et modèles de développement Office 365 sur 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.
Avant d’exécuter cet exemple de code
- Stockez les images de vos utilisateurs que vous envisagez de télécharger vers SharePoint Online sur un partage de fichiers ou un serveur web.
- Modifiez le userlist.csv pour inclure les fichiers 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 à télécharger.
Exécutez cet exemple à partir Visual Studio
Configurez le projet Core.ProfilePictureUploader avec les arguments de ligne de commande suivants -SPOAdmin Username -SPOAdminPassword Password -Configuration filepath : où :
- Le nom d’utilisateur Office 365 nom d’utilisateur de votre administrateur.
- Le mot de passe est Office 365 mot de passe de l’administrateur.
- Filepath est le chemin d’accès au configuration.xml fichier.
Définir les arguments de ligne de commande sur le projet Core.ProfilePictureUploader
Dans l’Explorateur de solutions, ouvrez le menu raccourci (clic droit) du projet Core.ProfilePictureUploader > propriétés.
Choose Debug.
Dans les arguments de ligne de commande, entrez les arguments de ligne de commande répertoriés précédemment.
Configurer le processus de téléchargement pour répondre à vos besoins
Modifiez le configuration.xml en entrant les valeurs suivantes :
Nom de votre client 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éfinie sur true si vous souhaitez télécharger trois images pour chaque utilisateur, ou sur false si vous ne souhaitez télécharger qu’une seule image.
createSMLThumbs : définie sur true si vous souhaitez créer trois images de taille différente (petite, moyenne et grande) de l’image source, ou définie sur false si vous souhaitez télé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 lorsque l’exemple de code s’exécute.
<additionalProfileProperties> <property name="SPS-PictureExchangeSyncState" value="0"/> </additionalProfileProperties>Chemin d’accès du 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>
Important
La connexion au service web userprofileservice.asmx sur 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 Office 365 administrateur qui dispose des autorisations pour gérer les profils utilisateur.
Utilisation de l’exemple de add-in 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 exécute les procédures suivantes :
Initialise l’application console à l’aide de SetupArguments et InitializeConfiguration.
Appelle InitializeWebService pour se connecter au service de profil utilisateur dans SharePoint Online.
Iterates through the userlist.csv file to read the user principal name (UPN) for the user and the location of the user’s image file.
Récupère l’image d’un utilisateur à l’aide des objets WebRequest et WebResponse dans GetImagefromHTTPUrl.
Appelle UploadImageToSpo pour télécharger l’image de l’utilisateur sur 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 une fois le fichier image téléchargé.
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 à une variable d’instance. D’autres méthodes de cet exemple de code utilisent cette variable d’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 télécharger l’image de profil de l’utilisateur 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 à télécharger pour chaque utilisateur.
- Si vous avez configuré l’application pour télécharger une image par utilisateur, l’image est téléchargée vers la bibliothèque d’images.
- Si vous avez configuré l’application pour télé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érentes 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érentes à partir de l’image source. L’application télécharge ensuite les images reserrées dans la bibliothèque d’images. Si trois images de taille différente ne sont pas requises, l’application télé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 seul appel de méthode. Dans cet exemple de code, SetMultipleProfileProperties définit les propriétés de profil utilisateur suivantes pour un utilisateur :
PictureURL : définir sur l’URL de l’image téléchargée de taille moyenne dans la bibliothèque d’images sur l’hôte mon site.
SPS-PicturePlaceholderState : définie sur zéro pour indiquer SharePoint Online doit afficher l’image télé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 les propriétés de profil utilisateur supplémentaires que vous souhaitez mettre à jour après le téléchargement des fichiers image. Vous pouvez spécifier des propriétés supplémentaires à mettre à jour dans configuration.xml fichier.
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);
}
}