[SharePoint 2010] Automatiser la mise à jour des photos de profils utilisateurs avec PowerShell
Première constatation: SharePoint 2010 est la dernière version de SharePoint à intégrer la
ligne de commande STSADM pour son administration. En 2014, bye bye STSADM !!! Il est donc temps de
commencer à regarder vers PowerShell pour voir a quel point l'administration de SharePoint peut être simplifiée avec les CmdLet spécialisées.
Deuxième constatation: Que ce soit pour l'implémentation des MySites en environnement de production ou à des fins de démo, il pourrait vous arriver d'avoir besoin de mettre à jour en masse les photos des profils utilisateurs de SharePoint Server 2010.
Mon idole utilise SharePoint !
Voici donc un petit tutorial permettant de réaliser cette tâche de façon automatisée avec PowerShell.
La première étape consiste a retailler les photos pour qu'elles s'intègre parfaitement à l'affichage et ce dans tous les cas (My Profile, Organization Browser, ...):
Par défaut, lorsqu'un utilisateur uploade sa photo via le formulaire sur son site personnel, SharePoint génère automatiquement 3 miniatures de taille différentes. Ces photos sont sauvegardées dans la bibliothèque "User Photos" du site hôte des MySites dans un dossier "Profile Pictures".
Ces 3 photos seront donc retaillées en gardant la proportion. Pour chaque photos, le coté le plus grand (c'est à dire la largeur en mode paysage ou la hauteur en mode portrait) auront respectivement les tailles suivantes:
- 144px pour la photo principale du profil sur le MySite,
- 96px pour la photo de l'utilisateur sélectionné dans le navigateur hiérarchique Silverlight (Org Browser),
- 32px pour les photos des utilisateurs de la hierarchie dans l'Org Browser.
L'idéal pour avoir une belle photo bien intégrée dans tous les cas étant de fournir des photos carrées avec une taille de coté supérieure ou égale à 144px.
Pour réaliser le retaillage de façon automatique sur un grand nombre de fichiers, vous pouvez utiliser des outils pros tel que PhotoShop ou un des multiples outils gratuits du net tel que: FotoSizer ou FastStone Photo Resizer
La deuxième étape consiste à uploader les fichiers dans la bibliothèque "User Photos" du site hôte des MySites. Vous pouvez biensur le faire manuellement, mais c'est tellement pus fun de le faire via PowerShell !!!
Voici un exemple de code uploadant l'ensemble des fichiers d'un dossier:
$mysiteurl = "http://sharepoint/my/"
$web = Get-SPWeb $mysiteurl
$folder = $web.GetFolder("User Photos")
$spfiles = $folder.Files
$files = ls "Profiles Pictures - 200x200"
foreach($f in $files) {
$spfile = $spfiles.Add(“User Photos/$($f.Name)”,$f.OpenRead(),$true)
}
J'ouvre le Web avec la cmdlet Get-SPWeb puis je récupère dossier racine de la bibliothèque en lui passant le nom de celle-ci. Je peux ensuite récupérer la liste des fichiers du dossier avec la collection Files.
La cmdlet ls me permet de boucler sur l'ensemble des fichier du dossier en local. Puis j'utilise la méthode Add de SPFileCollection, qui possède une multitude de surcharges, pour ajouter/uploader le fichier. Dans ce cas, je passe à cette méthode le nom du fichier cible, la FileStream du contenu du fichier local, et un booléen indiquant s'il faut ou non écraser le fichier existant.
La troisième étape consiste à faire le lien entre mes profils existants et mes photos tout juste uploadées:
Pour cela, j'ai décidé de nommer mes photos en respectant la nomenclature [login].jpg.
Voici un exemple de code bouclant sur l'ensemble des profils utilisateurs et modifiant la valeur du champ "PictureURL" en utilisant le login (AccountName) comme nom de fichier JPEG:
$mysiteurl = "http://sharepoint/my/"
$domain = "CONTOSO\\"
$site = Get-SPSite $mysiteurl
$context = Get-SPServiceContext $site
$ProfileManager = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context)
$profiles = $ProfileManager.GetEnumerator()
foreach ($userProfile in $profiles) {
$login = $userProfile["AccountName"].Value
$login = $login -replace $domain
$url = $mysiteurl + "User%20Photos/" + $login + ".jpg"
$userProfile["PictureURL"].Value = $url
$userProfile.Commit()
}
A ce moment de la procédure, vos profils ont effectivement une photo mais celle-ci a toujours sa taille d'origine et cela peut provoquer des soucis d'affichage, notamment sur l'OrgBrowser Silverlight qui ne resize pas automatiquement la photo:

La quatrième étape consiste donc à demander à SharePoint de générer les 3 miniatures aux tailles adéquates:
Pour cela, SharePoint propose une cmdlet magique qui va générer les 3 miniatures pour l'ensemble des profils utilisateurs et mettre à jour les propriétés du profil correspondantes.
Update-SPProfilePhotoStore –MySiteHostLocation "http://sharepoint/my/"
Et voila, vous savez tout pour mettre à jour rapidement et simplement les photos des profils utilisateurs SharePoint.
Je ne veux donc plus voir trainer une seule silhouette de Bill Gates 

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :