exchange distributiongroupmember distributiongroup all powershell active-directory distribution-list

powershell - all - get-distributiongroupmember export-csv



Apunte a todos los usuarios en dos unidades organizativas y elimine listas de distribuciĆ³n: agregue criterios de fecha (3)

@TheMadTechnician lo identificó: necesitaba cambiar la declaración anidada "where" a:

Where-Object {$_.AccountExpirationDate -lt $30DaysOld -and $_.AccountExpirationDate}

Entonces el código de funcionamiento es:

$30DaysOld = (Get-Date).AddDays(-30) $OUs = ''OU=PendingDeletion,OU=Users,DC=Stuff,DC=Place,DC=net'',''OU=HoldForReview,OU=Users,DC=Stuff,DC=Place,DC=net'' $Users = ForEach ($OU in $OUs) { Get-ADUser -Filter * -Properties AccountExpirationDate -SearchBase $OU | Where-Object {$_.AccountExpirationDate -lt $30DaysOld -and $_.AccountExpirationDate} } ForEach ($User in $Users) { Get-ADPrincipalGroupMembership -Identity $user | Where-Object {$_.GroupCategory -eq 0} | ForEach-Object { Remove-ADPrincipalGroupMembership -Identity $user -MemberOf $_ -Confirm:$false } }

Espero que TheMadTechnician presente su comentario como una respuesta para que pueda actualizar y darle karma donde el karma se debe. Si esto resuelve un problema que estás buscando, ¡por favor devuelve el comentario de TheMadTechnician!

@BenH y @TheMadTechnician fueron extremadamente útiles para ayudarme con un script, para eliminar las listas de distribución (solo) de los usuarios en AD OU específicas. Olvidé agregar un criterio necesario, así que decidí publicar esto como una pregunta separada (tema original aquí )

El enfoque de @ BenH fue así:

$OUs = ''OU=PendingDeletion,OU=Users,DC=Stuff,DC=Place,DC=net'',''OU=HoldForReview,OU=Users,DC=Stuff,DC=Place,DC=net'' $Users = ForEach ($OU in $OUs) { Get-ADUser -Filter * -SearchBase $OU } ForEach ($User in $Users) { Get-ADPrincipalGroupMembership -Identity $user | Where-Object {$_.GroupCategory -eq 0} | ForEach-Object { Remove-ADPrincipalGroupMembership -Identity $user -MemberOf $_ } }

Mi pregunta: ¿puedo forzar que el script solo tome medidas en las cuentas que han expirado hace más de 30 días , agregando una variable y lógica "Where-Object" al primer ciclo como este ?:

$OUs = ''OU=PendingDeletion,OU=Users,DC=Stuff,DC=Place,DC=net'',''OU=HoldForReview,OU=Users,DC=Stuff,DC=Place,DC=net'' $30DaysOld = (Get-Date).AddDays(-30) $Users = ForEach ($OU in $OUs) { Get-ADUser -Filter * -SearchBase $OU | Where-Object {$_.AccountExpirationDate -gt $30DaysOld}} ForEach ($User in $Users) { Get-ADPrincipalGroupMembership -Identity $user | Where-Object {$_.GroupCategory -eq 0} | ForEach-Object { Remove-ADPrincipalGroupMembership -Identity $user -MemberOf $_ } }

¿Posible? ¿O debería cambiar el -gt a -lt para obtener el intervalo de fechas correcto?

¡Gracias por mirar!


Hacer una respuesta según lo solicitado. El problema es con la declaración Where :

Where-Object {$_.AccountExpirationDate -gt $30DaysOld}

Si bien lógicamente parece que es correcto "que la cuenta expiró hace más de 30 días", en realidad aparece en "donde la Fecha en que expiró la cuenta es mayor a la Fecha de hace 30 días" . Cuando considera que algunos sistemas miden las fechas como segundos transcurridos desde la Época Unix (1 de enero de 1970 a las 12:00:00 a.m. UTC), y las fechas se convierten en números enteros, y tiene más sentido que el operador -gt seleccione la fecha sucede más tarde cronológicamente ya que han pasado más segundos desde la época, y el número entero es un número mayor.

Si cambias -gt a -lt , logra lo que estás buscando. Además, al agregar -and $_.AccountExpirationDate se asegura de que AccountExpirationDate no sea nulo. Así que terminamos con:

Where-Object {$_.AccountExpirationDate -lt $30DaysOld -and $_.AccountExpirationDate}


OP aquí : he seguido trabajando en esto (con asistencia) y agregué algunos adornos adicionales que pensé que alguien más podría encontrarle útiles, así que quise compartirlos.

Por favor, no repitan esta respuesta , TheMadTechnician y BenH merecen todo el crédito por romper con esto. Ve a votar esa respuesta, si te parece útil.

Esto ahora escribirá los nombres de las distros eliminadas en la cuenta AD, use un separador de punto y coma (para cortar / pegar los nombres si necesita volver a agregar las distros), y no agregará desorden a la cuenta AD si se ejecuta contra la cuenta más de una vez

¡Disfrutar!

# Variables $30DaysOld = (Get-Date).AddDays(-30) $OUs = ( ''OU=PendingDeletion,OU=Users,DC=Stuff,DC=Place,DC=net'', ''OU=HoldForReview,OU=Users,DC=Stuff,DC=Place,DC=net'' ) # Collect the needed users $Users = ForEach ($OU in $OUs) { Get-ADUser -Filter * -Properties AccountExpirationDate,info -SearchBase $OU | Where-Object {$_.AccountExpirationDate -lt $30DaysOld -and $_.AccountExpirationDate} } # Collect each user''s Distro Lists & REMOVE ForEach ($User in $Users) { $distrosremoved=@() Get-ADPrincipalGroupMembership -Identity $user | Where-Object {$_.GroupCategory -eq "distribution"} | ForEach-Object { $distrosremoved+=$_.name Remove-ADPrincipalGroupMembership -Identity $user -MemberOf $_ -Confirm:$false } # Collect info from the Telephone > Notes field, and ADD the list of Distros into the existing info if($distrosremoved){ $distro_str="Removed Distro Lists: `r`n"+($distrosremoved -join "; ") if ($user.info){ $newinfo=$user.info+"`r`n"+$distro_str Set-ADUser $user -Replace @{info=$newinfo} }else{ $newinfo=$distro_str Set-ADUser $user -Add @{info=$distro_str} } } }