Active Directory es una de las piedras angulares de cualquier red basada en servidores Windows, pero en ocasiones la importancia de su mantenimiento no está tan presente como debería. Para evitar posibles problemas de seguridad en todos los servicios que dependen de AD hoy vamos a repasar como podemos identificar rápidamente aquellas cuentas inactivas a través de Powershell.
Dependiendo del tamaño de nuestro Active Directory y el movimiento de usuarios, es bastante probable que llegado un cierto momento nos encontremos con cuentas que han dejado de usarse pero que siguen estando activas, esto supone un importante problema de seguridad. Afortunadamente contamos como siempre con una herramienta tan potente como Powershell para de una manera rápida comprobar estos datos.
Antes que nada comprobamos que tengamos el módulo de AD en nuestro powershell con
Get-Module -listavailable
En caso que aparezca en la lista ya podemos seguir adelante, en caso que no lo importamos con
Import-Module ActiveDirectory
LastLogon: Cuando un usuario se loguea, este atributo se actualiza solo en el DC que ha provisto la autenticación, no es replicado. Este atributo es útil para saber en qué servicios se ha/no se ha logueado el usuario. Por ejemplo con el siguiente script podemos obtener esta información sobre un usuario en todos los DC del dominio.
$(foreach ($DC in (get-addomaincontroller -filter * | sort name | select name)) { $user = get-aduser nombredeusuario -properties lastlogon -server $DC.name | select name,lastlogon ; echo "$DC - $(w32tm /ntte $user.lastlogon)"})
El resultado será algo como lo siguiente
@{name=Servidor} - 151796 08:03:15.2968030 - 09/08/2016 10:03:15
LastLogonTimeStamp: Este atributo es similar al anterior salvo que este dato si se replica. Aunque para evitar un excesivo número de llamadas entre DC cada vez que un usuario se loguea, la necesidad o no de esta sincronización se calcula mediante un tercer atributo, ms-DS-Logon-Time-Sync-Interval (que por defecto es de 14 días) y una serie de cálculos adicionales.
Este valor también lo podemos utilizar para identificar cuentas inactivas, aunque su formato (NT Time) hace que no sea muy cómodo de utilizar.
LastLogonDate: Finalmente tenemos a LastLogonDate, este será el atributo más útil ya que aunque no es un valor replicado si calcula el valor a partir de LastLogonTimeStamp, que si es replicado. Vamos a ver algunos ejemplos:
Obtener listado de usuarios que no se han logueado en los últimos 10 días
get-aduser -filter * -properties * | Where-Object {$_.lastlogondate -le (get-date).adddays(-10)} | select userprincipalname
Cambiando el "le" (lower or equal) y el valor de días pues podemos obtener cualquier dato.
Cmdlet Search-ADAccount
Como alternativa también disponemos del cmdlet Search-ADAccount. Vamos a repetir el anterior ejemplo pero esta vez con el cmldlet
Search-ADAccount -AccountInactive -DateTime ((get-date).adddays(-10)) -UsersOnly | select userprincipalname
O un poco más elaborado, añadiendo fecha y hora de último log in.
Search-ADAccount -AccountInactive -DateTime ((get-date).adddays(-10)) -UsersOnly | sort -property lastlogondate | ft samaccountname, lastlogondate -AutoSize
Como veis, diferentes maneras de recavar los datos que queremos de una manera rápida y sencilla para mantener nuestros AD en perfecto estado.
Fuente Microsoft