La gestión diaria de usuarios y ordenadores en Active Directory es la tarea más básica pero a la vez la más esencial que podemos realizar en este entorno. Vamos a ver como con Powershell podemos realizar todas estas tareas de una manera más rápida y eficiente en nuestro dia a dia.

gestionando active directory con powershell

Este el el primer post de una serie en la que abordaremos la gestión de Active Directory y todos sus elementos a través de Powershell, en ella trataremos de enfocar de la manera más sencilla posible los diferentes escenarios en los que nos podemos encontrar siempre a través de ejemplos prácticos. En estos ejemplos utilizaremos una gramática completa de powershell, tratando de evitar en lo posible alias para que los ejemplos de código puedan ser leídos sin mayor problema. Luego ya será cosa vuestra implementar estos ejemplos y mejorarlos para poder utilizarlos en vuestro dia a dia. Empezamos!

La gestión de usuarios y ordenadores la podemos realizar de manera clásica a través de la gui de Windows Server a través de Active Directory Users and Computers (ADUC) o a partir de Windows Server 2008 R2 a través de Active Directory Administrative Center (ADAC) pero el camino a seguir es depender lo menos posible de la gui y realizar el máximo de tareas posibles, si no todas, a través de Powershell contra los diferentes módulos y servicios instalados en nuestros servidores.

Como siempre y como con cualquier código que encontréis en Internet, probad los siguientes comandos en entornos de pruebas y adaptadlos a vuestro entorno antes de llevarlos a producción.

Gestión de usuario en Active Directory

Crear usuarios

Para crear un usuario utilizamos el cmdlet new-aduser, este lo podemos ejecutar así

New-aduser -name test

Pero de esta manera no tendremos un usuario funcional ya que son necesarios más datos como el full name, samaccountname, contraseña... para poder crear un usuario y que quede activado desde el minuto 1. Para ello primero deberemos crear una contraseña de tipo securestring para podersela asignar a posteriori al cmdlet.

$password=Read-Host “Introduce la contraseña” -assecurestring

Teniendo esto ya podemos ejecutar de nuevo el new-aduser, veréis que incluimos a modo de ejemplo diversas propiedades extras como country,city o path que no son necesarias, en el caso de path si no lo especificamos creará el usuario en la unidad organizativa (OU) por defecto.

New-aduser -name “nombreusuario” -surname “apellido” -givenname “nombre” -emailaddress “[email protected]” -samaccountname “nombreusuario” -accountpassword $password -displayname “nombre apellido” -department “IT” -country “ES” -city “ciudad” -path “OU=users, DC=cyberseguridad,DC=net” -Enabled $true -Passthru

En este ejemplo hemos creado un nuevo usuario al que hemos asignado a la OU “users”, activándolo y mostrando el resultado en pantalla con el parámetro -Passthru.

Ver información / Obtener un usuario

Para asignar un usuario determinado o ver la información del mismo utilizaremos el cmdlet get-aduser

Get-aduser -identity nombreusuario

De esta manera vemos una selección limitada de propiedades de usuario. En caso que queramos ver todas las propiedades utilizaremos el parámetro -properties *

Get-aduser -identity nombreusuario -properties *

Podemos filtrar la búsqueda por cualquiera de las propiedades del mismo como por ejemplo por name o por OU

Get-aduser -filter {name -like “usuario*”}

Get-aduser -filter * -searchbase “OU=lab, DC=cyberseguridad,DC=net”

Modificar usuarios

Acabamos de ver todas las propiedades de un usuario, que no son pocas, ahora vamos a ver como podemos modificar las mismas o completarlas en caso de necesidad con el cmdlet set-aduser. Lo primero que tenemos que hacer para modificar una propiedad de un usuario o usuarios es conocer qué tipo de dato acepta cada propiedad para saber que le podemos asignar. Para ello podemos asignar una búsqueda de usuarios a una varible

$variableusuarios=get-aduser -filter {name -eq “contable”} -property *

Una vez hecho esto, podemos escribir

$varibleusuarios.

