Création d'un groupe dynamique dans Active Directory avec des utilisateurs à partir d'une unité d'organisation


8

Je voudrais créer un groupe dynamique avec des utilisateurs d'une unité d'organisation spécifique dans mon Active Directory. Je peux parfaitement le faire en utilisant la liste de distribution dynamique Exchange, mais bien sûr, les Ex DDL ne sont que pour le courrier.

Il existe un moyen de créer cela? J'ai trouvé des guides utilisant System Center pour gérer cela, mais System Center n'est pas une option.

Merci d'avance,

Réponses:


11

Il n'y a pas de groupe de sécurité dynamique dans Active Directory, seulement des groupes de distribution dynamique.

Pour ce faire, je pense que l'option la plus viable serait d'avoir un script Powershell déterminant qui se trouvent dans l'unité d'organisation donnée et mettant à jour le groupe de sécurité en conséquence, peut-être comme ceci:

Import-Module ActiveDirectory
$groupname = PseudoDynamicGroup
$users = Get-ADUser -Filter * -SearchBase "ou=desiredUsers,dc=domain,dc=tld"
foreach($user in $users)
{
  Add-ADGroupMember -Identity $groupname -Member $user.samaccountname -ErrorAction SilentlyContinue
}
$members = Get-ADGroupMember -Identity $groupname
foreach($member in $members)
{
  if($member.distinguishedname -notlike "*ou=desiredUsers,dc=domain,dc=tld*")
  {
    Remove-ADGroupMember -Identity $groupname -Member $member.samaccountname
  }
}

+1 Puis-je exécuter régulièrement un tel script sur mon Active Directory pour m'assurer que mes groupes AD sont à jour? Ou peut-être souscrire à un système d'événement? Je suis développeur et non administrateur mais je peux influencer l'administrateur et mon manager
Mzn

Je ferais d'abord les suppressions, juste pour qu'il ne revérifie pas les objets utilisateur que nous venons de vérifier (et d'ajouter)
xXhRQ8sD2L7Z

4

Je réponds à ma propre question. Avec les idées PowerShell de Mathias, j'ai trouvé cela sur Internet:

https://github.com/davegreen/shadowGroupSync

Caractéristiques

  • Synchronisez les objets utilisateur ou ordinateur d'une ou plusieurs unités d'organisation vers un seul groupe.
  • Possibilité de filtrer les objets inclus dans le groupe fantôme à l'aide du filtre PowerShell Active Directory.
  • Possibilité de choisir le type de groupe fantôme (sécurité / distribution).

Le blog de l'auteur contient des informations supplémentaires sur la conception et les motifs de l'outil.


1
Si c'est Mathias qui vous a aidé, alors vous devriez accepter sa réponse. Il vous donne la perspicacité!
Mzn


1

J'ai également cherché un moyen de créer des groupes de sécurité dynamiques dans Active Directory et suis arrivé à la conclusion en tant que Mathias. Ma solution n'était pas aussi élégante que la sienne, j'utilise un script PowerShell planifié pour supprimer tous les utilisateurs des groupes, puis les remplir avec les utilisateurs de l'unité d'organisation. De plus, je me suis assuré que les groupes de sous-unités d'organisation étaient ajoutés au groupe de sécurité des unités d'organisation parent où il se trouvait.

import-module ActiveDirectory
Get-ADGroupMember OU_GroupName | % { Remove-ADGroupMember 'OU_GroupName' -Members $_ -Confirm:$false}
Get-ADUser -SearchBase 'OU=OUName,OU=ParentOUName,DC=DomainName,DC=TopDomainName' -Searchscope 1 -Filter * | % { Add-ADGroupMember 'OU_GroupName' -Members $_ }
Add-ADGroupMember -Identity "OU_ParentName" -Members "OU_ChildOneName", "OU_ChildTwoName", "OU_ChildThreeName"

Je ne sais pas si cela évolue bien dans une grande entreprise, mais le script ne prend que quelques minutes dans notre entreprise de 300 utilisateurs.


D'un point de vue pratique, votre solution est parfaite (pour quelques centaines d'utilisateurs). Cependant, en ajoutant tout d'abord (et en supprimant les avertissements / erreurs pour les doublons), puis en supprimant uniquement les non-correspondances, vous 1) minimisez le nombre de mises à jour d'attributs de l'objet AD et 2) contournez le risque que quelqu'un authentifie et manque une sécurité Regroupez-les dans leur jeton, s'ils arrivent en ligne pendant l'exécution de votre script.
Mathias R. Jessen


