Uno de los desafíos no menores que he enfrentado en mi trayectoria profesional es la ejecución de scripts para distintos tipos de clientes. El siguiente script ha sido de gran utilidad para realizar un análisis muy específico, permitiéndome identificar la unidad organizativa (OU) a la que pertenece un usuario, así como su información de inicio de sesión y si su cuenta está habilitada o no.
Para incluir el atributo lastLogon en el script , que recorre todas las Unidades Organizativas (OU) obteniendo el sAMAccountName, mail, a qué OU pertenece cada usuario, y luego guarda esta información en un archivo CSV, necesitarás hacer un pequeño ajuste. Es importante mencionar que lastLogon es un atributo que no se replica entre los controladores de dominio. Esto significa que si tienes más de un controlador de dominio, podrías no obtener el último inicio de sesión real a menos que consultes todos ellos y determines cuál es el más reciente. Sin embargo, para simplificar, puedes usar lastLogonTimestamp, que es una aproximación replicada del lastLogon y es suficiente para la mayoría de los propósitos administrativos.
# Define la ruta del archivo CSV donde se guardarán los resultados
$rutaArchivoCSV = "C:\PowerShell\UsuariosYsusOUsv1.csv"
# Obtener todas las OUs
$ous = Get-ADOrganizationalUnit -Filter *
# Lista para almacenar los resultados
$resultados = @()
foreach ($ou in $ous) {
# Obtener usuarios en la OU actual
$usuarios = Get-ADUser -Filter * -SearchBase $ou.DistinguishedName -Properties *
#-Properties sAMAccountName, mail, lastLogonTimestamp
# Añadir la información de cada usuario a la lista de resultados
foreach ($usuario in $usuarios) {
$lastLogon = $usuario.lastLogonTimestamp
# Convertir lastLogonTimestamp a DateTime
if ($lastLogon -ne $null) {
$lastLogonDate = [DateTime]::FromFileTime($lastLogon)
} else {
$lastLogonDate = "Nunca"
}
$resultados += [PSCustomObject]@{
sAMAccountName = $usuario.sAMAccountName
UserPrincipalName =$usuario.UserPrincipalName
Mail = $usuario.mail
DisplayName = $usuario.DisplayName
Enabled=$usuario.Enabled
Fax =$usuario.Fax
Description =$usuario.Description
whenCreated=$usuario.whenCreated
proxyAddresses=$usuario.proxyAddresses
OU = $ou.DistinguishedName
LastLogon = $lastLogonDate
}
}
}
# Exportar resultados a CSV
$resultados | Export-Csv -Path $rutaArchivoCSV -NoTypeInformation -Encoding UTF8
Write-Host "Los datos han sido exportados a '$rutaArchivoCSV'"
Este script ahora también recupera lastLogonTimestamp para cada usuario y lo convierte a un formato de fecha y hora legible (DateTime). La conversión se realiza mediante [DateTime]::FromFileTime($lastLogon), lo cual es necesario porque lastLogonTimestamp se almacena como un valor de tiempo de archivo de Windows. En caso de que el usuario nunca haya iniciado sesión, se muestra «Nunca».
