Saltar al contenido

Get-ADUser en varias OU y filtrar resultados

Solución:

Hay algunas recomendaciones que haría con su guión actual.

En primer lugar, una sola consulta grande casi siempre tendrá un mejor rendimiento que muchas consultas más pequeñas. Entonces en lugar de correr get-aduser por separado para cada unidad organizativa de destino, los combinaría en una sola llamada utilizando una unidad organizativa común de nivel superior como base de búsqueda. Obviamente, esto puede terminar devolviendo resultados de unidades organizativas que no deseaba incluir. Pero es mucho más rápido filtrarlos más tarde.

Tu tambien estas llamando get-aduser nuevamente para cada resultado del primer conjunto de consultas solo para filtrar en lastLogonDate. Pero podría combinar ese filtro con el -ldapfilter de sus consultas originales. Es solo una cuestión de convertir el -filter versión con un equivalente -ldapfilter versión. El secreto para hacer esto es saber que lastLogonDate es solo una versión convertida de Powershell del atributo lastLogonTimestamp. Y puede convertir un valor normal de Powershell DateTime al formato que usa lastLogonTimestamp con el ToFileTime() método.

Lo último que me confundió fue el (UserPrincipalName=*) parte de su ldapfilter. En todos los dominios que he tocado, este atributo siempre tendrá un valor (como SamAccountName o DistinguishedName). Puede ser diferente al valor predeterminado de <SamAccoutnName>@<DomainFQDN>, pero nunca está vacío. El filtro no daña nada necesariamente. Es solo una cosa más para AD gastar ciclos de CPU evaluando cuando no es necesario. Pero si tienes motivos para creer que podría estar vacío en tu entorno, déjalo ahí.

Así que así es como modificaría su secuencia de comandos si entendiera sus intenciones correctamente.

# make the comparison value using ToFileTime()
$30daysago = (Get-Date).AddDays(-30).ToFileTime()

# make the combined ldapfilter value
$LdapFilter = "(&(lastLogonTimestamp<=$30daysago)(extensionAttribute9=*)"

# make an array of the OU DNs you care about
$TargetOUs = @(
    "OU=Users,OU=US-Location,OU=Americas,DC=Domain,DC=Domain,DC=com"
    "OU=Users-Remote,OU=US-Location,OU=Americas,DC=Domain,DC=Domain,DC=com"
    "OU=Contractors,OU=US-Location,OU=Americas,DC=Domain,DC=Domain,DC=com"
    "OU=Temps,OU=US-Location,OU=Americas,DC=Domain,DC=Domain,DC=com"
)

# define your common search base
$base = "OU=US-Location,OU=Americas,DC=Domain,DC=Domain,DC=com"

# get your combined results and the additional attributes you care about
$OldUsers = get-aduser -ldapfilter $LdapFilter -searchbase $base -pr lastLogonDate

# convert the target OU list into a regular expression we can compare each DN against in a single comparison call
$regex = ""
$TargetOUs | %{ $regex += ".*," + [Regex]::Escape($_) + "$|" }
$regex = $regex.Substring(0,$regex.Length-1)

# filter the results that aren't in your target OUs
# (depending on your OU layout, it might be more efficient to flip this
#  and define the OUs you explicitly want to leave out)
$FilteredUsers = $OldUsers | ?{ $_.DistinguishedName -match $regex }

# export your CSV (sorted for good measure)
$FilteredUsers | select SamAccountName,LastLogonDate | sort LastLogonDate | export-csv C:/Users/myname/Desktop/Usersover30days.csv

PD: Tenga cuidado con el tratamiento lastLogonTimestamp (o lastLogonDate) como 100% exacto. Puede estar desactualizado por diseño entre 9 y 14 días.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *