Following on my previous post about different user profile photo options for SharePoint 2013, I wanted to expand on some research that I had done for one of my customers in this area regarding the expiration values. There are a couple of scarcely documented* properties that will also affect when a user's photo is re-synchronized from Exchange 2013 instead of just using the cached photo in SharePoint 2013.
To cover the basics, I used this blog to configure the integration between SharePoint 2013 and Exchange 2013 for user photos. There are a couple of SPWebApplication properties that are set here:
- UserPhotoImportEnabled – this property defines if SharePoint should import photos from Exchange
- UserPhotoExpiration – this property defines (in hours) how long the photo in the user photo library of the MySite host should be considered valid before attempting to synchronize a potentially updated photo
- UserPhotoErrorExpiration – this property tells SharePoint that if encountered an error attempting to retrieve a new photo less than 'this many' hours ago, then do not attempt again
These are fairly well-known properties, but there are a couple of others that affect how often or *if* your user photo sync will happen. These additional properties are contained in the web application property bag:
- DisableEnhancedBrowserCachingForUserPhotos – (default: not present) If this property is set to 'false' or is not present, then SharePoint will bypass the blob cache. If the property is set to 'true', then SharePoint will check the timestamp and will bypass the blob cache if the timestamp passed in is within 60 seconds of the current time
- AllowAllPhotoThumbnailsTriggerExchangeSync – (default: not present) If this property is set to 'false' or is not present, then SharePoint will only trigger a sync with Exchange if the thumbnail being requested is the Large thumbnail.
So what I want to explain below is a series of steps that I took in my lab to hopefully illustrate how these properties work.
Anne accesses her profile page to change her photo and it properly redirects her to Outlook Web App (OWA) where she can upload her latest professionally taken headshot (photo1.jpg). Upon completion, she returns to her profile page and sees the new photo. She also navigates to OWA and sees the photo there as well.
Adam navigates to Anne's profile page and sees the recently uploaded photo.
Anne decides that she wants to upload a different photo (photo2.jpg) and does so through OWA instead of through her profile page. In this case photo2.jpg does not show up immediately in her profile page and she and other users are still seeing photo1.jpg; however OWA is showing photo2.jpg.
Why is SharePoint not updating the photo?
Basically, it will depend on the settings above combined with what method was used to change the photo. In the above scenario, Anne changed her photo the second time via OWA. SharePoint has no way to know that the photo was changed until its cached photo expiration (UserPhotoExpiration) value has passed from the first time the photo was changed. Even after the photo expiration has passed, there still has to be some action that triggers for SharePoint to check. In this case, Anne navigating to her profile page (since it's the large thumbnail) should trigger SharePoint to evaluate the expiration values and if needed re-sync Anne's photo.
Why wouldn't I reduce the UserPhotoExpiration value to 0 hours?
I'm sure that in some installations this would not be a problem, but the point of a cache (in this case SharePoint's user photo library) is to reduce round-trips to the authoritative source of data. You likely do *not* want SharePoint to be contacting Exchange every time someone accesses their profile photo.
How do I set these properties?
In powershell, of course! For the first three above there are examples within this blog, but I'll duplicate them here along with the other two. To reiterate, these values are for the sake of examples and you should do your own testing to find out what works for your environment:
$wa = Get-SPWebApplication https://my.contoso.lab
$wa.UserPhotoImportEnabled = $true
$wa.UserPhotoExpiration = 6
$wa.UserPhotoErrorExpiration = 1
* - I say scarcely documented as I could find very few references to DisableEnhancedBrowserCachingForUserPhotos or AllowAllPhotoThumbnailsTriggerExchangeSync that were related to the topic. I did, however, find one that was helpful in directing my research: http://sharepoint.sigicom.ch/Blog/Beitrag/2/Profile-Picture-Cache. And since I am not fluent in German, I'm thankful for the translation tools we have available on the Internet.