администрирование administration ,

Фоторафии в Exchnage. Откуда Outlook берёт фото пользователей? Photos in Exchange: Where Does Outlook Get User Pictures?

Oct 03, 2019 · 7 мин. на прочтение 7 min read
Фоторафии в Exchnage. Откуда Outlook берёт фото пользователей?
Поделиться Share

Во многих компаниях, фотографии пользователей распространяются централизовано. Когда новый сотрудник фотографируется на пропуск, его фотография загружается в систему и распространяется через Active Directory по другим ресурсам. Я всегда считал, что Outlook смотрит в AD и подгружает фотографию оттуда. Но оказалось, что это не совсем так.

Как известно, в Actve Directory есть два поля, для хранения фотографий. Это thumbnailPhoto и jpegPhoto. Первое предназначено для хранения небольших фотографий 96x96 и ограничено размером 100 KB. Второе предназначено для фотографий большего размера. Outlook использует поле thumbnailPhoto. Более внятного описания из официальной документации я не нашёл. Если кто-то может поделиться ссылкой на подробное описание этих полей, то прошу оставить её в комментариях к этому посту.

Есть множество способов заполнить данные поля. Например, вот так:

$photo = [byte[]](Get-Content "C:\Users\mdanshin\mdanshin_AD.jpg" -Encoding byte)
Set-ADUser mdanshin -Replace @{thumbnailPhoto=$photo}

Так мы жили пока использовали Outlook 2010 и Exchange 2010. С переходом на Exchange 2016 выяснилась одна любопытная деталь. Теперь пользователи сами могут менять свои фотографии. Эта возможность появилась в Exchange 2013. Для этого можно воспользоваться штатным механизмом Outlook Web App (OWA), как показано на картинке ниже:

Exchange-Photos/1.png

Загружая таким образом фотографию, поле thumbnailPhoto перезаписывается.

Компаниям может не понравиться, если пользователи начнут менять свои фотографии, или, как это делают некоторые, загружать фотографии котиков и другие аватарки. Казалось бы, достаточно заново переписать атрибут thumbnailPhoto и восстановить первоначальные фотографии, выдержанные в корпоративном стиле. И сделать эту процедуру автоматической. Но как оказалось, после изменения thumbnailPhoto, фотография в Outlook не поменялась. И кэширование тут не причём. Outlook упорно подгружал пользовательскую фотографию. Очевидно, что он брал её откуда-то ещё.

Выяснилось, что Exchange 2013, и старше, хранит пользовательские фотографии на домашнем сервере пользователя, то есть там, где у него расположен почтовый ящик. Хранятся они в папке C:\Program Files\Microsoft\Exchange Server\V15\ClientAccess\photos\DomainName-GUID. Там находится ещё две папки, для фотографий 96x96 и 648x648. В одной из них и лежит фотография, загруженная пользователем через OWA.

Есть два способа увидеть пользовательскую фотографию. Первый способ - это командлет Get-UserPhoto. Для этого мы помещаем фото в переменную, а потом выгружаем содержимое переменной в файл, как показано на примере ниже:

$photo = Get-UserPhoto -id mdanshin | select PictureData 
$photo.PictureData | Set-Content "mdanshin.jpg" -Encoding byte 

Ещё один способ увидеть фотографию – обратиться по адресу https://EWS_URL/ews/Exchange.asmx/s/GetUserPhoto?email=USER_EMAIL&size=HR96x96. Например так:

https://owa.domain.ru/ews/Exchange.asmx/s/GetUserPhoto?email=mdanshin@domain.ru&size=HR648x648

Оба эти способа отображают фотографию не из поля thumbnailPhoto, а именно ту, что хранится на сервере. В этом легко убедиться следующим образом. Сначала меняем фотографию через OWA, на новую, а потом меняем фотографию в поле thumbnailPhoto на другую, скажем на старую (см. пример выше).

Теперь о том, как нам поменять пользовательскую фоторафию на корпоративную. Простое удаление фотографии из папки не помогает. Через короткое время она появляется вновь. При этом не совсем понятно откуда она берётся, если я её удалил. С этим ещё предстоит разобраться.

Я нашёл вот такой способ заменить фотографию.

