lunes, noviembre 28, 2011

Cambio Masivo en AD con PowerShell

Holas!!

Hace tiempo que no escribia un articulo, andaba poco creativa, pero aprovechando que ando en unas mini vacaciones en Concepcion aprovechare de compartir un poco de Scripts.

Hace unos dias me pidieron crear un script para modificar la informacion de los usuarios en forma masiva, eran cerca de 800 usuarios a modificar y la informacion estaba en un excel.

Estuve buscando en el Script Center de Microsoft pero los que alli estan no me dejaban satisfechas, algunos campos podian ser modificados pero otros multivalor no podian hacerlo, ademas que se queria agregar la fotografia del usuario en el campo jpegPhoto.

En la consola PowerShell de Active Directory puedes encontrar el cmdlet Set-ADUser con el cual puedes modificar el usuario, identificas al usuario en forma unica con la cuenta, este es el atributo sAMAccountName, asi que colocamos -identity "usuario" a nuestro comando.

A continuacion identificamos que atributos necesitamos modificar, para el caso en que sea multiatributo y deseamos agregar, reemplazar o eliminar algun valor tambien lo podemos hacer usando add, replace, o remove indicando el atributo a modificar, por ejemplo -add @{Description = "Descripcion Agregada"}

Tambien, necesitamos cambiar el nombre del objeto en si (atributo cn) para lo cual usamos el cmdlet Rename-ADObject indicandole el usuario que deseamos renombrar.

Como queremos hacerlo para muchos usuarios, necesitamos generar un  archivo csv, separados por comas, en que los nombres de las columnas indiquen los campos que queremos modificar, como ya vimos anteriormente, para parsear el archivo usamos en cmdlet import-csv y lo colocamos en una variable.

Otro problema que se nos presento es la fecha de expiracion de la cuenta, la cual al mirar el objeto nos percatamos que era el dia anterior, para eso hicimos el sucio truco de sumarle un dia (New-TimeSpan -Days 1) a la fecha entregada en el archivo.

Como ultimo desafio, nos quedo el cargar la foto, como el archivo es jpg, no hay un upload foto, asi que hubo que realizar una conversion del archivo a un formato binario ([Byte[]]$(Get-Content -Path "E:\usuario.jpg" -Encoding Byte -ReadCount 0) )

Con todos los ingredientes listos, nuestro script quedo asi:

$data = import-csv $args[0]
$fecha2 = New-TimeSpan -Days 1

foreach ($i in $data)
{

# Se le suma 1 dia a la fecha de expiracion para que lo cargue bien
$fecha = Get-Date $i.accountExpires
$fechaExpira = $fecha + $fecha2

# Renombra la cuenta al nuevo nombre
Get-ADUser -Identity $i.sAMAccountName | Rename-ADObject -NewName $i.DisplayName

# Actualiza los datos de la cuenta
Set-ADUser -identity $i.sAMAccountName -AccountExpirationDate $fechaExpira -Description "Descripcion" -Manager $i.manager -GivenName $i.givenName -Surname $i.sn -DisplayName $i.DisplayName -Company $i.Company -MobilePhone $i.mobile -Department $i.department  -HomePhone $i.HomePhone -Title $i.title

#Agrega la Foto del Usuario

Set-ADUser  -Identity $i.sAMAccountName  -replace @{jpegPhoto = ([Byte[]]$(Get-Content -Path "E:\$i.sAMAccountName.jpg" -Encoding Byte -ReadCount 0) ) }

}

Saludos!!

No hay comentarios.: