ADPhoto

Achtung: AD-Datenbankwachstum.
Die Ablage von Bilder im AD vergrößert die NTDS.DIT und ein 32bit DC wird langsam, wenn die Datenbank über 1 GB groß ist.

Mit Exchange 2013 und Lync 2013 hat Microsoft das Verfahren geändert. Bilder werden im Postfach des Benutzers abgelegt und von Exchange auch in das Feld "ThumbnailPhoto" geschrieben und von Exchange 2013, Outlook 2013 und Lync 2013 von dort genutzt. Siehe Lync Photo, Office 365 Profilfoto und Export-ExchangeUserPhoto.

Outlook 2010, Lync 2010 und diverse andere Lösungen können neben dem Namen und Mailadressen auch Bilder angezeigt werden. Hier zwei Beispiele: Einmal der Lync 2010 Client mit Herrn Deutinger (Ferrari Electronic) als Partner in der Federation und Herr Ulbrich in Outlook.

Da stellt sich natürlich die Frage, wo dieses Bild hinterlegt ist. Im Fall von Outlook könnte man noch tricksen, indem man einen Kontakt mit dem Bild anlegt. In Lync kann ich ein Bild auf einem Webserver ablegen und über eine URL erreichbar machen und so "verbreiten".

Wer nicht über AD-Photos arbeiten möchte, kann das Bild auch einfach auf einem beliebigen Webserver bereit stellen und im Lync Client als URL angeben. So habe ich das z.B.: bei mir gemacht.

Hinweis:
Der Download von Bildern von anderen URLs ist nur möglich, wenn auf der gesamten Kette von Lync Client bis zum veröffentlichenden Webserver keine Authentifizierung erforderlich ist. Der Lync Client hat keine Möglichkeit, vom Anwender für das Abrufen der Bilder entsprechende Anmeldedaten abzufragen. Das wäre bei vielen per Federation verbundenen Kontakten mit unterschiedlichen Quellen auch nur schwer möglich. Wer also Bilder für Partner erreichbar machen will, muss diese ohne Authentifizierung im Internet bereit stellen.

Zumindest für Mitarbeiter ist es aber schon seit Windows 2003 möglich, solche Informationen im Active Directory mit zu hinterlegen.

Berechtigungen:
Ein Benutzer kann sein Bild nicht selbst aktualisieren. Es muss also ein administrativer Benutzer sein, welcher auf das Feld "ThumbnailPhoto" zum Schreiben berechtigt ist.

Solche Updates muss also ein entsprechend auf das Benutzerobjekt privilegiertes Konto durchführen. Zudem kann ein Administrator auf der Client Policy steuern, ob Bilder angezeigt werden.

Über SET-CSCLientPolicy und Get-CSClientPolicy sind diese Einstellungen zugänglich.

Hintergrund "ThumbnailPhoto"

Das Feld welches von Outlook, Exchange und Lync genutzt wird, ist das Property "ThumbnailPhoto". Allerdings gibt es noch andere Felder, die ähnliche Funktionen haben und daher leicht verwechselt werden können:

Feldname Schema Version Typ/Größe Verwendung

Thumbnailphoto (Picture Attribut)

http://msdn.microsoft.com/en-us/library/ms680034.aspx

Format JPG oder PNG

Windows 2000
und höher

Oktet 0-102400 Byte
Einwertig
Im GC ab Windows 2008

Einsatz in OCS/Outlook

jpegPhoto (jpegPhoto Attribut)
http://msdn.microsoft.com/en-us/library/ms676813.aspx

Windows 2003
und höher

Oktet ohne Grenzen
Mehrwertig

nicht genutzt

Thumbnaillogo (Logo Attribut)
http://msdn.microsoft.com/en-us/library/ms680033.aspx

Windows 2000
und höher

0-32767
Einwertig

nicht genutzt

Relevant ist, wie gesagt, nur das Feld "Thumbnailphoto", dessen genaue Definition im Schema zu sehen ist:

Exchange will automatically create a 64 pixel by 64 pixel version of that photo and update the User's thumbnailPhoto attribute.
Quelle: Configure the use of high-resolution photos in Skype for Business Server 2015
https://docs.microsoft.com/en-us/skypeforbusiness/deploy/integrate-with-exchange-server/high-resolution-photos

Berechtigungen

Da stellt sich natürlich die Frage, wer das Feld beschreiben kann. Eine kurze Kontrolle in meinem eigenen produktiven LAN zeigte mir, dass ich als Benutzer mein eigenes Foto nicht bearbeiten kann.

Aktuell ist es also dem Administrator überlassen, die Bilder zu aktualisieren. Es gibt aber zwei Lösungen für das Problem

  • Provisioning über Anwendungsrechte
    Denkbar wäre aber ein Automatismus, dass ein Mitarbeiter einfach ein "meinbild.jpg" in sein Home-Verzeichnis ablegt und ein privilegierter Prozess einfach einmal in der Nacht die Homverzeichniss absucht und geänderte Bilder automatisch importiert. Alternativ wäre es ne nette Lösung, eine solche Funktion z.B. über eine Sharepoint Seite oder ASPX-Anwendung bereit zu stellen, d.h. ein Anwender meldet sich auf einer Webseite mit seinen Anmeldedaten an, stellt ein JPG-Bild bereit, welches nicht größer als 100k ist und die Webanwendung lädt das Bild dann entsprechend hoch und könnte dem Benutzer z.B.: per Mail oder als Ergebnis der Webseite informiert.
  • Berechtigungen an SELF delegieren
    Wer sich mit der Verfahren von Berechtigungen auskennt, kann auf der Domäne oder einer OU einfach dem Benutzer "Self" das Recht gebe, auf Benutzerobjekten das Feld "ThumbNailPhoto" zu schreiben. Siehe auch Active Directory thumbnailPhoto attribute permissions http://www.thumbnailphoto.net/2010/11/active-directory-thumbnailphoto-attribute-permissions/

Die Vergabe von Berechtigungen hätte den Vorteil, dass diverse Tools eingesetzt werden können, mit denen der Anwender selbst sein Bild aktualisieren kann. Allerdings haben Sie dann keine Garantie, das das Bild technisch korrekt (Format und Größe) und logisch korrekt (d.h. keine Spaßbilder, schlechte Qualität etc.) ist. Wer allerdings eh Sharepoint 2010 einsetzt, kann damit die MyPhotos in das AD replizieren lassen und so dem Anwender heute schon eine Option zur Pflege seines Bildes geben.

Export mit PowerShell

Ehe Sie die AD-Bilder vielleicht überschreiben, sollten Sie mal schauen, welche Anwender schon ein Bild irgendwie abgelegt habem:

# Anzahl der Obekte 
(Get-ADuser -LDAPFilter "(thumbnailphoto=*)").count 

# Liste der Objekte 
Get-ADuser -LDAPFilter "(thumbnailphoto=*)" | select samaccountname

Das Attribute enthält direkt das Bild als binäres Array und kann über system.io-file sehr einfach wieder in einer Datei exportiert werden

$User=Get-ADUser frankcarius -properties thumbnailphoto
$Filename='C:\temp\frankcarius.jpg'
[System.Io.File]::WriteAllBytes($Filename, $User.Thumbnailphoto)

Darum eine Schleife zu bauen, die z.B. alle Bilder mit dem Namen des Benutzers exportiert, ist dann recht einfach.

[string]$path = "C:\temp"
foreach ($aduser in (Get-ADuser -LDAPFilter "(thumbnailphoto=*)" -properties thumbnailphoto)){
   [string]$filename = $path + "\" + $aduser.samaccountname + ".jpg"
   [System.Io.File]::WriteAllBytes($Filename, $aduser.Thumbnailphoto)
}

Achtung: Jeder Anwender hat "Leserechte" im Active Directory und könnte sich daher diese Bilder auch extrahieren.

Import mit Bordmittel

Da diese Funktion erstmalig mit Exchange 2010 und Outlook 2010 verfügbar wurde, gibt es auch ein Exchange Commandlet zum Import.

Import-RecipientDataProperty 
  -Identity Username 
  -Picture -FileData ([Byte[]]$(Get-Content -Path "c:\User.jpg" -Encoding Byte -ReadCount 0))

Seit Exchange 2013 ist dies noch einfacher möglich und folgende kleine Schleife liest alle Bilder in einem Verzeichnis ein. Der Dateiname sollte der Userpart des UPN oder der Mailadresse sein, damit die Datei auf das richtige Postfach gemachted wird

