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,

Vinícius Ferrão
la source

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
  }
}
Mathias R. Jessen
la source
+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.

Vinícius Ferrão
la source
1
Si c'est Mathias qui vous a aidé, alors vous devriez accepter sa réponse. Il vous donne la perspicacité!
Mzn
3

Cela peut être fait avec Adaxes. Techniquement, il mettra à jour dynamiquement l'appartenance au groupe une fois les utilisateurs mis à jour / déplacés. Voici un exemple comment maintenir automatiquement l'appartenance à un groupe en fonction de l'attribut Department, mais il est très facile de le modifier pour faire la même chose en fonction de l'unité d'organisation. http://www.adaxes.com/tutorials_AutomatingDailyTasks_AddUsersToGroupsByDepartment.htm

Anton Pozdnyakov
la source
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.

Espen Olsen
la source
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"  
}

la source
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