Export-Exchangeuserphoto
Die „Geschichte“ der Personen-Bilder ist wechselhaft. Erst war es ein zu kleinen Feld im AD, dann ein größeres Feld während parallel in SharePoint in der MySite auch Platz für ein Bild war und ein Replikationsdienst diese mit dem AD abgleichen konnte. Mit AzureAD on Office 365 was wohl absehbar, dass hochauflösende Bilder als LDAP-Property problematisch waren und seit Exchange 2013 (?) könnten Anwender die „GAL-Photos“ selbst verwalten, die dann aber im Exchange Store liegen.
Mit Export-Exchangeuserphoto können Sie als privilegierter Benutzer (EWS Impersonation) diese Photos exportieren und anzeigen. Es gibt mehrere Anwendungsfälle, sei es dass Sie als Firma die Bilder einfach auf „Unsinn“ kontrollieren müssen oder aus Reportzecken sehen wollen, wer noch ein Bild braucht oder Sie die Bilder in Exchange als autoritative Quelle für andere Zwecken, z.B. Intranet, nutzen wollen.
Berechtigungen
Wie schon geschrieben, liegen die Bilder im Postfach des Benutzers und sind damit nur für Personen erreichbar, die auch EWS-Impersonation Rechte auf das Postfach haben. Dazu reicht aber nicht „Vollzugriff“ auf das Postfach. Die Bilder liegen in einem per Outlook nicht zugänglichen Bereich. Ohne EWS-Impersonation-Recht auf andere Postfächer können Sie mit diesem Skript nur ihre eigene Photos exportieren. Für einen ersten grundsätzlichen Test reicht das schon mal.
Seit Exchange 2016 gibt es mit "Export-RecipientDataProperty " ein eigenes Commandlet zum Export von Bildern, so dass Sie dieses Skript per EWS nicht benötigen
- Export-RecipientDataProperty
https://technet.microsoft.com/en-us/library/dd298157(v=exchg.160).aspx - Get-UserPhoto
https://technet.microsoft.com/en-us/library/jj218687(v=exchg.160).aspx
Aufruf für mehrere Postfächer
Das Skript akzeptiert eine Maildresse als Parameter oder per Pipeline eine ganze Liste von Mailadressen. Insofern gibt es verschiedene Möglichkeiten für einen Aufruf:
# Export für ein einzelnes Postfach Export-exchangeuserphoto -smtpaddress: "user1@msxfaq.de" # Einzelnes Postfach ueber Pipeline einstellen "user1@msxfaq.de" | Export-exchangeuserphoto # Beispiel fuer zwei Postfaecher (user1@msxfaq.de, user2@msxfaq.de) | Export-exchangeuserphoto # Liste der SMTP-Adressen aus einer Textdatei lesen und uebergeben Get-content userliste | Export-exchangeuserphoto # Liste der vorhandenen Postfaecher ermitteln und uebergeben get-mailbox -ResultSize unlimited ` | %{$_.primarysmtpaddress.tostring()} ` | Export-exchangeuserphoto
Natürlich müssen Sie über die Parameter “Impersonateuser” und „Impersonatepassword“ noch das privilegierte Konto angeben, wenn das aktuell angemeldete Konto nicht über die Rechte verfügt.
Über den Parameter „photodirectory“ können Sie bestimmen, wohin die Bilder abgelegt werden. Per Default wird ein Verzeichnis „Photos“ unter dem aktuellen Verzeichnis angelegt. Bestehende Photos werden immer wieder ohne Warnung überschrieben.
Ausgabe
Im angegebenen Zielverzeichnis landen in der Regel pro Benutzer 8! JPEG-Dateien mit den folgenden Auflösungen:
- 48x48
- 64x64
- 120x120
- 240x240
- 360x360
- 432x432
- 504x504
- 648x648
Damit sollte für jeden Client etwas „dabei“ sein.
Wie Sie die Bilder weiter verarbeiten, bleibt ihnen überlassen.
Download
Ehe ich es vergesse: Hier das Skript zum Download:
export-exchangeuserphoto.20170912.ps1
Nach dem Download bitte die Erweiterung auf PS1 umstellen
Das PowerShell Skript braucht die EWS Managed API, welche auf dem PC zu installieren ist. Der Pfad zur Microsoft.Exchange.WebServices.dll ist wie folgt vorbelegt. Dieser ist ggfls. anzupassen
[string]$EWSManagedApiPath = "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"
Das Skript ist nicht für einen automatischen Einsatz gedacht. Starten Sie es am besten aus einer Powershell. Im Skript selbst werden keine Exchange Commandlets genutzt.
Import von Bildern
Natürlich können Sie auch per EWS aber besser noch per Exchange PowerShell auch wieder Bilder für den Anwender importieren.
Import-RecipientDataProperty ` -Identity "user1@msxfaq.de" ` -Picture -FileData ([Byte[]]$(Get-Content -Path "C:\photos\user1@msxfaq.de.jpg" -Encoding Byte -ReadCount 0))
Auch der Befehl kann natürlich per Pipeline und Schleifen mehrere Benutzer verarbeiten
- Import-RecipientDataProperty
https://technet.microsoft.com/en-us/library/dd351252.aspx
Weitere Links
- Exchange Web Services (EWS)
- EWS und Impersonation
- ADPhoto
- Lync Photo
- Office 365 Profilfoto
- GAL Photos in Exchange 2010 and Outlook
2010
https://blogs.technet.microsoft.com/exchange/2010/03/10/gal-photos-in-exchange-2010-and-outlook-2010/ - Exchange 2010 Outlook AD photo import/export
http://jermsmit.com/exchange-2010-outlook-ad-photo-importexport/ - Get user photos by using EWS in Exchange
https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-get-user-photos-by-using-ews-in-exchange - The Lync Team Blog: Picture This
http://blogs.technet.com/b/lync/archive/2012/06/12/picture-this.aspx - Skype for Business and broken pictures
https://ingogegenwarth.wordpress.com/2018/07/06/sfb-broken-profile-pics/ - Info about the
AllowAdalForNonLyncIndependentOfLync setting
in Skype for Business, Lync 2013, and
Exchange Online
https://support.microsoft.com/en-us/help/3082803/info-about-the-allowadalfornonlyncindependentoflync-setting-in-skype-f
Parameter AllowAdalForNonLyncIndependentOfLync