¿Cómo importar usuarios a Active Directory desde un archivo CSV con PowerShell?

Uno de los usos más habituales de PowerShell en TI profesional es sincronizar información con Active Directory (AD). Parece que todo el mundo tiene alguna fuente de datos externa que se corresponde con empleados que necesitan incorporarse a AD. Esto es lógico, ya que AD suele ser el servicio más utilizado en una organización y no solo ofrece una excelente funcionalidad de autenticación, sino que también actúa como repositorio de información de empleados.

Tanto si tus datos están en una base de datos SQL personalizada como en un sofisticado sistema de RR. HH., resulta poco práctico tener que consultar varias fuentes cuando necesitas información como el departamento del empleado, los grupos a los que debe pertenecer, etc. Cuando empiezas a sincronizar esos datos, el sistema de origen puede cambiar su esquema, modificar APIs o servidores, lo que implica rehacer el código. Para asegurarte de que la fuente de datos desde la que sincronizas se mantiene estable y puede generarse fácilmente desde diferentes sistemas, es buena idea exportar esos datos a un archivo CSV.

Un archivo CSV sencillo puede exportarse desde prácticamente cualquier software o base de datos y, en este formato, permite al administrador ajustar los datos según sea necesario sin tener que depender de otro equipo para modificar una base de datos.

Vamos a ver un script sencillo que puedes usar hoy mismo para comprobar cómo sincronizar un atributo desde un CSV a una cuenta de AD.

Para situarnos, supongamos que tenemos un CSV llamado C:\Employees.csv. Este CSV tiene tres columnas: Nombre, Apellidos y Departamento. Necesitas un script que encuentre la cuenta de AD asociada a ese nombre y apellidos, y después actualice el departamento según lo que figure en el CSV.

Este script, como cualquier script de sincronización, constará principalmente de tres fases. Estas fases son: leer los datos de origen (el CSV en este caso), encontrar el identificador único en el sistema de destino que coincida con los datos de origen (en este caso, sAMAccountName en AD) y, por último, escribir los atributos asociados en esa cuenta.

La primera tarea es leer el archivo CSV.

$csvUsers = Import-Csv -Path 'C:Employees.csv'

Hecho. El siguiente paso es encontrar el identificador único para cada fila del CSV. Como no tenemos ese identificador único dentro del CSV, tendremos que generarlo sobre la marcha. Para generar ese identificador único, vamos a asumir que la inicial del nombre y el apellido del empleado siempre formarán su sAMAccountName en AD. Tendremos que crear ese sAMAccountName y después lanzar una consulta en AD para comprobar si la cuenta existe.
Nota: Antes de seguir, asegúrate de haber descargado e instalado las Remote Server Administration Tools para tu sistema operativo. Esto te dará acceso al módulo de PowerShell para Active Directory, que contiene los cmdlets Get-ADUser y Set-ADUser que vamos a utilizar.

foreach ($csvUser in $csvUsers) {
    $userName = '{0}{1}' -f $csvUser.FirstName.SubString(0,1),$csvUser.LastName
    if ($adUser = Get-AdUser -Filter "samAccountName -eq $userName" -Properties $attributesToSync) {
        ## Se ha encontrado nuestro “identificador único”. Procede a leer los datos del CSV y escribir los atributos correspondientes.  
    } else {
        Write-Warning -Message 'No se encontró ninguna coincidencia de usuario'
    }
}

Una vez que tenemos una cuenta de AD con la que trabajar, podemos leer cada atributo asociado a ese empleado en el archivo CSV y escribir esa información en la cuenta de AD encontrada. Observa a continuación que estoy definiendo la variable $attributesToSync y leyéndola más adelante. He hecho esto para poder añadir atributos adicionales que puedan estar en el CSV y sincronizarlos también en el futuro. El siguiente ejemplo primero comprueba si el atributo es el mismo. Si no lo es, utiliza Set-ADUser para modificarlo.

$attributesToSync = 'Department'
foreach ($csvUser in $csvUsers) {
    $userName = '{0}{1}' -f $csvUser.FirstName.SubString(0,1),$csvUser.LastName
    if ($adUser = Get-AdUser -Filter "samAccountName -eq $userName" -Properties $attributesToSync) {
        foreach ($attr in $attributesToSync) {
            if ($csvUser.$_ -ne $adUser.$_) {
                $setParams = @{$_ = $csvUser.$_}
                $adUser | Set-AdUser @setParams
            }
        }
    } else {
        Write-Warning -Message "No se encontró ninguna coincidencia de usuario"
    }
}

Este ejemplo solo funcionará con atributos que sean valores de tipo cadena en AD. Ten cuidado con atributos como el responsable (manager), la fecha de expiración de la cuenta, etc. Estos atributos requieren un objeto del tipo correcto antes de poder escribirse en AD. Haría falta otra serie de artículos para profundizar en los detalles de la sincronización con AD y el trabajo con distintos atributos, pero he creado un módulo de PowerShell llamado PSADSync que te ayudará con esto. Puedes encontrarlo en la PowerShell Gallery con el módulo Install-Module PSADSync.

Adam Bertram es MVP de Microsoft Windows Cloud y Datacenter Management, autor de varios cursos de formación, colaborador habitual de numerosas publicaciones impresas y en línea y ponente en diversos grupos de usuarios y conferencias. Puedes encontrar a Adam en adamtheautomator.com o en Twitter en @adbertram.

Próximos pasos

Crear un equipo de TI eficiente y eficaz requiere una solución centralizada que actúe como herramienta principal para la prestación de servicios. NinjaOne permite a los equipos de TI supervisar, gestionar, proteger y dar soporte a todos sus dispositivos, estén donde estén, sin necesidad de una infraestructura local compleja.

Para más información sobre el despliegue remoto de scripts de NinjaOne, asiste a una demo en directo o empieza tu prueba gratuita de la plataforma NinjaOne.

Categorías:

Quizá también te interese…