Во многих компаниях, фотографии пользователей распространяются централизовано. Когда новый сотрудник фотографируется на пропуск, его фотография загружается в систему и распространяется через 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), как показано на картинке ниже:
Загружая таким образом фотографию, поле 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")
Так же в Интернет есть описание того, как запретить пользователям самостоятельно менять фотографии.
Get-OwaVirtualDirectory | Set-OwaVirtualDirectory -SetPhotoEnabled $False
Но нельзя забывать про политики. То есть в дополнение к этому нужно ещё и их поправить.
Get-OWAMailboxPolicy | Set-OWAMailboxPolicy -SetPhotoEnabled $False