es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución

    Una forma de simplificar y mejorar el rendimiento de este script es:

    1. Usar el parámetro -Properties con la propiedad LastLogonDate solamente para reducir la cantidad de datos devueltos para cada usuario desde todos los controladores de dominio.
    2. Usando un HashTable en lugar de un Dictionary 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 un HashTable es más rápido.

    3. 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 un pscustomobject separado para cada controlador de dominio para cada usuario, porque simplifica el código y reduce la cantidad de objetos creados.

    4. 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:

    $UserList = "User1", "User2"
    
    $DCs = (Get-ADDomainController -Filter *).Name
    
    $Combined = foreach ($User in $UserList)
    {
        $DCHash = @{}
        foreach ($DC in $DCs)
        {
            $DCresponse = Get-ADUser $User -Properties LastLogonDate -Server $DC |
                Select-Object @{Name='DC';Expression={$DC}}, LastLogonDate
            $DCHash[$DC] = $DCresponse.LastLogonDate
        }
        [pscustomobject]@{
            Name        = $User
            DisplayName = (Get-ADUser $User).DisplayName
            LastLogon   = [pscustomobject]$DCHash
        }
    }
    
    $Combined | Format-Table Name, DisplayName, @{Name='LastLogon';Expression={$_.LastLogon -join '; '}} -AutoSize
    Measure-Command {$Combined = foreach ($User in $UserList) {...}}
    

    Este script utiliza un único comando Get-ADUser para recuperar la propiedad DisplayName para cada usuario, en lugar de incluirla en el bucle anidado. También crea un único pscustomobject para cada usuario que incluye los nombres del controlador de dominio y las últimas fechas de inicio de sesión como un pscustomobject 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.

Comments are closed.