viernes, 24 de febrero de 2012

Contraseñas caducadas del Directorio Activo

A medida que se van agregando cuentas de usuario en el Directorio Activo, dependiendo del uso de estas cuentas, el número de cuentas con contraseña caducada puede incrementarse en el tiempo.

A parte de implementar una política de recuperación de contraseñas y a efectos de limpieza, conviene saber qué cuentas tienen la contraseña caducada para tomar medidas, ya sea para eliminar la cuenta o para que el usuario recupere la contraseña.

El siguiente script en Powershell extrae el tiempo de vigencia de las contraseñas de la política del dominio y la fecha en que se estableció la contraseña en cada cuenta de usuario. Con estos dos datos y la fecha actual, el script lista el estado de la contraseña de cada usuario, el total de cuentas con la contraseña vigente, el total de cuentas con la contraseña caducada y el número de cuentas totales:
# caducadas.ps1 - Cuentas con contraseña vigente o caducada

$fecha_actual = Get-Date
$total = 0
$vigentes = 0
$caducadas = 0

# detección del dominio y preparación de búsquedas
$dom = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$root_dom = New-Object DirectoryServices.DirectoryEntry("LDAP://$dom")
$search = [System.DirectoryServices.DirectorySearcher]$root_dom

# vigencia actual en días de las contraseñas del dominio
$search.Filter = "(objectclass=domainDNS)"
$result = $search.FindOne()
$vigencia_actual_pass = New-Object System.TimeSpan([System.Math]::ABS($result.properties["maxpwdage"][0]))
$dias_vigencia_actual = $vigencia_actual_pass.Days

# vigencia actual de la contraseña de cada usuario
$search.Filter = "(&(objectClass=user)(objectCategory=person))"
$users = $search.findall()

foreach ($user in $users)
{
$total++
$sam = $user.Properties.samaccountname

$fecha_lastset = [datetime]::fromfiletime(($user.properties.pwdlastset)[0])
$fecha_caducidad = $fecha_lastset.AddDays($dias_vigencia_actual)

# fecha actual mayor o igual que fecha de caducidad
if ($fecha_actual -ge $fecha_caducidad)
{
write-host "caducada - $sam"
$caducadas++
}
else # fecha actual menor que fecha de caducidad
{
write-host "vigente - $sam"
$vigentes++
}
}

Write-Host "---"
Write-Host "Estado de contraseñas:"
Write-Host ""
Write-Host " Vigentes: $vigentes"
Write-Host "Caducadas: $caducadas"
Write-Host " Total: $total"
Write-Host "---"

No hay comentarios: