Cómo identificar equipos y usuarios inactivos en Active Directory mediante PowerShell

Gestionar cuentas inactivas en Active Directory es una tarea bastante común. Los administradores suelen necesitar limpiar cuentas de usuario o equipo sin usar para mantener el dominio ordenado, reducir posibles riesgos de seguridad y evitar que la base de datos de AD se sobrecargue innecesariamente.¿Necesita saber qué cuentas no han iniciado sesión durante mucho tiempo? PowerShell es la solución ideal: es flexible y puede procesar por lotes una gran cantidad de objetos. Sin embargo, a veces resulta un poco complicado obtener el atributo o filtro correcto, especialmente porque lastLogonTimestamp no es en tiempo real y depende de la replicación. Por lo tanto, es crucial encontrar una forma fiable de identificar las cuentas antiguas que están realmente inactivas.

Esta guía explica cómo usar PowerShell (y algunos comandos específicos) para localizar cuentas de usuario y equipo inactivas. Al final, tendrás un método claro para generar informes, ya sea para limpiezas regulares o auditorías, e incluso para deshabilitar o eliminar las cuentas antiguas que ya no necesitas. Obtendrás una lista de cuentas obsoletas con información como la hora del último inicio de sesión, e incluso podrás automatizar parte de la limpieza si te sientes abrumado. Un aviso: si no conoces PowerShell o los módulos de Active Directory, es posible que primero tengas que habilitar algunas funciones (como RSAT y el módulo de Active Directory).A veces, en ciertas configuraciones de Windows, tienes que instalar RSAT manualmente o ejecutar un comando rápido para que todo se cargue.

Cómo encontrar computadoras y usuarios inactivos (antiguos) en Active Directory

Método 1: Encontrar equipos inactivos con LastLogonTimeStamp

Esta es probablemente la forma más común de detectar computadoras antiguas en AD. El LastLogonTimeStamp se replica entre controladores de dominio, pero solo aproximadamente cada semana. No es en tiempo real, pero es suficiente para tener una idea general. La clave es comparar el valor del LastLogonTimeStamp con una fecha (por ejemplo, de hace 180 días) y ver qué ha estado inactivo durante ese tiempo.

Aquí está la lista de comandos que probablemente necesitarás:

$LastLogonDate = (Get-Date).AddDays(-180) Get-ADComputer -Properties LastLogonTimeStamp -Filter {LastLogonTimeStamp -lt $LastLogonDate} -SearchBase "OU=Computers, OU=Mun, DC=woshub, DC=com" | Sort-Object LastLogonTimeStamp | Format-Table Name, @{N='LastLogon'; E={[DateTime]::FromFileTime($_. LastLogonTimeStamp)}} -AutoSize

Este comando genera una lista de equipos en la unidad organizativa especificada que no han iniciado sesión durante más de medio año. Si el resultado le parece útil, simplemente agregue Get-ADComputer con los filtros adecuados. Puede exportarlo como CSV o incluso deshabilitar estos equipos inmediatamente:

Get-ADComputer...| Export-Csv C:\ps\inactive_computers.csv -NoTypeInformation

Y si te sientes REALMENTE proactivo, podrías desactivar esas computadoras con:

Get-ADComputer...| Disable-ADAccount

O muévalos a algún lugar como la unidad organizativa «Computadoras deshabilitadas»:

Get-ADComputer...| Move-ADObject -TargetPath "OU=Disabled Computers, DC=woshub, DC=com"

En ocasiones, he visto que, tras ejecutar estos comandos, las cuentas siguen activas o el lastLogonTimestamp puede estar ligeramente desactualizado. Porque, claro, Windows tiene que complicarlo más de lo necesario.

Método 2: Encontrar cuentas de usuario inactivas

Lo mismo ocurre con los usuarios: LastLogonTimeStamp es tu aliado. Puedes crear un comando que enumere las cuentas de usuario que no han estado activas durante medio año:

$LastLogonDate = (Get-Date).AddDays(-180) Get-ADUser -Properties LastLogonTimeStamp -Filter {LastLogonTimeStamp -lt $LastLogonDate} -SearchBase "OU=Users, OU=Mun, DC=woshub, DC=com" | Where-Object {$_. Enabled -eq $true} | Format-Table Name, @{N='LastLogon'; E={[DateTime]::FromFileTime($_. LastLogonTimeStamp)}} -AutoSize

Nuevamente, puedes deshabilitar esas cuentas obsoletas o exportar la lista para su revisión. Simplemente introduce «Disable-ADAccount» o «Remove-ADUser» si eres tan atrevido.

Método 3: Usar Search-ADAccount para cubrirlo todo

Este es un verdadero salvavidas. En lugar de tener que manipular atributos o filtrar manualmente, Search-ADAccount es un comando integral que ayuda a encontrar objetos deshabilitados, caducados, bloqueados o inactivos a la vez. Es como la navaja suiza de la limpieza de AD.

Por ejemplo, para encontrar cuentas de usuario deshabilitadas, simplemente ejecute:

Search-ADAccount -UsersOnly -AccountDisabled

Y si desea limitarse a una unidad organizativa específica:

Search-ADAccount -UsersOnly -AccountDisabled -SearchBase "OU=Admins, OU=Accounts, DC=woshub, DC=com"

Para ver más datos en un formato manejable, transfiéralos a Format-Table:

Search-ADAccount -UsersOnly -AccountDisabled -SearchBase "OU=Admins, OU=Accounts, DC=woshub, DC=com" | Format-Table Name, LastLogonDate, Enabled -AutoSize

Este cmdlet también permite encontrar cuentas bloqueadas o cuentas inactivas durante un período determinado, lo que resulta muy útil durante una limpieza seria o una auditoría de seguridad.

A veces, requiere un poco de experimentación, especialmente con filtros o la especificación de bases de búsqueda, pero en definitiva, Search-ADAccount facilita la tarea a los profesionales de AD que no quieren manipular manualmente cada atributo. En algunas configuraciones, puede que no ofrezca resultados perfectos en tiempo real, pero se acerca lo suficiente para tomar decisiones informadas.

Resumen

  • Úselo Get-ADComputercon LastLogonTimeStamp para encontrar máquinas no utilizadas.
  • Aproveche Get-ADUserLastLogonTimeStamp para cuentas de usuario obsoletas .
  • Intente Search-ADAccountrealizar un análisis más completo de los objetos de AD.
  • Active la desactivación o eliminación de cuentas con Disable-ADAccount o Remove-ADUser.

Resumen

En resumen, encontrar cuentas inactivas no es complicado, pero requiere cierta familiaridad con PowerShell y los atributos de AD. Si realiza estas comprobaciones con regularidad, identificará rápidamente qué objetos son innecesarios y se pueden deshabilitar o eliminar de forma segura. Tenga en cuenta que lastLogonTimestamp no es perfecto (es más bien una cifra aproximada), por lo que algunas cuentas legítimas podrían aparecer inactivas cuando no lo están, o viceversa. Aun así, estos métodos son suficientemente eficaces para la mayoría de las tareas de limpieza. Ojalá esto ayude a convertir una tarea aparentemente enorme en algo manejable.