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.

powershellactivedirectory

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