Importer vos photos de profils en lot dans SharePoint 2013

ProfilSharePointVide     ftline_line_arrow_end    ProfilSharePoint

Scénario :

Vous avez un grand nombre d’employés dans votre entreprise et vous voulez leur simplifier la tâche en important leur photo de profil en lot. Vous avez au préalable obtenu leur consentement et vous êtes chargé d’effectuer cette opération!

Prérequis :

  • Vous disposez d’un environnement « On-premises » et avez accès au compte de la ferme.
  • Les noms de photos suivent la nomenclature suivante : NomDomaine_NomUtilisateur.jpg
    • Généralement ce n’est pas le cas, alors je vous suggère de les renommer avec un script PowerShell.

Solution :

  • Créer une application console nommé « ProfilUtilisateur.ImporterPhoto » en C# .Net dans un environnement SharePoint de développement.
  • Copier le code suivant dans le fichier Program.cs (Version modifié du blog « My Share Points ») :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Reflection;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Portal.WebControls;
using System.IO;
using Microsoft.Office.Server.UserProfiles;

namespace ProfilUtilisateur.ImporterPhoto
{
    /// <summary>
    /// Sources :
    /// http://lixuan0125.wordpress.com/2013/04/08/upload-user-profile-pictures-programmatically-sharepoint-2013/
    /// http://pholpar.wordpress.com/2010/03/10/how-to-upload-a-user-profile-photo-programmatically/
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Program prog = new Program();

            Console.Write(@"Profile images path (Ex : C:\photo) : ");
            string profileImagesPath = Console.ReadLine(); //E.g : "C:\\photo"

            Console.Write("MySite URL (Ex : http://monsite/) : ");
            string mySiteUrl = Console.ReadLine(); //E.g : "http://monsite/"

            prog.UploadProfileImages(profileImagesPath, mySiteUrl);
        }

        private void UploadProfileImages(string path, string urlMySite)
        {
            using (SPSite site = new SPSite(urlMySite))
            {
                SPServiceContext serverContext = SPServiceContext.GetContext(site);
                UserProfileManager userProfileManager = new UserProfileManager(serverContext);

                using (SPWeb web = site.OpenWeb())
                {
                    SPFolder subfolderForPictures = web.Folders["User Photos"].SubFolders["Images du profil"];
                    // Get all image files in a folder
			  //The name of the images folder may be different depending on the language of your SharePoint installation.

                    DirectoryInfo dir = new DirectoryInfo(path);
                    FileInfo[] Images = dir.GetFiles();
                    foreach (FileInfo img in Images)
                    {
                        string imageFilePath = path + "\\" + img.Name;

                        string fileName = Path.GetFileNameWithoutExtension(img.Name);
                        string accountName = fileName.Replace("_", "\\");

                        // if User Profile exists then upload the images
                        if (userProfileManager.UserExists(accountName))
                        {
                            UploadPhoto(accountName, imageFilePath, subfolderForPictures);
                            SetPictureUrl(accountName, subfolderForPictures, userProfileManager.GetUserProfile(accountName));
                        }
                       // else
                        //{ Console.WriteLine("User {0} does not exist.", accountName); }
                    } // end of loop
                }
            }
        } // end of function

        private void UploadPhoto(string accountName, string imageFilePath, SPFolder subfolderForPictures)
        {
            if (!File.Exists(imageFilePath) || Path.GetExtension(imageFilePath).Equals(".gif"))
            {
                Console.WriteLine("File '{0}' does not exist or has invalid extension", imageFilePath);
            }
            else
            {
                string fileNameWithoutExtension = GetFileNameFromAccountName(accountName);

                FileStream file = File.Open(imageFilePath, FileMode.Open);
                BinaryReader reader = new BinaryReader(file);

                if (subfolderForPictures != null)
                {
                    // try casting length (long) to int
                    byte[] buffer = reader.ReadBytes((int)file.Length);

                    int largeThumbnailSize = 300;
                    int mediumThumbnailSize = 72;
                    int smallThumbnailSize = 48;

                    using (MemoryStream stream = new MemoryStream(buffer))
                    {
                        using (Bitmap bitmap = new Bitmap(stream, true))
                        {
                            CreateThumbnail(bitmap, largeThumbnailSize, largeThumbnailSize, subfolderForPictures, fileNameWithoutExtension + "_LThumb.jpg");
                            CreateThumbnail(bitmap, mediumThumbnailSize, mediumThumbnailSize, subfolderForPictures, fileNameWithoutExtension + "_MThumb.jpg");
                            CreateThumbnail(bitmap, smallThumbnailSize, smallThumbnailSize, subfolderForPictures, fileNameWithoutExtension + "_SThumb.jpg");
                        }
                    }
                }
                Console.WriteLine("Uploading image '{0}' for user '{1}'", imageFilePath, accountName);
            }
        } // end of function

        /// Get sealed function to generate new thumbernails
        public SPFile CreateThumbnail(Bitmap original, int idealWidth, int idealHeight, SPFolder folder, string fileName)
        {
            SPFile file = null;

            Assembly userProfilesAssembly = typeof(UserProfile).Assembly;

            Type userProfilePhotosType = userProfilesAssembly.GetType("Microsoft.Office.Server.UserProfiles.UserProfilePhotos");
            MethodInfo[] mi_methods = userProfilePhotosType.GetMethods(BindingFlags.NonPublic | BindingFlags.Static);

            MethodInfo mi_CreateThumbnail = mi_methods[0];
            if (mi_CreateThumbnail != null)
            {
                file = (SPFile)mi_CreateThumbnail.Invoke(null, new object[] { original, idealWidth, idealHeight, folder, fileName, null });
            }

            return file;
        } // end of function

        /// Update User Profile Property
        private void SetPictureUrl(string accountName, SPFolder subfolderForPictures, UserProfile userProfile)
        {
            accountName = accountName.Replace("\\", "_");

            string account = accountName.Substring(0, accountName.IndexOf("_")) + "\\" + accountName.Substring(accountName.IndexOf("_") + 1);

            string pictureUrl = String.Format("{0}/{1}/{2}_MThumb.jpg", subfolderForPictures.ParentWeb.Site.Url, subfolderForPictures.Url, accountName);

            userProfile["PictureUrl"].Value = pictureUrl;
            userProfile.Commit();
        } // end of function

        private string GetFileNameFromAccountName(string accountName)
        {
            string result = accountName;
            string charsToReplace = @"\/:*?""<>|";
            Array.ForEach(charsToReplace.ToCharArray(), charToReplace => result = result.Replace(charToReplace, '_'));
            return result;
        }
    }
}
  • Ouvrir une fenêtre de commande DOS en tant que l’administrateur de la ferme et glisser-déplacer le fichier « ProfilUtilisateur.ImporterPhoto.exe » généré préalablement.
    • Appuyé sur la touche « Entrer »
    • Saisir le chemin du dossier contenant vos photo Ex : C:\photo
    • Saisir le chemin vers votre site MySite Ex : http://<monsite&gt;
  • Naviguer vers le dossier des photos SharePoint Ex : http://<monsite>/Users photos/ pour constater que toute les photos ont été importées et que les miniatures ont été générées avec succès.

Dans mon prochain billet nous verrons comment il est possible de synchroniser ces photos importées dans SharePoint vers Lync, l’Active directory ainsi que dans votre profil Windows!

Le code source d’origine provient du site : http://lixuan0125.wordpress.com/

Advertisements

Laisser un commentaire

Entrer les renseignements ci-dessous ou cliquer sur une icône pour ouvrir une session :

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l’aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s