Con la tendencia mundial de migración hacia la nube y en especial a Office 365, la migración de dominios que estén listos para Office 365 es uno de los caminos a seguir, pero en este proceso de migración pueden salir las cosas mal, por ello he escrito un Script en PowerShell para que actualice la propiedad de WorkEmail y Title (o sea Puesto) en el servicio de Perfiles de Usuario, basado en un archivo CSV con el objetivo de corregir algún error que se haya efectuado o bien porque no se han migrado aún los correos al nuevo dominio pero es necesario que sigan funcionando las alertas de SharePoint con la cuenta de correo anterior… Bueno y lo del puesto no sería necesario si se sincroniza, pero si se desea hacer una rápida actualización de un puñado de usuarios de esta propiedad sin necesidad de sincronizar todos los usuarios, es una solución práctica.
Como el Script se basa en un archivo CSV vamos a describir el formato de este archivo.
Formato del Archivo CSV
El formato CSV es un archivo de texto que tiene en su primera línea contiene el nombre de cada columna como parte del encabezado y se separa por una coma. Luego cada línea siguiente representa una fila y se separa igualmente por comas
Los nombres de las columnas del archivo CSV deben de tener por lo menos las siguientes:
NewAccount: Es la cuenta de usuario. Ejemplo: DOMINIO\NOMBRE_USUARIO
Title: El Puesto del usuario. Ejemplo: NOMBRE DEL PUESTO
Email: EL correo del usuario. Ejemplo: nombre_usuario@dominio.com
Un ejemplo del contenido de un archivo es el siguiente
NewAccount,Title,Email
DOMINIO\NOMBRE_USUARIO,Nombre del Puesto,nombre_usuario@dominio.com
El Script
#Primera línea de archivo UpdateUPAProperties.ps1
#Primero solicitaremos dos parámetros; $archivoEntrada = Que es la ruta de la ubicación del archivo csv y $misitioUrl que la URL de My Site.
param (
[string]$archivoEntrada , [string]$miSitioUrl
)
#Valida si fue ingresado el parámetro $archivoEntrada, sino le asigna un valor predeterminado para pruebas
if ($archivoEntrada -eq $null -or $archivoEntrada -eq "")
{
$archivoEntrada = "E:\Infoware\Scripts\PruebaActualizaPropiedadesPerfilUsuario.csv"
Write-Host "No ha recibido parametro archivoEntrada"
}
#Valida si fue ingresado el parámetro $miSitioUrl sino le asigna uno predeterminado
if ($miSitioUrl -eq $null -or $miSitioUrl -eq ""){
$miSitioUrl = http://misitio.dominio.com
}
#Se Cargan las librerias de SharePoint para ejecutar la actualización de los perfiles de usuario
if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) {
Add-PSSnapin Microsoft.SharePoint.PowerShell;
}
[reflection.assembly]::Loadwithpartialname("Microsoft.Office.Server.Search") | out-null
[reflection.assembly]::Loadwithpartialname("Microsoft.Office.Server") | out-null
#Se Carga en memoria el Administrador de Perfiles de Usuario para ello es necesario la url que solicitamos en el parámetro e instanciar en memoria la colección de sitios y el sitio principal de MySite.
$site=Get-SPSite $miSitioUrl
$web=$site.RootWeb
$serverContext=[Microsoft.Office.Server.ServerContext]::GetContext($site)
$upm=New-Object Microsoft.Office.Server.UserProfiles.UserProfileManager($serverContext)
# Ahora cargaremos en memoria como una tabla el archivo CSV
$FileExists = (Test-Path $archivoEntrada -PathType Leaf)
if ($FileExists) {
"Loading $archivoEntrada for processing..."
$listadoUsuarios = Import-CSV $archivoEntrada
} else {
"$archivoEntrada not found - stopping import!"
exit
}
#El objetivo de esta función es actualizar el valor de la propiedad del perfil de usuario en cuestión
function set-SPProfileProperty([string]$propertyName, [string]$val, $up)
{
#Validamos que no venga el perfil de usuario nulo
if($up -ne $null)
{
#Obtenemos la propiedad por su nombre
$property = $up.Properties.GetPropertyByName($propertyName)
#Validamos que no si hayamos obtenido la propiedad
if (-not [System.String]::IsNullOrEmpty($property))
{
$up[$propertyName].value = $val;
$up.Commit();
write-host "Actualizo la propiedad " $propertyName " con el valor" $val -ForegroundColor yellow
}
}
Write-Host "Done" -foregroundcolor green
}
#Recorremos la tabla en memoria del archivo CSV
foreach ($row in $listadoUsuarios)
{
$loginName = $row.NewAccount
#Validamos que obtuvimos la columna NewAccount que trae la cuenta del usuario
if( $loginName)
{
#validamos que el usuario exista en los perfiles de usuario
if($upm.UserExists($loginName)){
#Obtenemos el Perfil del Usuario
$up = $upm.GetUserProfile($loginName);
#Validamos que hayamos obtenido el perfil del usuario
if($up) {
$Puesto = $row.Title
$Correo = $row.email
#Si la columna Title trae valor invocamos la función para que modifique la propiedad en UPA
if($Puesto) {
set-SPProfileProperty -propertyName "Title" -val $Puesto -up $up
}
#Si la columna Corre trae valor invocamos la función para que modifique la propiedad en UPA if($Correo) {
set-SPProfileProperty -propertyName "WorkEmail" -val $Correo -up $up
}
}
}else
{
Write-Host "Usuario no existe " $loginName -ForegroundColor Red
}
}
}
Write-Host "End of file"
# Fin del archivo ps1
Procedimiento de Ejecución
Para ejecutar el Script puede utilizar PowerShell de Windows 3.0 o bien la consola de administración de SharePoint 2013. Abajo una imagen que muestra como ejecutar el Script desde una ubicación predeterminada.
Bueno amigos espero les sirva el Scrip como lo hizo conmigo.
Hasta la próxima!… SharePoint4Fun!,
Juan Manuel Herrera Ocheita