Uso de PowerShell para actualizar un usuario de AD desde un archivo CSV

Necesitaba actualizar un grupo de usuarios de AD con sus nuevos títulos de trabajo.

Ha comenzado un nuevo año y algunos hicieron promociones y obtuvieron un nuevo título de trabajo.

Así que recibí un archivo de Excel con su nombre completo y su nuevo cargo de Recursos Humanos.

Debido a que esto sucede todos los años, ¿es hora de crear un script de PowerShell para ello?

Como beneficio adicional, también enviaremos al usuario un correo electrónico para notificarle que se cambió el título de su trabajo.

Así que ya no tienen que ponerse en contacto con TI para ello.

Importación del archivo CSV en PowerShell

Para actualizar el usuario de AD vamos a utilizar un archivo CSV.

Esto nos permite utilizar el Importar-CSV cmdlet en PowerShell. He usado la siguiente tabla de Excel que he guardado en un CSV.

nombre título profesional
Juan Pérez Gerente de Cuentas Senior
fulano de tal Gerente de cuentas
salina scott ingeniero
jaspe rempel ingeniero Junior

Con el parámetro csvPathpodemos especificar la ubicación del archivo CSV que queremos importar.

Set-UserPromotions.ps1 -csvPath c:\temp\promotions.csv

Ahora, para importar el archivo CSV a PowerShell, usamos el siguiente comando más adelante:

$promotions = Import-Csv -Delimiter ";" -Path $csvPath

Consejo

Por defecto, el delimitador es una coma ( , ), pero puede cambiar a usando el -Delimitador parámetro. Como puede ver, estoy usando $rootPath para hacer referencia a la ubicación del script. También puede completar la ruta absoluta al archivo aquí.

El resultado de $promociones es:

name    jobtitle
-------------
John Doe        senior accountmanager
Jane Doe        accountmanager
Salina Scott    Engineer
Jasper Rempel   junior engineer

Encontrar el usuario de AD para actualizar

El siguiente paso es encontrar al usuario en Active Directory.

Necesitamos encontrar a los usuarios basándonos en sus nombres completos, vamos a usar el Get-ADUser cmdlet para esto y filtre los resultados en el nombre para mostrar.

No tenemos un usuario, sino una lista completa. Así que vamos a usar un bucle foreach para recorrer la lista de usuarios.

foreach($user in $promotions){
    # Find user
    $ADUser = Get-ADUser -Filter "displayname -eq '$($user.name)'"
}

Así que estamos tratando de conseguir que cada usuario entre en la tabla de promociones.

Ahora, una buena práctica es implementar una captura en caso de que el usuario no exista.

Tal vez Recursos Humanos cometió un error tipográfico que puede resultar en que no se encuentre al usuario.

Además, necesitamos la dirección de correo electrónico del usuario más adelante para enviarle la notificación. Agregue el correo de la propiedad al Get-ADUser cmd.

foreach($user in $promotions){
    #find user
    $ADUser = Get-ADUser -Filter "displayname -eq '$($user.user)'" -Properties mail

    if ($ADUser){
        # <update the user>
    }else{
        Write-Warning ("Failed to update " + $($user.user))
    }
}

Actualización del usuario de AD

Si los usuarios existen en el Directorio Activo podemos usar el Set-ADUser para actualizar un atributo.

En este caso, el atributo de título, pero puede ser cualquier atributo relacionado con el usuario de AD.

Consejo

Obtenga más información sobre el cmdlet Set-ADUser en este artículo.

foreach($user in $promotions){

    # Find user
    $ADUser = Get-ADUser -Filter "displayname -eq '$($user.name)'" -Properties mail

    if ($ADUser){
        Set-ADUser -Identity $ADUser -Title $user.jobtitle
    }else{
        Write-Warning ("Failed to update " + $($user.name))
    }
}

Si solo desea actualizar el usuario de AD desde un archivo CSV, ya está.

Si también desea enviarles un correo electrónico para notificarles sobre el cambio, siga leyendo.

Envío de un correo electrónico al usuario

Estoy usando una plantilla de correo electrónico para enviar un correo electrónico al usuario.

La plantilla es un archivo HTML que puede descargar aquí en junto con este guión.

Antes de que podamos enviar el correo electrónico, debemos reemplazar algunos marcadores de posición con el nombre del usuario y un nuevo título.

Además, necesitamos un servidor SMTP para enviar el correo electrónico.

Configuración de los detalles de STMP

A continuación se muestra una matriz simple con los detalles de SMTP, como el servidor y la dirección de origen.

#SMPT Details to send the email
$smtp = @{
	"address" = "stonegrovebank.mail.protection.outlook.com"
	"from" = "[email protected]>"
	"subject" = "Jobtitle updated."
}

Crear el cuerpo del correo electrónico

Tengo una función que utilizo para crear el cuerpo del correo electrónico. El uso de funciones me permite reutilizar partes del código en diferentes scripts.

La primera función obtendrá la plantilla de correo electrónico y reemplazará los marcadores de posición con los datos correctos.

Function Get-EmailTemplate {
  <#
    .SYNOPSIS
    Get the eamil template which is located in the same location as the script
  #>
	PARAM(
		[parameter(Mandatory=$true)]
		$user,
		[parameter(Mandatory=$true)]
		$jobtitle
	)

	PROCESS
	{
		#Get the mailtemplate
		$mailTemplate = (Get-Content ($rootPath + '\MailTemplate.html')) | ForEach-Object {
			$_ 	-replace '{{user.jobtitle}}', $jobtitle`
			-replace '{{user.firstname}}', $user.givenName
		} | Out-String	
		
		return $mailTemplate
	}
}

En el bucle foreach, después del cmd Set-ADuser, agregamos la siguiente línea para llamar a la función y crear el cuerpo del correo electrónico:

 $emailBody = Get-EmailTemplate -user $ADUser -JobTitle $user.jobtitle

Enviando el correo electrónico

La última función es para enviar el correo electrónico. Toma los detalles SMTP de la matriz SMTP y utiliza la información proporcionada para enviar el correo electrónico.

Agregué una variable hipotética para que pueda realizar una prueba antes de enviar el correo electrónico real.

Function Send-Mail {
	<#
    .SYNOPSIS
    Send the user a mail.
  #>
	PARAM(
		[parameter(Mandatory=$true)]
		$emailBody,
		[parameter(Mandatory=$true)]
		$user,
		[parameter(Mandatory=$false)]
		[bool]$whatIf
	)
	
    PROCESS
	{
		#Set encoding
		$encoding = [System.Text.Encoding]::UTF8

		Try 
		{
			if ($whatIf -ne $true)
			{
				send-MailMessage -SmtpServer $smtp.address -To $user.mail -From $smtp.from -Subject $smtp.subject -Encoding $encoding -Body $emailBody -BodyAsHtml
			}
			else
			{
				Write-host ("Send mail to -SmtpServer " + $smtp.address + " -To " + $user.mail + " -From " + $smtp.from + " -Subject $smtp.subject")
			}
		}
		Catch
		{
			Write-Error "Failed to send email to, $_"
		}

	}
}

Llamamos a esta función con el siguiente cmd que agregamos debajo del cuerpo del correo electrónico:

Send-Mail -user $ADUser -EmailBody $emailBody

Entonces, el bucle foreach completo ahora se ve así:

foreach($user in $promotions){
    #find user
    $ADUser = Get-ADUser -Filter "displayname -eq '$($user.user)'" -Properties mail

    if ($ADUser){
        Set-ADUser -Identity $ADUser -Title $user.jobtitle -WhatIf

        $emailBody = Get-EmailTemplate -user $ADUser -JobTitle $user.jobtitle
        Send-Mail -user $ADUser -EmailBody $emailBody -whatIf $true
    }else{
        Write-Warning ("Failed to update " + $($user.user))
    }
}

Note que agregué dos Y si banderas Uno para Set-ADUser y otro para Send-mail. De esta manera, puede ejecutar su script para probarlo antes de cambiar o enviar algo.

Conclusión

Espero que el código anterior le haya ayudado a actualizar su usuario de AD desde un archivo CSV con PowerShell.

Si tiene alguna pregunta, simplemente agregue un comentario a continuación.

Otros artículos relacionados

PowerShell For Loop, ForEach y Do While/Hasta que se explique

PowerShell For Loop, ForEach y Do While/Hasta que se explique

Una de las funciones más fundamentales en la programación además de "If, Else" son los bucles. Le permiten procesar datos ...
Leer Más
ADGroupMember: obtenga todos los usuarios en ADGroup con PowerShell

ADGroupMember: obtenga todos los usuarios en ADGroup con PowerShell

Los grupos de Active Directory le permiten asignar fácilmente permisos o software a sus usuarios. Pero, ¿cómo se obtienen todos ...
Leer Más
Cómo usar Start-Transcript en PowerShell

Cómo usar Start-Transcript en PowerShell

Cuando ejecute scripts de PowerShell automáticamente, necesitará una forma de registrar cualquier error o advertencia que ocurra. Una opción es ...
Leer Más
Cómo usar Export-CSV en PowerShell

Cómo usar Export-CSV en PowerShell

Con PowerShell, puede extraer todo tipo de información de servicios como Active Directory o Microsoft 365. Pero a veces necesita ...
Leer Más
Cómo crear un perfil de PowerShell

Cómo crear un perfil de PowerShell

¿Quiere sacar más partido a su PowerShell? Luego, asegúrese de configurar su perfil de PowerShell para mejorar su consola de ...
Leer Más
Cómo ejecutar un script de PowerShell

Cómo ejecutar un script de PowerShell

Los scripts de PowerShell son una excelente manera de automatizar tareas, recopilar información o modificar propiedades de forma masiva. La ...
Leer Más

Deja un comentario