SharePoint PhotoExport

Es ist eher selten, dass ich als "Nicht"-SharePoint-Consultant auch mal SharePoint programmieren darf. Die Pflege von Bilder von Personen ist schon immer ein kniffliges Thema, da SharePoint, Exchange und das Active Directory entsprechende Bilder ablegen können. Damit stellt sich die Frage des Abgleichs. Andererseits möchten Firmen gerne einen Freigabeprozess etablieren, bei dem die Mitarbeiter ihr Bild vielleicht selbst bestimmen können aber selbst zentral aufbereitete Bilder auf jeden Fall freigeben müssen. Stichwort "Rechte am Bild". Da bietet es sich natürlich an, wenn Mitarbeiter das Bild z.B. in SharePoint hochladen und über eine Anpassung in SharePoint auch der Veröffentlichung zustimmen müssen. DSGVO lässt grüßen.

Anforderung und Recherche

Da SharePoint aber nicht in alles Fällen führend ist, musste ein Skript her, welches die richtigen Bilder aus SharePoint exportiert und in Exchange, AD und anderen Zielen wieder importiert. Es gibt zwar einen Abgleich von Exchange zu SharePoint aber nicht in die Gegenrichtung. Und wenn das Postfach schon in Exchange Online liegt, dann ist es wieder eine Anforderung, die lokalen Bilder auch noch in die Cloud zu schaffen.

Die Idee war, dies per "geplanten Task" und PowerShell erst einmal als "Proof of Concept" zu realisieren und ggfls. später darauf mal einen richtigen "Dienst" zu machen, der mit Eventlog und Perfmon auch einfacher zu überwachen ist. Oder dass allein der Upload und die Freigabe durch den Anwender in SharePoint einen Workflow anstößt, um die Daten in die weiteren Ziele zu senden.

Dazu musste ich natürlich erst einmal verstehen, wie ich per PowerShell eine Dokumentlibrary von SharePoint ansprechen kann.

Störer verhindern

Viel wichtiger ist aber zugleich, dass die Anwender ihr Bild in den verschiedenen anderen Töpfen nicht auch noch mit anderen Werkzeugen ändern. Das ist ja gerade mit Office 365 sehr einfach. Anwender können über das Office 365 und "Mein Konto" natürlich ihr Bild relativ einfach ändern und auch in Exchange ist dank OWA eine Änderungen schnell möglich. Aber diese Möglichkeiten kann ein Administrator schon unterbinden.

# Abschalten der Bilderänderung in Exchange On-Premises kann
Set-OwaVirtualDirectory -id "owa (Default Web Site)" -SetPhotoEnabled $False

Get-OwaVirtualDirectory | fl *pho*
DisplayPhotosEnabled : True
SetPhotoEnabled      : False
SetPhotoURL          : 

Das geht aber so nicht in Exchange Online. Daher ist der Weg über eine OWAMailboxPolicy besser für beide Plattformen

Get-OWAMailboxPolicy | set-owamailboxpolicy -setphotoenabled:$false

Get-OwaMailboxPolicy | fl *pho*
PhoneticSupportEnabled : False
DisplayPhotosEnabled   : True
SetPhotoEnabled        : False
SetPhotoURL            : 

Interessanterweise scheint die Einstellung in Exchange Online auch generell die Möglichkeit in der Cloud zu beschränken, sein Bild zu ändern.

Über die Exchange PowerShell und RBAC lässt sich auch das Commandlet "Set-UserPhoto" steuern. Hier ein Auszug um eine neue Managementrolle von "MyContactInformation" abzuleiten und Set-UserPhoto zu entfernen

New-ManagementRole -Parent "MyContactInformation" -Name LimitedMyContactInformation
Get-ManagementRoleEntry -Identity "LimitedMyContactInformation\Set-UserPhoto" | Remove-ManagementRoleEntry

New-ManagementRole -Parent "MyBaseOptions" -Name LimitedMyBaseOptions
Get-ManagementRoleEntry -Identity "LimitedMyBaseOptions\Set-UserPhoto" | Remove-ManagementRoleEntry

Nun sollte es den Benutzern deutlich schwerer fallen, ihr Bild vorbei zu ändern.

SharePoint MySite und Bilder

Damit steht natürlich immer noch die Aufgabe im Raum, die Bilder aus dem SharePoint zu extrahieren. Ich habe da schon etwas forschen müssen, da es doch sehr viele unterschiedliche SharePoint-Versionen gibt und auch die APIs sich weiter entwickelt haben. Letztlich bin ich bei der "REST-API" hängen geblieben, mit der ich mir Zugriff auf den SharePoint verschafft habe. Aktuell nutzt das Skript nur SharePoint OnPremises mit der üblichen HTTP-Authentifizierung. Aktuell hatte ich noch nicht den Bedarf, die Zugriffe zu SharePoint Online zu erweitern. Hier wäre dann eine Anmeldung per Bearer-Token erforderlich. Entsprechende Blogs dazu gibt es aber schon. Man muss in SFBO sich ein Bearer-Token besorgen, welches dann im Request mit gesendet wird.

Mein Skript beschränkt sich auf On-Premises und exportiert einfach die Bilder aus dem SharePoint in ein Verzeichnis. Da der Export einer großen Menge natürlich entsprechend lange dauert, merke ich mir einen Zeitstempel, wann das Skript das letzte mal gelaufen ist, so dass ich nur die Elemente exportiere, die sich danach geändert haben. Zudem prüfe ich, welche Elemente im Ziel sind und in der Quelle fehlen. Diese Bilder muss ich im Ziel entsprechend löschen.

Der originale Code enthält noch Bestandteile, die in den beiden Fällen (neues Bild, aktualisiertes Bild, gelöschtes Bild) weitere Aktionen auslöst. In dem Beispielcode sind diese Zeilen entfernt. Aber über entsprechende "Write-Host"-Ausgaben sind die Stellen gut ausfindig zu machen und sie können eigenen Code dort addieren

export-spphoto.ps1.txt

Denken Sie daran, dass Sie im Skript natürlich die Pfade und URLs entsprechend anpassen müssen.

Import in SharePoint

Die Gegenrichtung geht natürlich auch. Allerdings habe ich dazu bislang keinen Code schreiben müssen und auf der TechNet Gallery gibt es schon entsprechende Beispiele.

Weitere Links