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.csvAhora, para importar el archivo CSV a PowerShell, usamos el siguiente comando más adelante:
$promotions = Import-Csv -Delimiter ";" -Path $csvPathConsejo
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.jobtitleEnviando 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.