Active Directory : comment importer des photos de ses utilisateurs ?

I. Présentation

L'Active Directory contient de nombreux attributs, l'un de ces attributs se nomme "thumbnailPhoto", c'est-à-dire "photo miniature" : il va permettre d'intégrer une photo au sein des objets utilisateurs. Pour gérer les photos que l'on peut qualifier d'avatars, il existe des logiciels tiers, mais il y a notre ami PowerShell qui lui est gratuit.

Cette photo sera utilisée dans diverses applications comme le client lourd Outlook, Outlook Web Access, SharePoint, etc... Voire même en tant qu'avatar pour la session Windows (mais cela nécessite des étapes supplémentaires).

Attention : le fait d'ajouter des photos dans l'Active Directory, et même si les fichiers sont légers, cela peut augmenter considérablement le poids de la base de données NTDS.dit. Le trafic lié à la réplication sera plus conséquent afin de répliquer les changements.

II. Ajouter une photo dans l'Active Directory avec PowerShell

Commençons par prendre une photo et ajouter cette photo au sein d'un compte utilisateur de l'Active Directory. Avant cela, il faut préparer le fichier photo :

  • Sa taille recommandée est de 96 x 96 pixels au maximum
  • Son poids recommandé est 10 Ko au maximum (pour une si petite taille, c'est suffisant) avec le format JPEG (ou BMP)

Maintenant que vous avez un fichier photo idéal entre vos mains, vous pouvez ouvrir PowerShell ISE pour importer votre première photo dans l'AD.

Cette opération nécessite l'utilisation du module Active Directory :

Import-Module ActiveDirectory

Le fichier ne sera pas intégré tel quel dans la base de données de l'AD, nous devons récupérer la photo sous la forme d'une valeur en octets. On va stocker cette valeur dans la variable $Photo.

Voici un exemple avec le fichier "C:\Scripts\FB-96x96.jpg" :

$Photo = [byte[]](Get-Content "C:\Scripts\FB-96x96.jpg" -Encoding Byte)

Ensuite, nous allons modifier l'utilisateur existant "Florian" pour injecter la photo dans son profil. On va remplacer la valeur existante (au cas où il y ait déjà une photo) de l'attribut thumbnailPhoto avec la valeur de $Photo.

Set-ADUser Florian -Replace @{thumbnailPhoto=$Photo}

Si l'on s'intéresse aux propriétés de cet utilisateur via la console Utilisateurs et ordinateurs Active Directory, dans l'éditeur d'attributs, on peut visualiser l'attribut thumbnailPhoto. On peut voir qu'il a une valeur :

Même s'il est difficile de s'en rendre compte visuellement depuis cette console, la photo est bien intégrée dans l'Active Directory.

Note : si vous avez un serveur Exchange, il est possible de gérer directement les photos avec d'autres commandes. Sur les versions plus récentes, il y a la commande Set-UserPhoto alors qu'avant Exchange 2013, il fallait utiliser la commande Import-RecipientDataProperty.

III. Ajouter un onglet "Photo" dans l'interface graphique

Si vous souhaitez gérer les photos en mode graphique ou simplement voir les photos, sachez qu'il existe une librairie qui permet d'ajouter un onglet "Photo" à l'interface de la console Utilisateurs et ordinateurs Active Directory.

Commencez par télécharger le fichier ADEXT.ZIP.

Récupérez le fichier "AdExt.dll" qui est dans ce fichier pour le stocker sur votre contrôleur de domaine, dans le dossier de votre choix.

Ensuite, il faut installer cette librairie. Nous devons utiliser InstallUtil.exe de .NET Framework. Voici son emplacement en fonction de votre version de Windows (32 ou 64 bits) :

  • 32 bits : C:\Windows\Microsoft.NET\Framework\v4.0.30319
  • 64 bits : C:\Windows\Microsoft.NET\Framework64\v4.0.30319

Positionnez-vous dans le bon dossier :

cd "C:\Windows\Microsoft.NET\Framework64\v4.0.30319"

Installez la librairie en précisant le chemin vers le fichier "AdExt.dll", par exemple :

.\InstallUtil.exe C:\scripts\AdExt.dll

La librairie est installée ! Si la console Utilisateurs et ordinateurs Active Directory est ouverte, vous devez la fermer et la rouvrir. Ensuite, accédez aux propriétés de l'utilisateur, pour ma part "Florian" et cliquez sur l'onglet "Photo" : voilà notre photo importée précédemment ! 😉

Pour information, on peut faire machine arrière et supprimer cet onglet avec la commande suivante :

.\InstallUtil.exe /u C:\scripts\AdExt.dll

La partie "jpeg Photo" de l'interface fait référence à l'attribut "jpegPhoto", mais c'est bien l'attribut "thumbnailPhoto" qui nous intéresse ici.

D'ailleurs, dans le cadre de l'utilisation d'Azure AD Connect, il faut savoir que les photos sont également synchronisées sur le tenant Office 365. Par exemple :

IV. Gérer en masse les photos des utilisateurs Active Directory

Nous avons vu comment importer une photo dans l'Active Directory avec PowerShell, mais ce qui est intéressant, c'est de réaliser un import en masse des données.

L'idée est la suivante :

  • Créer un dossier et stocker toutes les photos de vos utilisateurs
  • Créer un fichier à deux colonnes : le login de l'utilisateur et le nom du fichier photo associé

Par exemple voici le fichier "Photos.csv" :

Login;Photo
Florian;FB-96x96.jpg
Salarie01;Salarie01.jpg
Salarie02;Salarie02.jpg

Ci-dessous, un bout de code qui va permettre de parcourir notre fichier CSV et d'importer les données dans l'Active Directory.

# On importe le fichier CSV
$CSV = Import-Csv -Path "C:\Scripts\Photos.csv" -Delimiter ";"
# Chemin du dossier qui contient les photos
$FolderPhotos = "C:\Scripts"

# On traite chaque ligne du CSV
Foreach($Utilisateur in $CSV){

   # On stocke dans des variables le login et le chemin complet vers la photo   
   $UtilisateurLogin = $Utilisateur.Login
   $UtilisateurPhoto = "$FolderPhotos\$($Utilisateur.Photo)"

   # Si on trouve la photo, on l'intègre à l'AD (sans vérifier si l'utilisateur existe)
   if(Test-Path $UtilisateurPhoto){
      Write-Host "OK - Photo trouvée ($UtilisateurPhoto) pour $UtilisateurLogin"
      Set-ADUser -Identity $UtilisateurLogin -Replace @{thumbnailPhoto=([byte[]](Get-Content $UtilisateurPhoto -Encoding byte))}
   }else{
      Write-Warning "Photo non trouvée ($UtilisateurPhoto) pour $UtilisateurLogin"
   }
}

S'il y a un problème (une photo introuvable), le script va renvoyer un avertissement, comme ceci :

Comme d'habitude, vous pouvez le modifier à votre convenance.

Une autre manière de faire, toujours en PowerShell...

On pourrait procéder autrement et se passer d'un fichier CSV. Il suffit de mettre toutes les photos dans un dossier et de nommer chaque photo avec le login de l'utilisateur cible.

Ensuite, on récupère la liste de tous les utilisateurs activés dans l'AD (tout l'AD ou sinon on peut filtrer...), et pour chaque utilisateur on va regarder s'il y a une photo qui correspond à son login (SamAccountName) dans le dossier. Si c'est le cas, on importe la photo.

