Active Directory: Obtener la fecha de último inicio de sesión desde todos los controladores de dominio para múltiples usuarios.
El siguiente script funciona perfectamente, pero creo que es demasiado complejo y lento para lo que necesita hacer.
Básicamente, para una lista de usuarios en una variable (manualmente u obtenida de Get-ADUser, no importa), quiero consultar todos los controladores de dominio y obtener la fecha del último inicio de sesión para cada usuario. Luego lo usaré para contraseñas incorrectas, etc.
¿Alguna sugerencia para limpiarlo por favor que mejore mis habilidades de codificación?
$UserList = "User1", "User2"
$DCs = (Get-ADDomainController -Filter *).Name
$Combined = foreach ($User in $UserList)
{
$DCarray = [ordered] @{}
foreach ($DC in $DCs)
{
$DCresponse = Get-ADUser $User -Properties DisplayName, LastLogonDate -Server $DC | Select-Object Name, DisplayName, LastLogonDate
if( -not $DCarray.Contains("Name")) { $DCarray.Add("Name",$DCresponse.name) }
if( -not $DCarray.Contains("DisplayName")) { $DCarray.Add("DisplayName",$DCresponse.DisplayName) }
if( -not $DCarray.Contains($DC)) { $DCarray.Add($DC,$DCresponse.LastLogonDate) }
}
$Return = New-Object -TypeName psobject
foreach ($Key in $DCarray.keys)
{
$Each = $DCarray[$Key]
$Return | Add-Member -MemberType NoteProperty -Name $Key -Value $Each
}
$Return
}
$Combined | Format-Table -AutoSize
davy.ai
Solución
Una forma de simplificar y mejorar el rendimiento de este script es:
-Properties
con la propiedadLastLogonDate
solamente para reducir la cantidad de datos devueltos para cada usuario desde todos los controladores de dominio.Usando un
HashTable
en lugar de unDictionary
ordenado para almacenar los nombres del controlador de dominio y las últimas fechas de inicio de sesión, ya que el orden de clave no es importante en este caso y unHashTable
es más rápido.Combinando los nombres de los controladores de dominio y las últimas fechas de inicio de sesión en una sola matriz para crear un
pscustomobject
para cada usuario, en lugar de crear unpscustomobject
separado para cada controlador de dominio para cada usuario, porque simplifica el código y reduce la cantidad de objetos creados.Usando el cmdlet
Measure-Command
para medir el tiempo de ejecución del script para comparación.Aquí hay un script actualizado que implementa estos cambios:
Este script utiliza un único comando
Get-ADUser
para recuperar la propiedadDisplayName
para cada usuario, en lugar de incluirla en el bucle anidado. También crea un únicopscustomobject
para cada usuario que incluye los nombres del controlador de dominio y las últimas fechas de inicio de sesión como unpscustomobject
anidado, que se formatea como una lista separada por punto y coma para su visualización.El tiempo de ejecución de este script debería ser significativamente más rápido que el script original, especialmente para grandes cantidades de usuarios y controladores de dominio.