0

À la déclaration laissée par un autre membre. Si vous ne l'exécutez pas à partir d'un contrôleur de domaine, vous devrez fournir une entrée statique en remplaçant $ domainController ou vous pouvez en ajouter une autre, suivie de $ DomainController et transmettre ces informations.

Pour ajouter un utilisateur à un groupe

Function AddUserToGroup($Group, $User, $DomainController)
{
 if(!(Get-ADGroupMember -Identity $group | ?{$_.name -eq $User}))
 {
  Add-ADGroupMember -Identity $group -Members $User -Server $DomainController
 }
 else
 {
  return  "The user: $User is already in the $group"
 }
}

Pour supprimer un utilisateur, vous pouvez faire la même chose.

Function RemoveUserFromGroup($Group, $User, $DomainController)
{
 if((Get-ADGroupMember -Identity $group | ?{$_.name -eq $User}))
 {
  Remove-ADGroupMember -Identity $group -Members $User -Server $DomainController
 }
 else
 {
  return "The user: $User is not a member of $group"
 }
}

Maintenant, pour l'utiliser, vous pouvez le faire ...

$Users = Get-Aduser -Filter *
Foreach($user in $users)
{
  AddUserToGroup "SomeGroup" $user.name "ServerName"  
}

ou

Il serait préférable d'avoir une UO d'utilisateurs désactivés ou quelque chose où cela peut avoir lieu ou si vous changez d'OU, comme un site ou un groupe

$Users = Get-Aduser -Filter * 
Foreach($user in $users)
{
  RemoveUserToGroup "SomeGroup" $user.name "ServerName"  
}

Cette réponse ne sert à rien et n'ajoute aucune valeur à la question. Les fonctions sont inefficaces et ne fournissent aucune valeur intrinsèque; les deux fonctions 1. doubler le nombre d'appels à effectuer, 2. ne fonctionnent spécifiquement que si le CN de l'utilisateur est utilisé (limiter la fonctionnalité des applets de commande natives), 3. ne pas suivre le modèle de dénomination Verb-Noun recommandé des fonctions PowerShell, et 4. la deuxième fonction AJOUTE en fait les utilisateurs à un groupe, au lieu de les supprimer. La réponse acceptée d'il y a 6 ans est précise, complète et fonctionnelle. Je ne vois aucune raison pour laquelle une réponse supplémentaire était nécessaire.
Point

Espèce de fanatique! Cela vous fait juste un esprit étroit

Encore une chose. J'ai ce script exact dans mon organisation avec plus de 5000 utilisateurs et cela fonctionne très bien. Il vous suffit d'alimenter la fonction en informations. Notez également que nous avons des déclencheurs effectués sur une tâche DC où il exécute un événement déclenché lorsqu'un nouvel utilisateur est créé ou désactivé. S'il vous plaît, pensez en dehors de la boîte ................

$ DomainController n'est pas défini. Votre fonction «RemoveUserFromGroup» utilise l'applet de commande «Add-ADGroupMember». Votre "Remove" (si la cmdlet Remove-ADGroupMember n'était en fait qu'une typo utilisée) ne fonctionne que si l'utilisateur n'est pas dans le groupe. Vous ne référencez pas non plus à distance la tâche consistant à obtenir des utilisateurs à partir d'une unité d'organisation spécifiée. Au mieux, il s'agit d'une solution partielle qui répond aux besoins - lorsqu'une solution complète a déjà été soumise et acceptée.
Point

Awe, je vois de quoi tu parlais. LOL - Je viens de copier le haut et de le coller en bas. Je l'ai depuis corrigé ... $ DomainController a été placé juste au cas où cet utilisateur n'exécuterait pas le script à partir d'un DC. Encore une fois, l'utilisateur et le groupe sont fournis. Vous pouvez exécuter un simple Get-ADUser -Filter * si vous le souhaitez, mais cela semble banal ... Il serait préférable de simplement lire les journaux des événements DC et de tirer le nouvel utilisateur au lieu de parcourir chaque utilisateur. Mais bon, il y a plus d'une façon d'écorcher un chat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.