Ce qui donne :

# Chemin du dossier qui contient les photos
$FolderPhotos = "C:\Scripts"

# Récupérer la liste des logins de tous les utilisateurs dans l'AD
$ADUserList = (Get-ADUser -Filter 'Enabled -eq $true' | Select-Object SamAccountName).SamAccountName

Foreach($ADUser in $ADUserList){
   
   # Si on trouve une photo pour cet utilisateur dans le dossier, on l'importe
   if(Test-Path "$FolderPhotos\$ADUser.jpg"){
      Write-Host "OK - Photo trouvée ($ADUser.jpg) pour $ADUser"
      Set-ADUser -Identity $ADUser -Replace @{thumbnailPhoto=([byte[]](Get-Content "$FolderPhotos\$ADUser.jpg" -Encoding byte))}
   }
}

Une autre façon de faire, qui fonctionne tout aussi bien 😉

Pour finir, un petit bonus pour répondre à la question suivante : comment exporter une photo stockée dans l'annuaire Active Directory ? 

On va récupérer la valeur de l'attribut thumbnailPhoto et créer un fichier grâce à Set-Content, toujours en utilisant Byte comme encodage. Par exemple pour l'utilisateur Florian en exportant vers "C:\Scripts\Florian.jpg" :

(Get-ADUser Florian -Properties thumbnailPhoto).thumbnailPhoto | Set-Content "C:\Scripts\Florian.jpg" -Encoding Byte

Enjoy ! 👍

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian B.

Consultant chez Délibérata le jour, blogueur pour IT-Connect la nuit, je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

florian a publié 2896 articlesVoir toutes les publications de cet auteur

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

 

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.