Descubre los diez comandos de PowerShell que pueden serte realmente útiles para mantener controlado tu AD DS Server y los objetos que contiene (usuarios, equipos, grupos), ahorrando tiempo en su mantenimiento, pero sin perder ni un ápice de control ni alcance.
La configuración y control de una infraestructura de TI es una tarea ardua en la que el equipo técnico tiene que invertir un gran esfuerzo, con cientos de horas dedicadas a la correcta planificación y configuración, y cientos, sino miles de horas de mantenimiento, incluyendo tareas de diversa índole.
Dentro de todas estas tareas, la gestión de la infraestructura de Active Directory Domain Services (AD DS) debería ser siempre una de nuestras prioridades, ya que es uno de los puntos más sensibles dentro de nuestras instalaciones.
Una mala gestión de la seguridad de este servicio troncal de nuestro departamento puede comprometer la seguridad de toda la empresa, y por eso debemos tener un ojo siempre puesto en el estado de AD DS.
En este artículo vamos a hablar de algunos comandos de PowerShell que nos van a servir para comprobar el estado de distintos elementos de nuestro directorio activo para realizar esta monitorización de manera rápida y eficiente.
Hemos de decir que no son todos los comandos necesarios para un control exhaustivo de la infraestructura, pero nos permiten empezar con esta tarea, pudiendo añadir comandos adicionales poco a poco o preparando incluso scripts que nos permitan hacer estas comprobaciones de manera automatizada.
Por otro lado, también debemos tener claro que, en este artículo, se está hablando de monitorización, auditoría o una simple comprobación, que las configuraciones, las comentamos, al menos a modo introductorio, en otro artículo sobre AD DS.
NOTA: Los comandos y scripts que se exponen a continuación, han sido testeados sobre Windows Server 2022 y pueden no funcionar de igual manera en caso de ejecutarse en otras versiones de Windows. Esto sucede porque existen distintas versiones de PowerShell. Para identificar la que ejecuta su sistema, puede ejecutar alguno de los siguientes comandos en una ventana de Windows powerShell: “Get-Host” o “$PSVersionTable” o “$PSVersionTable.PSVersion”.
Lo primero que hemos de decir es que vamos a hablar de comprobar distintos objetos dentro de nuestra infraestructura de AD DS:
A pesar de que vamos a tratar estos elementos de AD DS, posiblemente vamos a tratar en mayor profundidad los usuarios, ya que suelen ser los más proclives a comprometer la seguridad de nuestra empresa.
NOTA: Antes de poder trabajar con PowerShell en la gestión de Active Directory Domain Services (AD DS), debemos importar el módulo. Para ello se debe ejecutar el siguiente comando desde una consola de PowerShell con permisos de administrador “Import-Module ActiveDirectory”.
Las consultas que vamos a realizar son las siguientes:
En este caso, mostramos la forma de hacer un listado de usuarios pertenecientes a una Unidad Organizativa (OU, Organizative Unit) en concreto, para así tener claros que usuarios están en dicha OU y se benefician de las GPO que se apliquen sobre la misma.
Podemos ejecutarlo de varias maneras, la forma más cómoda, para permitir hacer distintas consultas de manera rápida es mediante el uso de una variable en la que pasamos la Unidad Organizativa.
En este caso, por ejemplo, supongamos que estamos trabajando con el dominio “pruebasnacho.com” y queremos saber los usuarios de la Unidad Organizativa de “Zaragoza” dentro de “Delegaciones”, la forma de declarar la variable sería:
$OU = ‘ou=Zaragoza,ou =Delegaciones,dc=pruebasnacho,dc=com’
Pudiendo ejecutar a continuación el siguiente comando:
Get-ADUser -Filter * -SearchBase $OU | Select-object Name,DistinguishedName,UserPrincipalName,Enabled,SID | Export-CSV “C:\Temp\UsuariosOU1.CSV” –NoTypeInformation
Listado de usuarios de una OU en concreto de nuestro AD DS Server mediante PowerShell
La segunda forma, un poco menos “limpia” es poner directamente los datos de la OU dentro del comando, quedando de esta manera:
Get-ADUser -Filter * -SearchBase ‘ou=Zaragoza,ou =Delegaciones,dc=pruebasnacho,dc=com’ | Select-object Name,DistinguishedName,UserPrincipalName,Enabled,SID | Export-CSV “C:\Temp\UsuariosOU1.CSV” –NoTypeInformation
A continuación, comento las distintas opciones que estamos usando aquí:
Ejemplo de fichero CSV de salida tras la ejecución del comando de PowerShell en nuestro AD DS Server
De la misma manera, podríamos obtener todos los usuarios de todas las OU, o lo que es lo mismo, de todo el dominio eliminando “SearchBase”, y quedando similar a lo que se muestra a continuación:
Get-ADUser -Filter * | Select-object Name,DistinguishedName,UserPrincipalName,Enabled,SID | Export-CSV “C:\Temp\UsuariosOU1.CSV” –NoTypeInformation
Otra cosa que debemos mirar es que usuarios tenemos en el directorio que tengan sus cuentas expiradas. O sea, las que ya no deberían existir porque se les ha pasado el tiempo para el que fueron creadas.
Para lanzar esta consulta, vamos a utilizar el comando “Search-ADAccount” ya que este comando, a diferencia de “Get-ADUser” si que nos permite hacer la consulta de la fecha de expiración de los accesos.
El comando queda de la siguiente manera:
Search-ADAccount -AccountExpired | Select-Object Name,DistinguishedName,UserPrincipalName,Enabled,SID,AccountExpirationDate
Este caso es bastante más sencillo ya que tenemos menos modificadores y parámetros a tener en cuenta:
El campo “La cuenta expira” dentro de la pestaña “Cuenta” de nuestro AD DS Server
También podemos añadir el modificador “UsersOnly” tras la expiración para que no liste más que los usuarios.
Normalmente, en mi caso, seguiría usando el “Export-CSV” para sacarlo a un fichero, ya que me gusta guardar las consultas para poder revisar cambios, errores, etc. En este caso, igual que en algunos de los siguientes, no lo voy a usar, para poder hacer las demostraciones más rápidas y poder ver la ejecución directamente en las capturas.
Listado de cuentas de usuario expiradas en nuestro AD DS Server con PowerShell
Otro de los puntos que deben auditarse son las cuentas que se han deshabilitado. Estas cuentas suelen ser cuentas de usuarios que han dejado la empresa, han sido despedidos, ya no se usan, etc. En principio, no deberían ser peligrosas porque no permiten que el usuario se valide en el directorio, pero deberían eliminarse para mayor seguridad.
Las cuentas deshabilitadas se listan mediante el comando “Get-ADUser” y consultando que la propiedad “Enabled” está como un falso booleano, no requiriendo más parámetros, tal como se ve en la siguiente línea:
Get-ADUser -Filter {(Enabled -eq $False)} | Select-Object Name,DistinguishedName,UserPrincipalName,Enabled,SID,LastLogon
En este caso, solo tenemos que usar “Select-Object” para seleccionar que campos queremos que se muestren en la consulta que estamos haciendo. Una vez más, para saber los campos, se recomienda lanzar el comando original sin modificadores para ver qué información podemos obtener. En este caso, podemos incluir el nombre, la cuenta, SID, etc. En adición, puede ser interesante listar también el “LastLogon” para ver cuando se valido por última vez en el sistema.
Listado de cuentas de usuario deshabilitadas en nuestro AD DS Server con PowerShell
También lo podríamos consultar de manera manual para un usuario concreto usando el comandoGet-ADUser:
Get-ADUser <nombre_de_usuario> | select Name,DistinguishedName,UserPrincipalName,Enabled,SID,LastLogon
Donde <nombre_de_usuario> es el usuario sobre el que se quiere consultar.
En el caso de querer consultar por el usuario “Sandra” se debería escribir lo siguiente:
Get-ADUser Sandra | select Name,DistinguishedName,UserPrincipalName,Enabled,SID,LastLogon
Comprobando si una cuenta de usuario de nuestro AD DS Server está deshabilitadas
Otro punto para revisar son las cuentas bloqueadas por haber superado un número concreto de intentos de acceso fallidos. Este puede ser un indicativo de que una cuenta tiene usuarios malintencionados que intentan acceder probando contraseñas, aunque posiblemente no se más que debido a usuarios que comenten varios errores al acceder o no recuerdan su contraseña.
El comando a ejecutar es bastante sencillo, y nuevamente, se basa en “Search-ADAccount”.
Search-ADAccount -LockedOut | Select-Object Name,DistinguishedName,UserPrincipalName,Enabled,SID,LastLogon
Donde usuraríamos los modificadores siguientes:
Listado de cuentas de usuario bloqueadas en nuestro AD DS Server con PowerShell
En este caso se va a buscar aquellos usuarios que no han abierto sesión en un tiempo, como por ejemplo 90 días, lo que se consideran usuarios inactivos en el dominio.
La búsqueda se realiza en base al comando “Search-ADAccount”:
Search-ADAccount –AccountInActive –TimeSpan 90:00:00:00 | Select-Object Name,DistinguishedName,SID,LastLogon
Donde tenemos lo siguiente:
Ejecutamos el comando para buscar usuarios inactivos en nuestro AD DS Server
Otro de los puntos que debemos vigilar dentro de nuestra infraestructura son los usuarios cuya contraseña nunca expira. El mecanismo de caducidad de las contraseñas permite que las contraseñas se mantengan seguras mediante una rotación que imposibilita que los usuarios se acomoden y usen, por ejemplo, las mismas contraseñas para todos los sistemas, las webs, los bancos, etc.
Las únicas cuentas que deberían permanecer con una contraseña perenne son las asociadas a servicios, ya que su caducidad podría detener los servicios con los que se ejecutan dichos servicios.
Para localizar el resto de los usuarios podremos usar el comando “get-aduser” con una serie de parámetros y haciendo una selección en base a los usuarios cuya contraseña no expira . El comando quedaría de la siguiente manera:
get-aduser -filter * -properties PasswordNeverExpires | where {a través de la opción “PasswordNeverExpires”
$_.passwordNeverExpires -eq «true» } | Select-Object Name,DistinguishedName,UserPrincipalName,Enabled,SID
Como en los casos anteriores, para estos ejemplos mostramos las propiedades “Name,DistinguishedName,UserPrincipalName,Enabled,SID” pero se puede mostrar cualquier otro. Para ver las opciones disponibles, se puede ejecutar el comando “get-aduser -filter *”.
Listando cuentas de usuario de nuestro AD DS Server que nunca caducan
Uno de los fallos más grandes que podemos tener cuando estamos gestionando usuarios, es permitir usuarios con contraseñas débiles, ya que estarán expuestos a ataques de fuerza bruta, en base a diccionarios, etc.
Esto se soluciona con políticas de contraseñas fuertes, y en el caso de las nuevas versiones de Windows Server estas políticas suelen estar activas de manera predeterminada. Para aprender más sobre las políticas de contraseñas de Microsoft puedes consultar el siguiente enlace.
Pero, si tenemos políticas de contraseñas que fuerzan a los usuarios ¿Por qué podemos encontrar usuarios con contraseñas débiles? Esto puede deberse a cuando tenemos directivos u otros usuarios privilegiados a los que hay que crearles contraseñas en circunstancias especiales y termina creándose una política especial de contraseña para permitirles contraseñas ridículamente fáciles, siendo esta es una práctica que deberíamos intentar erradicar.
Para realizar esta búsqueda se debe importar el módulo “DSInternals” ejecutando el siguiente comando:
Install-Module DSInternals
Importamos el módulo DSInternals de PowerShell aceptando las opciones
En este caso, se utiliza primero un archivo para cargar un diccionario de contraseñas. Se puede utilizar uno de los muchos que hay disponibles en internet o crear el nuestro propio. En caso de descargar uno de internet, sería recomendable incluir por ejemplo el nombre de la empresa, la ciudad, etc.
$Passwords = «C:\Users\Administrador\Desktop\passwords.txt»
Una vez se cargue el dicccionario se puede ejecutar el comando de consulta, que tiene la siguiente forma:
Get-ADReplAccount -All -Server ‘<SERVIDOR_CON_FQDN>’ | Test-PasswordQuality -WeakPasswordsFile $Passwords -IncludeDisabledAccounts
Donde tenemos lo siguiente:
En nuestro ejemplo, sería de la siguiente manera:
Get-ADReplAccount -All -Server ‘WIN-Q28KD6B1DN2.pruebasnacho.com’ | Test-PasswordQuality -WeakPasswordsFile $Passwords -IncludeDisabledAccounts
Ejecutamos la consulta de PowerShell para encontrar las contraseñas débiles en AD DS Server
Como este caso es bastante complejo, se ha optado por usar el script creado por Adam Bertram.
A la hora de auditar nuestro directorio activo, también deberíamos tener un ojo puesto en todos los usuarios nuevos creados, y si todo está organizado como debe, deberíamos tener conciencia de cuando se crea un usuario nuevo.
Listando, por ejemplo, de manera semanal los usuarios nuevos de nuestro AD DS y confrontando la lista obtenida con los listados que se tienen en el departamento de TI de nuevos usuarios, podremos detectar usuarios creados sin autorización.
Para hacer esta búsqueda, se puede crear previamente una variable en la que se pase el tiempo de antigüedad de los usuarios. Si, por ejemplo, queremos que se muestren los creados en los últimos 7 días, deberemos usar un valor de “7” para “AddDays”, ya que dicha variable, lo que hace es calcular la fecha actual y restarle el valor que hayamos metido en “AddDays”.
Una vez declarada dicha variable, se usará el comando “Get-ADUser” para hacer una consulta en base al parámetro de creación de la cuenta “whenCreated” en el cual se confronta la fecha frente a la fecha que hemos declarado anteriormente en esa variable. Si al hacer la comparación, encuentra que el valor obtenido es más grande (-ge) muestra la cuenta, pasando únicamente las propiedades que se han marcado para filtrar.
El comando sería como se muestra a continuación, aunque en este ejemplo está para un día de antigüedad.
$Fecha = ((Get-Date).AddDays(-1)).Date
Get-ADUser -Filter {whenCreated -ge $Fecha} -Properties *| Select-Object Name,DistinguishedName,SID,Enabled,whenCreated
Listar nuevos usuarios en nuestro AD DS Server mediante PowerShell
En lo que respecta a los equipos dados de alta en el dominio, podemos hacer una consulta para extraer sus datos y poder listarlos para inventariarlos o para poder tratarlos posteriormente.
La consulta es bastante simple y básicamente consiste en lanzar el comando “Get-ADComputer” que lista los equipos y servidores (todos los elementos dados de alta como “computer”) filtrando sus propiedades y sacando los elementos que nos parezcan relevantes.
El comando quedaría conformado de la siguiente manera:
Get-ADComputer -Filter * -Property * | Select-Object Name,DNSHostName,OperatingSystem,ipv4Address
Y en este caso, nosotros hemos decidido extraer las siguientes propiedades o campos:
Listando las máquinas dadas de alta dentro de nuestro AD DS Server mediante PowerShell
También nos deberíamos preocupar de eliminar del dominio aquellos equipos que lleven mucho tiempo inactivos. Estos equipos suelen ser antiguos PC que nadie informó de que se habían amortizado y se habían retirado del parque informático.
Muchas veces, esos equipos, terminan siendo regalados a empleados, entidades no gubernamentales o centros educativos, como forma de potenciar su marca, mostrar su compromiso con la sociedad, etc., y siendo una política alineada con la RSC.
El problema, es que muchos de estos equipos, cuando salen de la empresa, lo hacen sin haber pasado por un proceso de limpieza, o lo que es lo mismo, sin haberlos formateado y haberles pasado un proceso de destrucción de datos.
Detectar los equipos, por tanto, debería ser una prioridad para nuestro departamento, para retirarlos lo antes posible y para asegurarnos de que no puedan usarlos para conectarlos de manera fraudulenta.
Para detectar estos equipos usaremos el comando “Get-ADComputer”, pero pasando previamente una variable en la que se calcule el tiempo, de manera similar a como calculábamos los nuevos usuarios del dominio.
Si se cumple con la condición, lo que se hace es filtrar y mostrar los campos que se quiera ver, que en nuestro ejemplo serán únicamente el nombre de máquina y la última vez que se validó.
$time = (Get-Date).Adddays(-(180))
Get-ADComputer -Filter {LastLogonTimeStamp -lt $time} -Properties Name ,LastLogonDate
Para hacer esta búsqueda, igual que pasaba en el caso de los usuarios inactivos, se puede crear previamente una variable en la que se pase el tiempo que pasa desde el día de hoy hasta el margen marcado. Por ejemplo los 180 días (6 meses) que queremos usar como filtro, y que marcamos en este ejemplo deberemos usar un valor de “180” para “AddDays”, ya que dicha variable, lo que hace es calcular la fecha actual y restarle el valor que hayamos metido en “AddDays”.
Listando las máquinas inactivas dentro de nuestro AD DS Server mediante PowerShell
Otro punto que deberíamos tener controlado, son los equipos que se han deshabilitado dentro del dominio, ya que son equipos que en teoría se deberían haber retirado.
Para localizarlos basta con hacer una consulta con “Get-ADComputer” filtrando aquellos que tengan la propiedad “Enabled” como falsa.
El comando podría ser algo similar a este que se muestra a continuación:
Get-ADComputer -Filter {(Enabled -eq $False)} | Select-Object Name
Como siempre, mediante “Select-Object” podemos decir que propiedades queremos que se nos muestren. En este caso, hemos seleccionado solo el nombre de la máquina, pero recomendamos revisar cuales son las que más información útil nos aportan.
Listando las máquinas deshabilitas dentro de nuestro AD DS Server mediante PowerShell
NOTA: El establecimiento de los días que tienen que pasar para que una máquina se considere inactiva es un tema que debería pensarse tranquilamente, ya que depende de la idiosincrasia de cada empresa.
Por supuesto, como ya habrá observado el lector, este no es un listado definitivo, ya que podríamos dar muchos más comandos, pero hemos elegido los 10 primeros que se pueden usar para extraer información relevante para la seguridad de los usuarios y equipos.
Nos quedaría repasar muchas cosas como el estado de salud de los servidores Domain Controller (Controladores de Dominio), revisar los eventos del sistema relacionados con AD DS, la sincronización entre los DC, la sincronización del servicio de hora, y tantas otras cosas, pero no queremos extender demasiado los artículos, para poder extraerle el jugo lo más rápidamente posible, motivo por el que estos temas se tratan en otros artículos de nuestro blog.
Con lo que aquí se ha expuesto podemos empezar a tomar el control de los elementos de los objetos (usuarios y equipos) que tenemos en nuestro AD DS Server, y podemos introducirlos como una tarea programada que ejecutemos en nuestras tareas de mantenimiento, siendo una buena práctica el ejecutarlos al menos una vez al mes para ver los cambios que se han producido y si hay algo que ha escapado de nuestro radar.
Como siempre, os recomendamos revisar PowerShell ya que su potencial es ilimitado y se puede utilizar para gestionar de manera eficiente toda la infraestructura de Microsoft, tanto clientes, como servidores y servicios, y ciertos elementos GNU/Linux.