Remove-UserPhoto -Identity mdanshin
Set-UserPhoto -Identity mdanshin -PictureData ([System.IO.File])::ReadAllBytes("mdanshin_AD.jpg")

Exchange-Photos/2.png

Так же в Интернет есть описание того, как запретить пользователям самостоятельно менять фотографии.

Get-OwaVirtualDirectory | Set-OwaVirtualDirectory -SetPhotoEnabled $False 

Но нельзя забывать про политики. То есть в дополнение к этому нужно ещё и их поправить.

Get-OWAMailboxPolicy | Set-OWAMailboxPolicy -SetPhotoEnabled $False 

In many companies, employee photos are managed centrally. When a new employee gets a badge photo, it gets uploaded to the system and then distributed through Active Directory and other services. I always assumed Outlook reads the photo from AD — but it turns out it’s not that simple.

As you probably know, Active Directory has two attributes for storing photos: thumbnailPhoto and jpegPhoto. The first is for small photos (96x96) and is limited to 100 KB. The second is for larger photos. Outlook uses thumbnailPhoto.

I couldn’t find a clear explanation in the official documentation. If you have a good link that describes these attributes in detail, please share it in the comments.

There are many ways to populate these attributes. For example:

$photo = [byte[]](Get-Content "C:\Users\mdanshin\mdanshin_AD.jpg" -Encoding byte)
Set-ADUser mdanshin -Replace @{thumbnailPhoto=$photo}

This setup worked fine when we used Outlook 2010 and Exchange 2010. But after moving to Exchange 2016, one interesting detail surfaced: users can now change their photos themselves. This feature appeared in Exchange 2013. You can do it via Outlook Web App (OWA), as shown below:

Exchange-Photos/1.png

When a user uploads a photo this way, the thumbnailPhoto attribute is overwritten.

Companies may not like it when users start changing their photos or uploading cat pictures and other avatars. It seems easy: just rewrite thumbnailPhoto back to the corporate photo and automate it. But after changing thumbnailPhoto, the photo in Outlook did not change. And caching wasn’t the issue — Outlook kept showing the user-uploaded photo. That means Outlook was getting the photo from somewhere else.

It turns out Exchange 2013 and later store user photos on the mailbox server (the “home server” where the mailbox resides). They are stored in C:\Program Files\Microsoft\Exchange Server\V15\ClientAccess\photos\DomainName-GUID. Inside there are folders for 96x96 and 648x648 sizes. One of them contains the photo uploaded by the user via OWA.

There are two ways to view the user photo.

The first is the Get-UserPhoto cmdlet: save the photo to a variable and then write it to a file:

$photo = Get-UserPhoto -id mdanshin | select PictureData 
$photo.PictureData | Set-Content "mdanshin.jpg" -Encoding byte 

The second is to request it via EWS: https://EWS_URL/ews/Exchange.asmx/s/GetUserPhoto?email=USER_EMAIL&size=HR96x96

For example:

https://owa.domain.ru/ews/Exchange.asmx/s/GetUserPhoto?email=mdanshin@domain.ru&size=HR648x648

Both methods return the photo stored on the Exchange server, not the value from thumbnailPhoto. You can easily verify this: change the photo via OWA, then change thumbnailPhoto to a different picture (for example, the old corporate one) — Outlook will still show the OWA-uploaded photo.

Now, how do you replace a user photo with the corporate one? Simply deleting the photo file does not help — it reappears shortly after. It’s not entirely clear where it comes from after deletion; that’s something to investigate.

Here is one way I found to replace the photo:

Remove-UserPhoto -Identity mdanshin
Set-UserPhoto -Identity mdanshin -PictureData ([System.IO.File])::ReadAllBytes("mdanshin_AD.jpg")

Exchange-Photos/2.png

There are also instructions online on how to prevent users from changing their photos:

Get-OwaVirtualDirectory | Set-OwaVirtualDirectory -SetPhotoEnabled $False 

But don’t forget about policies — you need to update them as well:

Get-OWAMailboxPolicy | Set-OWAMailboxPolicy -SetPhotoEnabled $False 
Заходите в группу Telegram Join the Telegram group
Если есть вопросы или хотите пообщаться, то заходите в мою группу Telegram. If you have questions or want to chat, join my Telegram group.