$fotolist = (get-childitem  "c:\bilder" -filter "*.jpg")
foreach ($foto in $fotolist) {
   write-host "Importing " $foto.name
   Set-UserPhoto `
      -Identity ($foto.basename + "@netatwork.de") `
      -PictureData ([System.IO.File]::ReadAllBytes($foto.fullname)) `
      -Confirm:$False
}

Wer also die Bilder schön z.B. mit dem SamAccountName benannt hat, kann recht einfach eine Schleife durch das Verzeichnis der Bilder drehen und die dazu gehörigen Benutzer entsprechend aktualisieren. Allerdings kann dieses Commandlet das Bild nicht auf die richte Größe zusammenschrumpfen. Sie müssen schon selbst dafür sorgen, dass das Bild maximal 10 kB groß ist.

Import mit Sharepoint 2010

Sharepoint kennt schon länger den Bereich "MySite", der für jeden Mitarbeiter eine persönliche Homepage im Firmennetzwerk darstellt. Das kann einfach nur eine Seite mit den Kontaktdaten sein. Mitarbeiter können hier aber auch ihre Tätigkeit beschreiben. MySites helfen dabei, in größeren Firmen vorhandenes Wissen auch zu erreichen. Sehr oft sucht jemand etwas und kauft externe Beratung ein, obwohl ein Kollege das auch schon mal gemacht hat. "Skill-Search" wird dies auch genannt und funktioniert natürlich nur, wenn Anwender ihre MySite auch pflegen. Lync und die Sharepoint Suche kann diese Datenquellen dann auch anzapfen, um Personen zu finden.

Und diese MySite erlaubt es dem Mitarbeiter auch, ein Bild hochzuladen. 

“In order to synchronize User profile pictures between Microsoft SharePoint Server, AD DS, and Outlook 2010 by using the Microsoft Outlook Social Connector, you must set the Data Source Connection für the Picture property mapping to Export.“
http://technet.microsoft.com/en-us/library/ff182925(office.14).aspx

Der Anwender geht dann einfach z.B. auf dem Internet auf sein Profil:

Im Profi können Sie dann auf "Mein Profil bearbeiten" klicken um dann das Bild auszuwählen der zu löschen

Damit aber das Bild auch Sharepoint Richtung Active Directory übertragen wird, muss der Sharepoint Administrator eine Verbindung zwischen dem Bild in Sharepoint und dem Feld im Active Directory herstellen. In Sharepoint erfolgt dies an folgender Stelle:

Central Administrator\Manage Service Applications\User Profile Service Application\Manage User Properties page

Dort muss das Feld "thumbnailPhoto" addiert und dann ein manueller Abgleich angestoßen werden.

Anzeige in Outlook und Exchange

Auch Microsoft Exchange und Outlook 2010 können diese Feld nutzen. Bharat Suneja hat dies auf seinem Blog sehr gut beschrieben, so dass ich mir hier weitere Bilder erspare.

Per Default werden die Bilder nicht in die Offline Adressbücher importiert, was allein aus Platzgründen schon ratsam ist. Selbst ein 96x96 Bild mit 10k bedeutet bei 10.000 Benutzern, dass das OAB überschlagsweise um 100.000kb oder 100MB wächst. Statt dessen wir Outlook angewiesen, dass es diese Daten aus dem AD beziehen soll. Das kann man aber auch mit unterbinden, indem man im OAB den "Indexeintrag" mit folgenden PowerShellzeilen entfernt:

$attributes = (Get-OfflineAddressBook "Default Offline Address Book").ConfiguredAttributes
$attributes.Remove("thumbnailphoto,Indicator")
Set-OfflineAddressBook "Default Offline Address Book" -ConfiguredAttributes $attributes

3rd Party Produkte

Wo Bordmittel an ihre Grenzen stoßen, öffnet sich ein Markt für Drittanbieter oder Freeware-Tools. Unter all den vielen Programmen und Skripten, die die JPG-Bilder in das passende Feld im AD importieren, gibt es mit ADPhotoEdit ein nettes Programm, welches die Verwaltung per GUI stark vereinfacht und sogar die Bilder zurecht schrumpfen kann.

Das Programm "AD Photo Edit" kann per GUI einfach Bilder anzeigen und auch verändern und wieder speichern.
http://www.cjwdev.co.uk/Software/ADPhotoEdit/Info.html

Andere Programme sind z.B.

Das kleine ZIP-Paket muss einfach ausgepackt und das Setup aufgerufen werden.

Das Programm prüft beim Aufruf nach Updates, indem es versucht auf www.cjwdev.co.uk zuzugreifen.

Dieses Verhalten kann man nach dem Start in den Optionen aber abschalten und der Fehler hier ist nur sichtbar, weil ich es in einer abgeschotteten Umgebung verwendet habe.

Das Programm selbst ist ein kleines .NET Programm mit grade mal wenigen kb Größe. Wobei natürlich das .NET Framework vorhanden sein muss.

Nach dem Start suche sie nach den Benutzern. Wenn Sie im Filterfeld ein "*" eintragen, dann werden alle Benutzer gesucht.

Sie sehen dann sofort die Benutzer und neben dem SAMAccountName auch die Mailadresse und das Bild, sofern vorhanden. Das Bild ist dabei nicht auf eine bestimmte Größe (in Pixel) beschränkt, sondern in der Dateigröße (max. 100kb). Da fehlt dann wirklich nur noch der Bulk Import.

Weitere Links