Spring til indholdet

Profilbilleder til SharePoint med PowerShell

Active Directory Import i SharePoint Server tager ikke billederne med. Et script, der lægger en mappe med billeder op i User Photos og sætter dem på profilerne, og hvordan det gøres i Microsoft 365, hvor billedet ikke længere hører til SharePoint.

Opdateret PowerShellSharePoint 2013SharePoint Online 3 min. læsning

Active Directory Import i SharePoint Server importerer ikke brugernes billeder. Det gør kun synkroniseringen gennem Microsoft Identity Manager (Microsoft). Med AD Import skal billederne sættes på profilerne på anden vis. I 2014 brugte jeg et script fra SharePoint Use Cases, der tager en mappe med billeder, hvor filnavnet er brugerens kontonavn, lægger dem i biblioteket User Photos på My Site-værten og sætter billedets adresse på hver profil.

Opsætningen#

  1. En mappe til scriptet, fx C:\SPSolutions\ImportProfileImages, med en undermappe ProfileImages.
  2. Billederne i ProfileImages med kontonavnet som filnavn: jdoe.jpg for <DOMÆNE>\jdoe.
  3. Scriptet i mappen. Det køres i SharePoint Management Shell på en server i farmen, som en konto, der kan administrere brugerprofiltjenesten.

Kernen i scriptet#

Originalen har sine egne hjælpefunktioner til at finde biblioteket, filen og profilegenskabens navn. Det, den gør, er dette, forkortet og ikke kørt:

 1Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue
 2
 3$mySiteHostUrl = "http://<my-site-vaert>"
 4$imageFolder   = "C:\SPSolutions\ImportProfileImages\ProfileImages"
 5$domain        = "<DOMÆNE>"
 6
 7$web     = Get-SPWeb $mySiteHostUrl
 8$library = $web.Folders["User Photos"]
 9$context = Get-SPServiceContext $web.Site
10$upm     = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context)
11
12foreach ($file in Get-ChildItem $imageFolder -File) {
13    $account = "$domain\$($file.BaseName)"
14    if (-not $upm.UserExists($account)) {
15        Write-Host "Ingen profil: $account"
16        continue
17    }
18
19    $bytes  = [System.IO.File]::ReadAllBytes($file.FullName)
20    $spFile = $library.Files.Add("$($library.Url)/$($file.Name)", $bytes, $true)
21
22    $up = $upm.GetUserProfile($account)
23    $up["PictureURL"].Value = "$($web.Url)/$($spFile.Url)"
24    $up.Commit()
25    Write-Host "$account fik $($file.Name)"
26}
27
28Update-SPProfilePhotoStore -MySiteHostLocation $mySiteHostUrl -CreateThumbnailsForImportedPhotos $true

Update-SPProfilePhotoStore laver tre miniaturer i faste størrelser af hvert billede, lægger dem i User Photos og retter adressen på profilen (Microsoft).

Rettet i forhold til 2014-udgaven#

  • Navnene passede ikke sammen. Vejledningen oprettede mappen ImportProfileImages og filen UpdateUserProfiles.ps1, men kørselsscriptet skiftede til ImportProfilePhotos og indlæste UpdateProfiles.ps1. Fulgt ordret fandt det hverken mappen eller filen.
  • Billedet blev lagt op, før profilen blev fundet. Et filnavn uden en profil endte i User Photos alligevel. Nu tjekkes profilen først.
  • -CreateThumbnailsForImportedPhotos manglede. Microsoft beskriver Update-SPProfilePhotoStore som noget, der køres efter en opgradering, og parameteren er den, der laver miniaturer af importerede billeder. At miniaturerne ikke blev lavet uden den, har jeg ikke efterprøvet.
  • Tankestregen i –MySiteHostLocation kom fra WordPress. Den er skiftet til en bindestreg.

I Microsoft 365#

Profilbilledet hører ikke til SharePoint i Microsoft 365. Det ligger i Exchange Online og Entra ID og vises i Outlook, Teams og SharePoint. Det sættes med Microsoft Graph PowerShell og må være op til 4 MB (Microsoft):

1Connect-MgGraph -Scopes "User.ReadWrite.All"
2
3foreach ($file in Get-ChildItem "C:\Profilbilleder" -File) {
4    Set-MgUserPhotoContent -UserId "$($file.BaseName)@<domæne>" -InFile $file.FullName
5}

Her er filnavnet delen før @ i brugerens UPN.

  • Set-UserPhoto findes i dag kun i Exchange Server. I Microsoft 365 er det Graph (Microsoft).
  • Hybrid med Entra Connect. thumbnailPhoto i Active Directory synkroniseres og må være op til 100 KB, men Exchange Online tager kun imod et billede på højst 10 KB fra Entra ID. Større billeder skal sættes i admin center eller med Graph (Microsoft).
  • Hvor billedet må ændres, i skyen eller on-premises, er en indstilling for hele organisationen. En ændring kan tage op til 24 timer om at slå igennem (Microsoft).

Alle noter