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 "---"
$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:
Publicar un comentario