jueves, 8 de enero de 2015

Script en PowerShell para actualizar correo y puesto del perfil de usuario

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.

image

Bueno amigos espero les sirva el Scrip como lo hizo conmigo.

Hasta la próxima!… SharePoint4Fun!,

Juan Manuel Herrera Ocheita

No hay comentarios.: