Búsqueda de sitios web

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


Necesitaba actualizar a un grupo de usuarios de AD con sus nuevos puestos de trabajo. Ha comenzado un nuevo año y algunos hicieron ascensos y obtuvieron un nuevo puesto de trabajo. Entonces 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 su puesto de trabajo ha cambiado. Para que ya no tengan que contactar a TI para ello.

Importar el archivo CSV en PowerShell

Para actualizar el usuario de AD usaremos un archivo CSV. Esto nos permite utilizar el cmdlet Import-CSV en PowerShell. He utilizado la siguiente tabla de Excel que he guardado en un CSV.

name

título del trabajo

John Doe

gerente de cuentas senior

Jane Doe

Gerente de cuentas

Salina Scott

ingeniero

Jasper Rempel

ingeniero junior

Con el parámetro csvPath podemos 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

De forma predeterminada, el Delimitador es una coma ( , ), pero puedes cambiarlo usando el parámetro -Delimitador. 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 el usuario en Active Directory. Necesitamos encontrar a los usuarios según sus nombres completos. Usaremos el cmdlet Get-ADUser para esto y filtraremos los resultados por el nombre para mostrar.

No tenemos un usuario, sino una lista completa. Entonces, usaremos un bucle foreach para recorrer la lista de usuarios.

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

Por eso estamos tratando de incluir a cada usuario en la tabla de promociones. Ahora una buena práctica es implementar un catch en caso de que el usuario no exista. Quizás RR.HH. cometió un error tipográfico que puede provocar 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 propiedad al cmd Get-ADUser.

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 Active Directory, podemos usar 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

Lea más 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, entonces ya está. Si también quieres enviarles un correo electrónico para notificarles sobre el cambio, sigue leyendo.

Enviar al usuario un correo electrónico

Estoy usando una plantilla de correo electrónico para enviar un correo electrónico al usuario. La plantilla es un archivo HTML que puedes descargar aquí en GitHub junto con este script. Antes de poder 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" = "itdept@stonegrovebank.com>"
	"subject" = "Jobtitle updated."
}

Creando el cuerpo del correo electrónico

Tengo una función que uso 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 puedas ejecutar 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))
    }
}

Observe que agregué dos indicadores WhatIf. 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 te haya ayudado a actualizar tu usuario de AD desde un archivo CSV con PowerShell. Puede encontrar el script completo y la plantilla de correo electrónico aquí en mi repositorio de GitHub.

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

Artículos relacionados