jueves, 7 de septiembre de 2017

PowerShell script para sincronizar las imágenes de usuario con AD

Si en vuestra granja de SharePoint no conseguís que las fotos de los usuarios aparezcan en su perfil, pese a que esté bien introducida en el AD y mapeada en el Servicio de User Profile de SharePoint, es porque respecto a esta questión, en determinadas configuraciones, a SharePoint hay que darle un "empujoncito".

Existen ciertos programas (Microsoft Identity Manager (MIM), Forefront Identity Manager (FIM)), que pueden ayudarnos a realizar esta sincronización de imágenes automáticamente, pero si no teneis acceso a ellos (básicamente porque requieren licencia), siempre podéis utilizar una solución gratuita con nuestro siempre buen amigo PowerShell (el script puede programarse como scheduled task, para que se ejecute diariamente).

Aquí os dejo un ejemplo de un script que he creado para dicha tarea. Básicamente se trata de realizar una query al AD que nos retorne todos los usuarios con imagen en su perfil, y para cada uno de ellos descargar la imagen en el directorio local donde estamos ejecutando el script (ojo: elegid bien el directorio donde lo vais a ejecutar), para luego subirla con su correspondiente nombre (siempre debe empezar por "0c37852b-34d0-418e-91c6-2ac25af4be5b_" seguido del parámetro "RecordId" que el usuario tenga en el User Profile Service. Por último, el comando Updata-SPProfilePhotoStore realiza el procesado de cada imagen, para importarla al perfil de usuario, creando los thumbnails correspondientes.

Recordad que debéis modificar los valores de las variables $URL y $Users con vuestro nombre de dominio. También $picLibrary & $picFolder si vuestra instalación de SharePoint no está realizada en inglés.

Import-Module ActiveDirectory  
Add-PSSnapin Microsoft.SharePoint.PowerShell -EA SilentlyContinue

$URL = "https://mysite.mydomain.com:443/"
#Next variables are correct for english SP installation, otherwise check names and change them.
$picLibrary = "User%20Photos"
$picFolder = "Profile%20Pictures"

$web = Get-SPWeb $URL
$site = Get-SPSite -Identity $URL
$context = Get-SPServiceContext -Site $site
$upm = New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($context) -ErrorAction Stop
$users = Get-ADUser -Filter * -SearchBase "DC=mydomain,DC=local" -Properties thumbnailPhoto | ? {$_.thumbnailPhoto} | select SamAccountName,thumbnailPhoto

foreach ($user in $users) {
    $name = $user.SamAccountName + ".jpg"  
    write-host $name
    $user.thumbnailPhoto | Set-Content $name -Encoding byte
    $file = Get-Item $name
    #Open file
    $fileStream = ([System.IO.FileInfo] (Get-Item $file.FullName)).OpenRead()
    $folder =  $web.GetFolder($picFolder)
    $spFile = $folder.Files.Add("/" + $picLibrary + "/" + $folder.Url + "/" + "0c37852b-34d0-418e-91c6-2ac25af4be5b_" + $upm.GetUserProfile($user.SamAccountName).RecordId + ".jpg", [System.IO.Stream]$fileStream, $true)
    #Close file stream
    $fileStream.Close();
}

Update-SPProfilePhotoStore -MySiteHostLocation $URL -CreateThumbnailsForImportedPhotos:$true -ErrorAction Stop

Con la ejecución de este script (tarda un rato), ya deberíais poder ver las imágenes de los usuarios, cuando paséis por encima el ratón sobre un "created by" en una lista/biblioteca, en los resultados de búsqueda, en el perfil de usuario del MySite, en el organigrama empresarial...

Aquí seguimos, después de tantos años, dando "empujoncitos" a SharePoint, para que termine haciendo lo que se supone que debería hacer por defecto. 

;-)

¡¡Un saludo a tod@s!!

No hay comentarios: