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
- You can create another Role Assignment Policy with default settings and
assign it to a specific mailboxes:
https://technet.microsoft.com/en-us/library/dd638100(v=exchg.150).aspx - Get-OwaMailboxPolicy
https://technet.microsoft.com/en-us/library/dd351095(v=exchg.160).aspx - Prevent Users from changing Pictures in Exchange 2013
https://www.slsmk.com/prevent-Users-from-changing-pictures-in-exchange-2013/
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 On-Premises 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.
- Working with the SharePoint Online REST
service via PowerShell
https://blog.vgrem.com/2014/02/27/working-with-the-sharepoint-online-rest-service-via-powershell/
https://blog.vgrem.com/2015/01/27/consuming-the-sharepoint-online-rest-api-from-powershell-part-2/ - SharePoint Online: Download a File from
Library using PowerShell
http://www.sharepointdiary.com/2016/09/sharepoint-online-download-file-from-library-using-powershell.html
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
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.
- Bulk Upload and Update User Profile
Photos in SharePoint 2013
https://www.sptrenches.com/2014/08/bulk-upload-and-update-user-profile.html - Bulk Upload and Update User Profile
Photos in SharePoint 2013
https://gallery.technet.microsoft.com/Bulk-Upload-and-Update-2c27437e
Weitere Links
- Office 365 Profilfoto
- ADPhoto
- Lync Photo
- Display in image from a picture library in SharePoint 2013 using Javascript
and REST
http://geekswithblogs.net/ThorvaldBoe/archive/2014/01/28/display-in-image-from-a-picture-library-in-sharepoint-2013.aspx - Working with folders and files with REST
https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/working-with-folders-and-files-with-rest - Passing Filter Parameters Through SharePoint URLs
https://azlav.wordpress.com/2011/06/24/passing-filter-parameters-through-sharepoint-urls/ - How to export profile picture to Active directory in SharePoint 2016
https://blogs.technet.microsoft.com/sharepoint_support/2017/10/25/how-to-export-profile-picture-to-active-directory-in-sharepoint-2016/ - How to get list items in a SharePoint list using REST
https://gallery.technet.microsoft.com/office/How-to-get-list-items-in-a-1adefd93 - Working with folders and files with REST
https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/working-with-folders-and-files-with-rest - How to export profile picture to Active directory in SharePoint 2016
https://blogs.technet.microsoft.com/sharepoint_support/2017/10/25/how-to-export-profile-picture-to-active-directory-in-sharepoint-2016/ - Problem. Die meisten Tools nutzen SharePoint PowerShell,.
Und die gibt es nur entweder als „Remoting“ auf einen SharePoint Server oder direkt auf dem SharePoint Server
https://stackoverflow.com/questions/11434304/how-to-work-with-sharepoint-cmdlet-without-installing-sharepoint - Exporting profile pictures from SharePoint 2010 to Active Directory
https://blog.areflyen.no/2012/06/05/exporting-profile-pictures-from-sharepoint-2010-to-active-directory/
Schreibt direct per MIS in das ThumbnaulPhoto - https://outlook.office.com/owa/?path=/options/myaccount/action/photo
- Options for SharePoint User Profile Properties and Photos
https://blogs.msdn.microsoft.com/briangre/2014/03/11/options-for-sharepoint-User-profile-properties-and-photos/ - Fix For Users profile pictures not displayed in SharePoint online sites and
delve
http://www.sharepointpals.com/post/Fix-For-Users-profile-pictures-not-displayed-in-SharePoint-online-sites-and-delve
“· During the page load of Me.aspx (in Delve) , a request is made for the large thumbnail photo. This generates a call to Exchange Online for the User’s profile picture.” - Import User Profile Photos from Active Directory into SharePoint 2010
https://sharepointadam.com/2010/11/18/import-User-profile-photos-from-active-directory-into-sharepoint-2010/ - User Profile Picture Uploader (crop and upload on behalf of other Users)
https://gallery.technet.microsoft.com/sharepoint/User-Profile-Picture-b8880e18 - GET User PROFILE Picture using JSOM/ CLIENT OBJECT MODEL SharePoint 2010/2013
https://skdeveloper.wordpress.com/2013/07/25/get-User-profile-picture-using-jsom-client-object-model-sharepoint-20102013/ - Retrieve User profile properties by using the JavaScript object model in
SharePoint
https://docs.microsoft.com/en-us/sharepoint/dev/general-development/how-to-retrieve-User-profile-properties-by-using-the-javascript-object-model-in - How to get User Profile Picture in SharePoint 2013?
https://social.msdn.microsoft.com/Forums/office/en-US/f8951006-0828-4202-8e46-2f3fe8f8cd9d/how-to-get-User-profile-picture-in-sharepoint-2013?forum=sharepointdevelopment - http://www.c-sharpcorner.com/UploadFile/472cc1/get-User-profile-display-picture-information-in-sharepoint-2128/
- https://skdeveloper.wordpress.com/2013/07/25/get-User-profile-picture-using-jsom-client-object-model-sharepoint-20102013/
- http://www.learningsharepoint.com/2013/01/01/programmatically-createretrieve-User-profileUser-profile-properties-in-sharepoint-2013/
- http://msdn.microsoft.com/en-us/library/office/jj920104(v=office.15).aspx
- If you are using SP 2010 through User Information List:
http://www.learningsharepoint.com/2010/07/19/programmatically-get-User-profile-picture-using-client-object-model-sharepoint-2010/ - If you are using SP 2013 through JSOM:
http://www.vrdmn.com/2013/02/sharepoint-2013-working-with-User.html - How to export profile picture to Active directory in SharePoint 2016
https://blogs.technet.microsoft.com/sharepoint_support/2017/10/25/how-to-export-profile-picture-to-active-directory-in-sharepoint-2016/