script modify ejemplos comando attribute aduser active powershell active-directory

powershell - modify - Paralelo a las consultas de Active Directory



set aduser (1)

Suponiendo que tiene 20 controladores de dominio, actualmente está haciendo 20 * 120000 + 2 consultas LDAP, eso es casi 2 millones y medio de consultas.

Lo que puede hacer en su lugar es consultar cada DC una vez y recuperar a todos los usuarios de una vez por DC:

function Get-UsersLastLogon{ # Gather all DC names $AllDCs = ([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().domainControllers).Name # In parallel, query the DCs for ALL users $AllEntries = $AllDCs | Invoke-Parallel -Throttle 60 -ScriptBlock { $de=[adsi]"LDAP://$_" $UserSeacher = New-Object System.DirectoryServices.DirectorySearcher($de,"(&(objectCategory=User))") [void]$UserSeacher.PropertiesToLoad.Add(''lastLogon'') $Users = $UserSeacher.FindAll().Properties foreach($User in $Users){ New-Object psobject -Property @{ SamAccountName = $User.SamAccountName LastLogon = ([datetime]::FromFileTime([string]$User.lastlogon)) } } } # Group all the results by user name foreach($UserEntry in $AllEntries |Group-Object SamAccountName){ # Emit the newest entry per username $UserEntry.Group |Sort-Object -Property LastLogon -Descending | Select-Object -First 1 } }

Deseo obtener todas las fechas de último registro de todos los usuarios de Active Directory de todos los controladores de dominio. Esto dará como resultado una lista con todos los usuarios y su última fecha de inicio de sesión. Mi script funciona bien, pero ¿es posible paralelizarlo aún más?

Por el momento, toma alrededor de 1 segundo consultar los 20 controladores de dominio para un solo usuario (Invoke-Parallel está ayudando mucho).

El problema aquí es que tenemos ~ 120k de usuario

Aquí está el código:

. ''D:/scripts/InPa/Invoke-Parallel-lite-nolog.ps1'' function Get-UsersLastLogon{ $AllDCs = ([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().domainControllers).Name $AllUser = ((New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User))")).FindAll().Properties).samaccountname foreach($SamAccountName in $AllUser){ $Latest = $AllDCs | Invoke-Parallel -Throttle 60 -ScriptBlock { $de=[adsi]"LDAP://$_" $UserSeacher = (New-Object System.DirectoryServices.DirectorySearcher($de,"(&(objectCategory=User)(samaccountname=$Using:SamAccountName))")).FindAll().Properties $co = New-Object System.Object $co | Add-Member -type NoteProperty -name SamAccountName -value $Using:SamAccountName $co | Add-Member -type NoteProperty -name lastlogon -value ([datetime]::FromFileTime([string]$UserSeacher.lastlogon)) $co } $Latest | Sort-Object -Property lastlogon -Descending | Select-Object -First 1 } } Get-UsersLastLogon | Export-Csv -Path D:/UsersLastLogon.csv -Delimiter '';'' -NoTypeInformation

¿Tienes una idea para acelerar esto aún más?