• Logout
Bonhoeffer ICT

Bonhoeffer ICT

Veelvoorkomende vragen en antwoorden

(kopietje van Office365UserPhotos)

Office 365 UserPhoto

Op Bonhoeffer hadden we al thumbnailphotos in de Active Directory en deze zijn eenmalig gesynchroniseerd naar Office 365. Dit beschrijft hulpmiddelen om pasfoto's direct in te lezen in Office 365.

Matthijs noemt de mogelijkheid om het zelf wijzigen van de pasfoto door gebruikers in Office 365 uit te schakelen. Dan kan de foto centraal beheerd worden. Ik vind dat wenselijk.

Matthijs heeft de suggestie gedaan om thumbnailfoto formeel op te nemen als proces en een tool daarvoor te kiezen. In het ideale geval zou de administratie pasfoto's in een map dumpen , en zouden deze foto's geautomatiseerd worden ingelezen in AD userobject en gesynchroniseerd met Office365.

PowerShell

Om userfoto's in Office365 te beheren, bestaan er de volgende cmdlets:

Randvoorwaarden

  • The thumbnailPhoto attribute is synced only one time between Azure AD and Exchange Online. Any later changes to the attribute from the on-premises environment are not synced to the Exchange Online mailbox.
  • Exchange Online accepts only a photo that's no larger than 10 KB from Azure AD.
  • Userfoto's in Office 365 zijn vierkant. Ideale formaten zijn 96 x 96 pixels en 240 x 240 pixels.
  • Gebruik cmdlet Set-UserPhoto om een foto in te stellen
  • bij connecteren naar Exchange Online, voeg "?proxyMethod=RPS" toe aan de connectionURI

Lees meer:

Workflow voor converteren van pasfoto's

De schoolfotograaf levert pasfoto's in 200x300 formaat. De foto's worden geconverteerd naar 96 x 96 door middel van de volgende workflow. Dit maakt gebruik van nconvert cmdline tool.

@echo off
:: maak alle fotos in folder 267x400 verkleinen en croppen naar 96x96 pixels
:: Paul Wiegmans 20121012
::
cd %0\..
mkdir maak\resized96
mkdir maak\square96

pushd bron
Title "Resize foto's naar 96 pixels"
P:\Algemeen\NConvert\nconvert -out jpeg -o ..\maak\resized96\%% -ratio -resize 96 800  -keepfiledate *.jpg
popd

pushd maak\resized96
Title "Crop foto's in t96 naar c96"
:: gecropt vanaf pos (0,12) van een foto (96,144) geeft het gezicht helemaal weer.
P:\Algemeen\NConvert\nconvert -out jpeg -o ..\square96\%% -crop 0 12 96 96 -keepfiledate *.jpg
popd

Importeren Userphotos in Office 365

In wezen kun je een pasfoto importeren met een PowerShell oneliner:

Set-UserPhoto "Donald Trump" -PictureData ([System.IO.File]::ReadAllBytes("C:\pasfoto\Bokito.jpg"))

Om het voor mezelf wat beheersbaarder te maken, is dit nu een twee-staps proces. Eerst gebruik ik make-UserphotoList.ps1 om een lijst uit te Active Directory te exporteren met voor elke gebruiker UserPrincipalName en employeeID. Daarna gebruik ik Save-BCUserPhoto.ps1 om de lijst te lezen, de juiste foto bij elke gebruiker te vinden en deze in te stellen als UserPhoto.

Make-UserPhotoList.ps1

Dit script voer je uit met credentials van een domeinadmin (om toegang te krijgen tot de Active Directory).

<#
    make-userphotolist.ps1

    p.wiegmans@bonhoeffer.nl
    20161010

    maak lijst om userphoto te importeren in office 365.

#>

Import-Module activedirectory

$list = get-aduser -filter * -Properties name,userprincipalname,department,office,company,employeeid | select name,userprincipalname,department,office,company,employeeid | where {$_.company -eq "Bonhoeffercollege"} | where {$_.employeeid -like "bc*"}
Write-Host $list.count
$list | export-clixml -path "\\bcfs1\groups_m\medewerkers\systeembeheer\O365-Beheer\userphoto-list.xml"

Save-BCUserPhoto.ps1

Hierbij log je in met credentials van een Office 365 beheerder. Let op: het instellen van pasfoto duurt ongeveer 6 seconden per foto. In totaal dus 3 uur voor 1800 gebruikers!

<#
    Save-BCUserPhoto.ps1

    11 okt 2016
    p.wiegmans@bonhoeffer.nl

    Pasfoto instellen voor alle gebruikers in Office365.
    Leest gebruikers uit een opgeslagen lijst, welke is aangemaakt door Make-UserPhotoList.ps1 .
    LET OP: na succesvol instellen van pasfoto, wordt de foto gewist! Dan weet ik welke al gedaan zijn.

    https://technet.microsoft.com/en-us/library/jj218694%28v=exchg.160%29.aspx
    https://support.microsoft.com/en-us/kb/3062745 "User photos aren't synced from the on-premises environment to Exchange Online in a hybrid deployment"
    http://www.slipstick.com/exchange/cmdlets/import-images-active-directory/

    Belangrijk om te onthouden:
    * The thumbnailPhoto attribute is synced only one time between Azure AD and
    Exchange Online. Any later changes to the attribute from the on-premises
    environment are not synced to the Exchange Online mailbox.

    * Exchange Online accepts only a photo that's no larger than 10 KB from Azure AD.

    * Gebruik cmdlet Set-UserPhoto om een foto in te stellen

    * bij connecteren naar Exchange Online, voeg "?proxyMethod=RPS" toe aan de connectionURI


Get-UserPhoto
Remove-UserPhoto
Set-UserPhoto  

Voorbeeld:
Remove-UserPhoto "abe.aron" -confirm:$False
Set-UserPhoto "Paul Cannon" -PictureData ([System.IO.File]::ReadAllBytes("C:\Users\Administrator\Desktop\PaulCannon.jpg"))

Met de parameters -Preview -Save en -Cancel simuleer je het uploaden van een
foto naar een user profile (preview) en het klikken op Opslaan of Annuleren. Niet gebruiken dus!
Set-UserPhoto "Ann Beebe" -PictureData ([System.IO.File]::ReadAllBytes("C:\Users\Administrator\Desktop\AnnBeebe.jpg")) -Preview
Set-UserPhoto "Ann Beebe" -Save
Set-UserPhoto "Ann Beebe" -Cancel

Twee gelijkwaardige manieren voor het inlezen van de foto:
Set-UserPhoto -Identity $mailbox -PictureData ([Byte[]] $(Get-Content -Path "C:\userpics\username.jpg" -Encoding Byte -ReadCount 0)) -Confirm:$false
Set-UserPhoto -Identity $mailbox -PictureData ([System.IO.File]::ReadAllBytes("C:\userpics\username.jpg")) -Confirm:$false

FOUTMELDING:
Error on proxy command 'Remove-UserPhoto -Identity:'t.docent@bonhoeffer.nl' -Confirm:$False' to
server AMXPR05MB0632.eurprd05.prod.outlook.com: Server version 15.01.0649.0000, Proxy method R
PS:
The WinRM client cannot process the request. The connection string should be of the form
[<transport>://]<host>[:<port>][/<suffix>] where transport is one of "http" or "https". Transport, po
rt and suffix are optional. The host may be a hostname or an IP address. For IPv6 addresses,
enclose the address in brackets - e.g. "http://[1::2]:80/wsman". Change the connection string and
 try the request again.  .
    + CategoryInfo          : NotSpecified: (:) [Remove-UserPhoto], CmdletProxyException
    + FullyQualifiedErrorId : Microsoft.Exchange.Configuration.CmdletProxyException,Microsoft.Exchange.Management.RecipientTasks.RemoveUserPhoto
    + PSComputerName        : outlook.office365.com

OPLOSSING: Sluit ISE, en probeer opnieuw!

#>


# AANPASSEN
$adminuser = "admwiegmans@svok.cloud"
$fotomap = "P:\Algemeen\Fotos\20161010\"
# /AANPASSEN
$photosetnr = 0

if (-not $connected) {
    $credential = get-credential -username $adminuser -Message "Voer je Office 365 beheerwachtwoord in"
    Import-Module MSOnline
    connect-msolservice -credential $credential

    $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/?proxyMethod=RPS -Credential $credential -Authentication Basic -AllowRedirection  
    Import-PSSession $Session -AllowClobber -WarningAction SilentlyContinue -ErrorAction SilentlyContinue
    $connected = $True
} else {
    write-host "Al verbonden"
}


function Set-Photo ($upn, $filename)
{
    if (test-path $filename)
    {
        write-host "[$(Get-Date -format "yyyyMMdd hh:mm:ss")] Foto instellen ... $filename $upn"
        $gelukt = $False
        try
        {
            Set-UserPhoto -Identity $upn -PictureData ([System.IO.File]::ReadAllBytes($filename)) -Confirm:$false    
            $gelukt = $True
            $script:photosetnr += 1
            Start-Sleep -m 100   # voorkom throttling: https://support.microsoft.com/en-us/kb/2881759
        }
        catch
        {
        }
        if ($gelukt) {
            Remove-Item -Path $filename -Force -Confirm:$False
        }

    }
}


# Test ...
#set-photo -UPN "t.docent@bonhoeffer.nl" -filename ($fotomap + "3.jpg")
#exit

$list = Import-Clixml -Path "\\bcfs1\groups_m\medewerkers\systeembeheer\O365-Beheer\userphoto-list.xml" | sort employeeid
foreach ($u in $list)
{
    $llnr = $u.employeeid -replace "bc",""
    $filename = $fotomap + $llnr + ".jpg"
    set-photo -upn $u.userprincipalname -filename $filename
}

Einde