2017-06-05 4 views
0

@BenH et @TheMadTechnician ont été extrêmement utiles pour m'aider avec un script, pour supprimer les listes de distribution (uniquement) des utilisateurs dans des unités d'organisation spécifiques. J'ai oublié d'ajouter un critère nécessaire, donc décidé de publier cela comme une question distincte (thread d'origine here)Cibler tous les utilisateurs dans deux unités d'organisation et supprimer les listes de distribution - Ajouter des critères de date

@ approche de BenH était comme ceci:

$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 $_ 
    } 
} 

Ma question - puis-je forcer le script à ne prendre des mesures sur les comptes qui ont expiré il y a plus de 30 jours, en ajoutant une variable et « Where-Object » logique à la première boucle comme ceci ?:

$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 $_ 
    } 
} 

possible? Ou aurais-je besoin de changer le -gt en un -lt afin d'obtenir la plage de dates correcte?

Merci de votre visite!

+3

Votre question est "J'ai écrit ce code, est-ce que ça fonctionne"? Eh bien ... ça marche? Est-ce que cela vous donne les comptes que vous attendez? – TessellatingHeckler

+1

Vous voudriez '-lt'. Voici une instruction de comparaison qui devrait illustrer: '(Get-Date) .AddDays (-30) -gt (Obtenir-Date) .AddDays (-40)' est '$ True'. Vous pouvez ajouter '-WhatIf' à votre' Remove-ADPrincipalGroupMembership' pour voir ce que la commande essayera d'exécuter. – BenH

+0

@TessellatingHeckler - point solide, désolé je n'étais pas plus clair. Après examen, ma question n'a pas été très bien formulée. La première boucle ne collecte PAS les utilisateurs corrects; vérifier le contenu de la variable '$ Users', AccountExpirationDate a montré vide. J'ai changé la ligne pour: 'Get-ADUser -Filter * -Properties AccountExpirationDate -SearchBase $ OU' Maintenant, je vois la date d'expiration comme indiqué sur le compte AD, mais en utilisant' -lt' renvoie tous les utilisateurs, avec ou sans date d'expiration dans AD, et '-gt' ne renvoie aucun utilisateur. – 3Jake

Répondre

1

Faire une réponse comme demandé. Le problème est avec la déclaration Where:

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

Bien que logiquement sonne comme il est juste « où le compte a expiré il y a plus de 30 jours » il est réellement à « où la date à laquelle le compte a expiré est supérieur à ce que la date était il y a 30 jours '. Lorsque vous considérez que certains systèmes mesurent des dates en secondes écoulées depuis l'Epoque Unix (1er janvier 1970 à 12:00:00 UTC), et que les dates sont converties en entiers, il est plus logique que l'opérateur -gt sélectionne la date la plus proche plus tard, chronologiquement, plus de secondes se sont écoulées depuis l'époque, et l'entier est un nombre plus grand.

Si vous modifiez le -gt en -lt, il accomplit ce que vous cherchez. De plus, en ajoutant -and $_.AccountExpirationDate à cela s'assure que le AccountExpirationDate n'est pas nul. Donc, nous nous retrouvons avec:

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

@TheMadTechnician clouée - je besoin de changer la déclaration imbriquée "où" à:

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

Ainsi, le code de fonctionnement est le suivant:

$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 
    } 
} 

Espérons que TheMadTechnician soumettront leurs commentaires en réponse donc je peux mettre à jour et donner le karma où le karma est dû! Si cela résout un problème que vous recherchez, veuillez augmenter le commentaire de TheMadTechnician!

0

OP ici - J'ai continuer à travailler sur ce (avec l'aide), et a ajouté quelques embellissements supplémentaires que je pensais que quelqu'un pourrait trouver utile d'autre, donc je voulais partagez-le.

Veuillez ne pas augmenter cette réponse, TheMadTechnician et BenH méritent tout le crédit pour casser le dos de ceci. Allez upvote cette réponse, si vous trouvez cela utile.Cela va maintenant écrire les noms des distributions supprimées sur le compte AD, utiliser un séparateur point-virgule (pour couper/coller les noms si vous avez besoin d'ajouter de nouveau les distributions), et n'ajoutera pas d'encombrement au compte AD s'il est exécuté plus d'une fois contre le compte.

Profitez-en!

# 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) { 
    [email protected]() 

    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} 
     } 
    } 
}