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!!

martes, 22 de agosto de 2017

Cómo evitar que SharePoint 2016 abra los ficheros pdf en Word (OOS)

Recientemente he empezado a trabajar con una granja de SharePoint 2016. 
Tras la migración de contenidos, una de las primeras quejas que recibí fue que "los pdf se abren con word". Esto generaba problemas a los usuarios de IOS, que no podían abrirlos debido a cierta incompatibilidad entre sistemas. 



Tras estudiar un poco el caso, comprové que, efectivamente, nuestro reción instalado servicio de Office Online Server (OOS), está por defecto configurado para abrir todos los ficheros pdf con la aplicación "WordPDF", que forma parte del propio OOS.

Para ver qué tipos de fichero y acciones controla OOS, tenemos un comando muy representativo en PowerShell:

     Get-SPWOPIBinding

Esto nos proporciona un listado de qué aplicación abre cada tipo de extensión, para realizar cada acción predeterminada (lectura, escritura, vista previa, etc.). Por defecto, en el listado se incluyen muchas acciones relativas a los ficheros PDF, todas ellas a ejecutar con WordPdf.


Así que una vez entendido esto, la solución es bien sencilla: Indicarle a OOS que no haga nada en las acciones de lectura de un PDF. Cómo hacerlo? La forma más directa y sencilla (para los administradores, claro está) está siempre con PowerShell:

      Remove-SPWOPIBinding -Application WordPDF -Action view

Este comando eliminará el mapeo del OOS, únicamente para la aplicación WordPDF, y únicamente para las acciones de visualización (aunque podríamos quitarlo de tantas acciones como quisiéramos, siempre intento realizar las acciones necesarias con el mínimo impacto posible).

Tras la ejecución del comando, PowerShell nos pedirá una confirmación. El comando ejecutado, puede afectar a diversos bindings simultáneamente (para diferentes zonas, por ejemplo). Pulsamos "a" para aceptar todo y dejamos que el comando termine su ejecución.


Listo! A partir de ahora, en nuestra granja SharePoint 2016, OOS ya no volverá a mostrar los ficheros pdf dentro de WordPdf, dejando que se abra en su aplicación por defecto (el propio navegador).


Como veis, es importante tener controlado nuestro OOS, sabiendo qué ficheros y acciones abrirán qué aplicación. Una vez más, PowerShell acude a nuestro rescate.

¡¡Un saludo!!