E ir pulsando el tab hasta que aparezca la propiedad en la que estamos interesados (o escribirla directamente. Añadiendo un gettype al final nos indicará de que tipo de dato se trata.

$variableusuarios.description.gettype()

Por ejemplo en este caso la descripción nos indica que es un string. Podemos modificarla de la siguiente manera

Set-aduser -identity $variableusuarios -description “nueva descripción”

O también podríamos hacerlo de una manera menos directa con

$variableusuarios.description = “nueva descripción”
Set-aduser -instance $variableusuarios

De la misma manera también podemos actualizar diveras propiedades a la vez, pasando directamente valores o pasando variables en las que previamente los hayamos almacenado

set-aduser -identity $variableusuarios -department $departamento -city $ciudad -country $pais

Puede ser que alguno de los atributos que queramos cambiar este disponible como parámetro para el cmdlet set-aduser y que un comando como el anterior nos falle, en ese caso podemos usar los parámetros -add y -clear para modificar los valores.

set-aduser -identity $variableusuarios -clear department,city,country
set-aduser -identity $variableusuarios -add @{department=$departamento; city=$ciudad; country=$pais}

A modo de ejemplo y siendo el caso más habitual, todos estos cambios los prepararíamos en un .csv con varias columnas, supongamos que tenemos uno con las columnas nombredeusuario, departamento, ciudad y país. Con estos datos y los siguientes comandos podemos actualizar masivamente nuestros usuarios en pocos segundos.

$usuarios = Import-CSV c:\datosdeusuarios.csv
foreach($usuario in $usuarios) { set-aduser -identity $usuario.nombredeusuario -department $usuario.departamento -city $usuario.ciudad -country $usuario.pais}

Activar/desactivar usuarios

Por lo general cuando un usuario deja la organización su cuenta se desactiva, podemos tener casos en los que se sigan políticas más estrictas en cuanto a seguridad y en los que cada vez que un usuario coja vacaciones se realice un proceso de desactivación y posterior activación de la cuenta. Esto que puede parecer tedioso con Powershell es cuestión de segundos.

Para activar un usuario usaremos el cmdlet enable-adaccount y para desactivar el disable-adaccount. Para ejecutarse estos cmdlets necesitan identificar inequivocamente al usuario a través de alguno de las siguientes propiedades:

  • Distinguished Name (DN). Por ejemplo CN=nombredeusuario, OU=lab, DC=cyberseguridad, DC=net
  • ObjectGUID. Por ejemplo 954199er-0df4-6571-b437-5rt42001b11d
  • Security Identifier (SID) Por ejemplo S-1-5-21-653638456-1125679544-1145158610-1114
  • SAMAccountName. Por ejemplo nombredeusuario

Podemos conseguir esos valores con get-aduser y pasarlos al cmdlet como vemos a continuación

disable-adaccount -identity nombredeusuario -passthru

O si tenemos un listado lo podríamos ejecutar así

get-content C:\exusuarios.txt | where-object { disable-adaccount -identity $_ }

Por ejemplo si queremos desactivar todos los usuarios de una unidad organizativa podemos hacerlo con el siguiente comando

get-aduser -searchbase "OU=exstaff,DC=cyberseguridad,DC=net" -filter * | disable-adaccount

Para limitar el alcance dentro de una unidad organizativa podemos usar el parámetro -searchscope con los valores de basic (o 0),onelevel (o 1) o subtree (o 2) este último es el valor por defecto lo que significa que si no indicamos el valor afectará a la unidad organizativa (en este caso exstaff) y a todas las OU anidadas dentro de la misma.

Mover usuarios entre OU

Lo normal es que dentro de una organización tengamos usuarios que se vayan moviendo entre departamentos y o fisicamente entre diferentes localizaciones o simplemente pasen de ser usuarios activos a inactivos, por tanto es importante ver como podemos mover facilmente a nuestros usuarios entre diferentes OU, para ellos usaremos el cmdlet move-adobject.

A diferencia de los anteriores vemos claramente en el nombre del cmdlet que este está diseñado para mover objetos, cualquier tipo de objeto de nuestro AD (usuarios, ordenadores, OU..). Nos encontramos con dos parámetros obligatorios, primero el -identity el cual identificará al objeto a través del DN o del GUID. El segundo parámetro obligatorio es el -targetpath el cual indicará el contenedor de destino del objeto, este debe ser el DN de la OU de destino.

El siguiente ejemplo muestra como mover un usuario al OU de exstaff

move-adobject -identity "CN=nombredeusuario,OU=lab,DC=cyberseguridad,DC=net" - targetpath "OU=exstaff,DC=cyberseguridad,DC=net"


Como vemos le hemos pasado el DN del objeto para que lo identifique y el DN de la OU de destino. De la misma manera que en ejemplo anteriores aquí por ejemplo movemos de OU a todos los usuarios que sean del departamento de IT

get-aduser -filter 'department -eq "IT"' | move-adobject -targetpath “OU=IT,DC=cyberseguridad,DC=net”

O de nuevo filtrando por OU

get-aduser -filter * -searchBase "OU=lab,DC=cyberseguridad,DC=net" | move-adobject -targetpath "OU=newlab,DC=cyberseguridad,DC=net"

Borrar Usuarios

Normalmente los usuarios en Active Directory no se suelen borrar ya que la práctica recomendada es desactivarlos y organizarlos debidamente en OUs. Pero también tenemos la posiblidad con el cmdlet remove-adobject ya que es cierto que la podemos necesitar en ciertos casos. De nuevo tenemos que pasar unos valores determinados para identificar al usuario, en este caso DN, objectGUID, SID o SamAccountName al parámetro -identity y ejecutarlo de la siguiente manera.

Remove-aduser -identity nombreusuario

De la misma manera podemos leer listas de usuarios de un archivo, seleccionar usuarios con get-aduser,etc...y pasarlos a este cmdlet. Al ser una operación crítica siempre se pide confirmación a no ser que utilicemos el parámetro -Confirm:$false que no recomendamos. Mejor perder unos segundos confirmando que no tener que recuperar un objeto equivocadamente borrado.

Gestión de ordenadores en Active Directory

Creando cuentas para ordenadores

Por lo general no se suelen crear cuentas en AD para ordenadores ya que estas se crean automáticamente cuando añadimos un ordenador al dominio. Sin embargo si queremos preasignar una OU determinada a la máquina o si realizamos tareas automatizadas de aprovisionamiento de máquinas a las que debemos proveer con una cuenta en AD previamente creada, el siguiente cmdlet es necesario. Hablamos de new-adcomputer.

Podemos crear una cuenta de ordenador de esta manera

New-adcomputer -name it09 -passthru

O asignar la máquina directamente a una OU (nos tenemos que asegurar que la OU exista previamente) con el comando

new-adcomputer -name it09 -path "OU=IT;OU=computers,DC=cyberseguridad,DC=net" -passThru

Modificar cuentas de ordenadores

Si los usuarios se mueven, los ordenadores ya ni te cuento.. Lo normal es que un ordenador comience su vida asignado a un usuario del departamento A, luego este se marche y pase al usuario 2 del departamento B... para ello importante utilizar el cmdlet set-adcomputer para mantener la información actualizada. Funciona de la misma manera que hemos visto anteriormente el set-aduser, por ejemplo aquí establecemos una descripción para una máquina.

set-adcomputer –identity it09 –description "ordenador test it"

Podemos ver la lista completa de atributos que se pueden modificar en la ayuda del cmdlet

Get-help set-adcomputer -full

Habilitar/deshabilitar ordenadores

A nivel de seguridad es importante mantener los ordenadores que no se están utilizando en ese momento deshabilitados para evitar que otro usuario pueda utilizarlo sin el conocimiento de los administradores, para eso vamos a utilizar un cmdlet génerico el enable-adaccount / disable-adaccount. Para deshabilitar una máquina en concreto podemos usar

Get-adcomputer -identity it09 | disable-adaccount

O si por ejemplo una oficina queda cerrada por un tiempo, deshabilitar todas las máquinas en base a su OU

Get-adcomputer -filter * -searchbase "OU=oficinatemporal,OU=computers,DC=cyberseguridad,DC=net" | disable-adaccount -passThru

Mover ordenadores a otras OU

Como hemos visto anteriormente el cmdlet move-adobject, es el encargado también de mover ordenadores por lo que podéis hacer referencia a lo dicho anteriormente. Os dejo un ejemplo de todas maneras de como se movería un ordenador a otro OU.

move-adobject -identity "CN=it09,CN=IT,CN=computers,DC=cyberseguridad,DC=net" -targetPath "OU=disponibles,DC=cyberseguridad,DC=net" -PassThru

Borrar cuentas de ordenador

En este caso y a diferencia de con usuarios, si que se suele eliminar cuentas de ordenadores que se eliminan. Para ello usaremos el cmdlet remove-adcomputer.

Para borrar una cuenta usaremos el comando

remove-adcomputer -identity it09

En este caso podemos utilizar una búsqueda por último lastlogondate que nos indica rapidamente cuentas de ordenadores que se nos hayan podido quedar colgadas en nuestro AD y que lleven x tiempo sin haber sido utilizadas. De la siguiente manera por ejemplo para localizar máquinas que no se hayan logueado en los últimos 90 dias.

$ordenadoresaborrar = get-adcomputer -filter * -properties lastlogondate | ? {$_.lastlogondate -lt (get-date).Adddays(-90) }
$ordenadoresaborrar | remove-adcomputer

De nuevo esta es una operación crítica y se nos pedira confirmación para cada uno de los borrados, es de nuevo recomendable no tan solo evitar esta confirmación sino revisar los objetos obtenidos de la búsqueda antes de lanzar el comando de borrado sobre ellos.

Esperemos como siempre que estos ejemplos os sirvan de ayuda y sean solo la base de vuestros futuros scripts que os hagan trabajar mucho más eficientemente con el potencial inmenso de powershell. Nos vemos en el próximo cybertruco.