Pozn.: Na pohled jednoduchá věc, dá se i jednoduše používat. Ale pokud chce člověk vědět, jak to přesně funguje, tak má smůlu. Popis Microsoftu se blíží nule.
Před mnoha lety jsem toto téma popisoval v článku Active Directory - fotografie u uživatelů nejen pro Outlook 2010. Zde jsou zmíněny hlavně novinky při využití Exchange Server 2016. Nějaké oficiální (dost nedostatečné) informace Manage access to high-resolution user photos a Configure the use of high-resolution photos in Skype for Business Server.
Rozlišení fotografií a umístění
Náhledy v AD DS
Fotografie uživatele (náhled) se v Active Directory Domain Services (AD DS) ukládá do atributu thumbnailPhoto
objektu uživatelský účet. Velikost souboru může být maximálně 100 kB, ale doporučuje se do 10 kB (cmdlet Import-RecipientDataProperty
na Exchange 2010 dovolil nahrát maximálně 10 kB velký obrázek).
Dříve se všude uvádělo, že doporučené rozlišené je 96 x 96 px. Když použijeme nový (od Exchange 2013) cmdlet Set-UserPhoto
, tak se uloží fotka na Exchange, ale také se vytvoří náhled (thumbnailPhoto
) o velikosti 64 x 64 px. Podle informací u Microsoftu ke starším verzím to vypadá, že na Exchange 2013 se ukládala dokonce jen velikost 48 x 48 px.
Fotografie na Exchange serveru
Fotografie ve větším rozlišení se ukládá na Exchange server do schránky daného uživatele. Microsoft uvádí (třeba u popisu cmdletu Set-UserPhoto
), že se ukládá do kořenové složky uživatelovy schránky (root directory of the user's Exchange mailbox). Snažil jsem se najít možnost, jak si tyto uložené fotografie přímo ve schránce prohlédnout, ale marně. Zkoušel jsem například MFCMAPI, ale žádný takový objekt jsem nenalezl.
Podle popisu je podporován 24-bitový JPEG s maximálním rozlišením 648 x 648 px a maximální velikosti 500 kB. Zdrojový soubor můžeme použít s větším rozlišením a při ukládání dojde automaticky ke změně rozměrů.
Různá rozlišení
Microsoft uvádí využití různých rozlišení obrázků následně:
- 648 x 648 px - využije Skype for Business či Lync 2013
- 96 x 96 px - využije Outlook od verze 2013, OWA nebo Skype for Business pokud nemá lepší
- 64 x 64 px (nebo 48 x 48 px) - použije se, pokud není k dispozici lepší rozlišení
Například v článku How user photos are displayed in Lync se přímo uvádí, že pokud jsme měli v AD DS uložené fotky s rozlišením 96 x 96 px, tak při nahrání obrázku s větším rozlišením na Exchange se nám náhled v AD DS přepíše horším rozlišením. To ovlivní například klienty Lync a Outlook 2010.
Pozn.: Více o variantách rozlišení mluvíme dále.
Nahrání fotografie uživatele
Obrázek si mohou nahrát (nebo změnit či odstranit)
- uživatelé pro sebe pomocí webového rozhraní Outlook on the Web (případně administrátor pomocí impersonate), uloží se obrázek na Exchange i do AD DS
- správce pošty pro všechny schránky pomocí Exchange Management Shell, uloží se obrázek na Exchange i do AD DS
- doménový správce pro všechny uživatele může zapsat atribut
thumbnailPhoto
pomocí PowerShell AD modulu nebo speciální aplikací, uloží se pouze do AD DS
Vložení obrázku
Dále se zaměříme hlavně na Exchange Management Shell (EMS) a cmdlety Set-UserPhoto, Remove-UserPhoto, Get-UserPhoto.
Konfigurace nahrání uživatelské fotografie je jednoduchá. V příkladu vycházíme z toho, že na disku D je uložen JPG soubor a v příkazu je vypnuto potvrzení.
Set-UserPhoto -Identity bouska -PictureData ([System.IO.File]::ReadAllBytes("D:\bouska.jpg")) -Confirm:$false
Cmdlet Set-UserPhoto
provede úpravu velikosti a nahraje obrázek ve větším rozlišení (pokud je zdrojový soubor dostatečně velký) do uživatelovy schránky a zároveň vytvoří náhled, který uloží k účtu uživatele v AD DS do atributu thumbnailPhoto
. To samé se děje, pokud si uživatel nahraje fotku sám pomocí Outlook on the Web.
Doposud jsem (po mnoho let) používal nahrání fotografie do atributu thumbnailPhoto
cmdletem Set-ADUser
. Tímto příkazem se přímo uloží binární data do atributu, nedochází k žádným úpravám.
Set-ADUser -Identity bouska -Replace @{thumbnailPhoto=([byte[]](Get-Content D:\bouska2.jpg -Encoding byte))}
Zmenšení obrázku
Jak jsme si uvedli, tak cmdlet Set-UserPhoto
uloží do AD DS náhled o velikosti 64 x 64 px. Pokud bychom chtěli mít náhledy v rozlišení 96 x 96 px, tak můžeme provést zmenšení fotografie a vložení příkazem Set-ADUser
výše. Na internetu nalezneme řadu skriptů (obdobného principu), jak zmenšit obrázek PowerShellem. Já jsem hlavně řešil formát a kvalitu JPG (v příkladu 90%).
Add-Type -AssemblyName System.Drawing
$img = New-Object System.Drawing.Bitmap(96, 96)
([System.Drawing.Graphics]::FromImage($img)).DrawImage([System.Drawing.Image]::FromFile((Get-Item D:\bouska.jpg)), 0, 0, 96, 96)
$jpegCodecInfo = [System.Drawing.Imaging.ImageCodecInfo]::GetImageEncoders() | where {$_.MimeType -eq 'image/jpeg'}
$encoderParams = New-Object System.Drawing.Imaging.EncoderParameters(1)
$encoderParams.Param[0] = New-Object System.Drawing.Imaging.EncoderParameter([System.Drawing.Imaging.Encoder]::Quality, 90)
$img.Save("D:\bouska2.jpg", $jpegCodecInfo, $encoderParams)
$img.Dispose()
Načtení informací
Můžeme se podívat, kdo má obsah v atributu thumbnailPhoto
, tedy nahrané foto v AD DS.
Get-ADUser -Filter * -Properties thumbnailphoto | FT Name, thumbnailPhoto
Můžeme zkusit EMS cmdlet, který vrací informace o uživatelské fotografii. V praxi mohou nastat čtyři situace:
- uživatel nemá poštovní schránku
PS D:\> Get-UserPhoto operator The operation couldn't be performed because object 'operator' couldn't be found on 'dc.firma.local'.
- uživatel nemá žádnou fotografii (ani v AD DS)
PS D:\> Get-UserPhoto jan.bilek There is no photo stored here..
- uživatel má nahranou fotku v atributu thumbnailPhoto
PS D:\> Get-UserPhoto novak SerializationData : {0, 1, 0, 0...} Identity : firma.local/Firma/Novák Jan PictureData : {255, 216, 255, 224...} Thumbprint : IsValid : True ObjectState : New
- uživatel má nastavenu fotku i na Exchange serveru
PS D:\> Get-UserPhoto bouska SerializationData : {0, 1, 0, 0...} Identity : firma.local/Firma/Bouška Petr PictureData : {255, 216, 255, 224...} Thumbprint : -1379130797 IsValid : True ObjectState : New
Uložení obrázku do souboru
Obsah AD DS atributu thumbnailPhoto
můžeme uložit do souboru, čili uložit uživatelovu fotografii.
$user = Get-ADUser bouska -Properties thumbnailPhoto $user.thumbnailPhoto | Set-Content D:\bouska.jpg -Encoding byte
Pokud jsme do atributu přímo uložili obrázek s rozlišením 96 x 96 px, tak se takový stáhne. Pokud jsme použili cmdlet Set-UserPhoto
, tak má obrázek stažený rozlišení 64 x 64 px.
Stáhnout můžeme i obrázek ve větším rozlišení z Exchange serveru.
$user = Get-UserPhoto bouska $user.PictureData | Set-Content D:\bouska.jpg -Encoding byte
Pokud se nachází obrázek pouze v AD DS, tak nám tento příkaz vrátí obrázek z AD DS. Pokud jsme nahráli větší obrázek na Exchange, tak se nám stáhne obrázek z Exchange serveru. Ale v tom případě se vždy (tedy pokud existuje) stahuje velikost 240 x 240 px. Myslel jsem, že to znamená, že se vůbec nepoužívá Microsoftem zmiňovaná velikost 648 x 648 px. Ale po dalším pátrání a pokusech jsem zjistil, že patrně se na Exchange server uloží řada různých rozlišení (nebo možná jen to největší možné a online probíhá resize).
Zobrazení obrázků v různém rozlišení
Pro zobrazení fotky uživatele můžeme využít Exchange Web Services (EWS), kde specifikujeme uživatele jeho emailovou adresou a zadáme rozlišení. Info Get user photos by using EWS in Exchange.
https://mail.firma.cz/ews/Exchange.asmx/s/GetUserPhoto?email=bouska@firma.cz&size=HR648x648
Jako rozlišení můžeme použít pouze některou podporovanou hodnotu, jinak dostaneme chybu. Podporovaná rozlišení jsou, dle SizeRequested, HR48x48, HR64x64, HR96X96, HR120X120, HR240X240, HR360X360, HR432X432, HR504X504, HR648X648.
Praktické testy ukazují, že když nahrajeme fotografii, tak se ořízne na čtvercový formát a zmenší na nejbližší nižší podporované rozlišení. Například, když nahrajeme foto 400 x 531 px, tak se upraví na 360 x 360 px. Při zobrazení obrázku v HR360X360, HR432X432, HR504X504, HR648X648 se vždy vrátí foto s rozlišením 360 x 360 px.
Pozn.: Na Exchange serveru existuje složka C:\Program Files\Microsoft\Exchange Server\V15\ClientAccess\photos
, patrně jde o cache.
Zablokování změny fotografie uživatelem
Standardně má každý uživatel možnost změny své fotografie ve webovém rozhraní Outlook on the Web. Vede sem i odkaz z aplikace Skype for Business pokud zvolíme Edit Picture. Editace se v OWA nachází v Options - General - My Account. Případně můžeme jen kliknout v pravém horním rohu na profilový obrázek.
Zabránit editaci obrázku můžeme několika způsoby. Na internetu nalezneme řadu diskusí a článků, třeba Prevent Users from Changing Photo in OWA. Připadá mi nejlepší využití politiky Outlook on the Web Mailbox Policy (OwaMailboxPolicy) a parametru SetPhotoEnabled
, Set-OwaMailboxPolicy.
Žil jsem v představě, a na mnoha místech na internetu se to uvádí, že pokud není na schránku nastavena OwaMailboxPolicy, tak se automaticky aplikuje Default
politika. Praktický test ale hned ukáže, že tomu tak není. Možná se změnilo chování u Exchange 2013. Jediné oficiální info, které jsem nalezl, že pro Exchange Online se defaultní politika aplikuje na všechny schránky.
Nejlépe se nám bude pracovat v Exchange Management Shell (EMS). Exchange Admin Center (EAC) řadu věcí nepodporuje. Můžeme využít politiku Default, vytvořit novou či různě kombinovat.
Výpis existujících politik OwaMailboxPolicy a hodnot pro fotografie.
PS D:\> Get-OWAMailboxPolicy | FT Name,*Photo* Name DisplayPhotosEnabled SetPhotoEnabled SetPhotoURL ---- -------------------- --------------- ----------- Default True True
Nastavení zákazu editace fotografií pro všechny politiky.
Get-OWAMailboxPolicy | Set-OWAMailboxPolicy -SetPhotoEnabled $False
Výpis, jakou politiku má nastavenu uživatel
PS D:\> Get-CASMailbox bouska | FT Name, OWA* Name OwaMailboxPolicy OWAEnabled OWAforDevicesEnabled ---- ---------------- ---------- -------------------- Bouška Petr True True
Výpis uživatelů, kteří mají přiřazenu politiku Default.
Get-CASMailbox | Where-Object { $_.OwaMailboxPolicy -like 'Default' } | FT Name, OWA*
Výpis uživatelů, kteří nemají přiřazenu politiku.
Get-CASMailbox | Where-Object { $_.OwaMailboxPolicy -eq $null } | FT Name, OWA*
Přiřazení politiky Default určitému uživateli.
Set-CASMailbox bouska -OwaMailboxPolicy Default
Přiřazení politiky Default všem uživatelům, kteří nemají přiřazenu žádnou politiku.
Get-CASMailbox | Where-Object { $_.OwaMailboxPolicy -eq $null } | Set-CASMailbox -OwaMailboxPolicy Default
Zatím zde nejsou žádné komentáře.