Erstellen einer dynamischen Gruppe in Active Directory mit Benutzern aus einer Organisationseinheit

8

Ich möchte eine dynamische Gruppe mit Benutzern aus einer bestimmten Organisationseinheit in meinem Active Directory erstellen. Ich kann dies perfekt mit der dynamischen Exchange-Verteilerliste tun, aber natürlich sind Ex-DDLs nur für E-Mails.

Gibt es eine Möglichkeit, dies zu erstellen? Ich habe einige Anleitungen gefunden, die System Center verwenden, um dies zu handhaben, aber System Center ist keine Option.

Danke im Voraus,

Vinícius Ferrão
quelle

Antworten:

11

In Active Directory gibt es keine dynamische Sicherheitsgruppe, sondern nur dynamische Verteilungsgruppen.

Um dies zu erreichen, wäre es meiner Meinung nach am sinnvollsten, ein Powershell-Skript zu haben, das bestimmt, wer sich in der angegebenen Organisationseinheit befindet, und die Sicherheitsgruppe entsprechend zu aktualisieren, möglicherweise wie folgt:

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
quelle
+1 Kann ich ein solches Skript regelmäßig in meinem Active Directory ausführen lassen, um sicherzustellen, dass meine AD-Gruppen auf dem neuesten Stand sind? Oder vielleicht irgendwie ein Ereignissystem abonnieren? Ich bin ein Entwickler, kein Administrator, aber ich kann den Administrator und meinen Manager beeinflussen
Mzn
Ich würde die Entfernungen zuerst durchführen, nur damit Benutzerobjekte, die wir gerade überprüft (und hinzugefügt) haben, nicht erneut überprüft werden
xXhRQ8sD2L7Z
4

Ich beantworte meine eigene Frage. Mit den PowerShell-Ideen von Mathias habe ich Folgendes im Internet gefunden:

https://github.com/davegreen/shadowGroupSync

Eigenschaften

  • Synchronisieren Sie Benutzer- oder Computerobjekte von einer oder mehreren Organisationseinheiten mit einer einzelnen Gruppe.
  • Möglichkeit zum Filtern von Objekten, die in der Schattengruppe enthalten sind, mithilfe des PowerShell Active Directory-Filters.
  • Möglichkeit zur Auswahl des Schattengruppentyps (Sicherheit / Verteilung).

Der Blog des Autors enthält zusätzliche Informationen zum Design und zu den Motiven des Tools.

Vinícius Ferrão
quelle
1
Wenn Mathias derjenige war, der Ihnen geholfen hat, sollten Sie seine Antwort akzeptieren. Er gibt dir den Einblick!
Mzn
3

Dies kann mit Adaxes erfolgen. Technisch wird die Gruppenmitgliedschaft dynamisch aktualisiert, sobald Benutzer aktualisiert / verschoben werden. Hier ist ein Beispiel, wie die Gruppenmitgliedschaft basierend auf dem Abteilungsattribut automatisch beibehalten wird. Es ist jedoch sehr einfach, sie zu ändern, um dasselbe basierend auf der Organisationseinheit zu tun. http://www.adaxes.com/tutorials_AutomatingDailyTasks_AddUsersToGroupsByDepartment.htm

Anton Pozdnyakov
quelle
1

Ich habe auch nach einer Möglichkeit gesucht, dynamische Sicherheitsgruppen in Active Directory zu erstellen, und bin als Mathias zu dem Schluss gekommen. Meine Lösung war nicht so elegant wie seine. Ich verwende ein geplantes Powershell-Skript, um alle Benutzer aus den Gruppen zu entfernen und sie dann mit den Benutzern in der Organisationseinheit zu füllen. Außerdem habe ich sichergestellt, dass die Unter-Organisationseinheiten-Gruppen zur Sicherheitsgruppe der übergeordneten Organisationseinheiten hinzugefügt wurden, in die sie passen.

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"

Ich bin mir nicht sicher, ob dies in einem großen Unternehmen gut skaliert, aber das Skript benötigt in unserem Unternehmen mit 300 Benutzern nur wenige Minuten.

Espen Olsen
quelle
Aus praktischer Sicht ist Ihre Lösung in Ordnung (für einige hundert Benutzer). Indem Sie jedoch zuerst alle hinzufügen (und Warnungen / Fehler für Duplikate unterdrücken) und dann nur Nichtübereinstimmungen entfernen, 1) minimieren Sie die Anzahl der Attributaktualisierungen für das AD-Objekt und 2) umgehen Sie das Risiko, dass sich jemand authentifiziert und eine Sicherheit vermisst Gruppieren Sie in ihrem Token, falls sie zufällig online gehen, während Ihr Skript ausgeführt wird.
Mathias R. Jessen
0

Zu der Aussage eines anderen Mitglieds. Wenn Sie dies nicht von einem Domänencontroller aus ausführen, müssen Sie entweder einen statischen Eintrag bereitstellen, indem Sie $ domainController ersetzen, oder Sie können einen weiteren hinzufügen, gefolgt von $ DomainController, und diese Informationen übergeben.

So fügen Sie einen Benutzer einer Gruppe hinzu

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

Um einen Benutzer zu entfernen, können Sie dasselbe tun.

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

Um dies zu nutzen, können Sie dies tun ...

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

oder

Es ist am besten, eine Organisationseinheit für deaktivierte Benutzer zu haben oder etwas, in dem dies stattfinden kann, oder wenn Sie die Organisationseinheiten wie Site oder Gruppe wechseln

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

quelle
Diese Antwort hat keinen Zweck und fügt der Frage überhaupt keinen Wert hinzu. Die Funktionen sind ineffizient und bieten keinen inhärenten Wert. Beide Funktionen 1. Verdoppeln Sie die Anzahl der zu tätigen Anrufe. 2. Funktionieren Sie insbesondere nur, wenn der CN des Benutzers verwendet wird (beschränken Sie die native Cmdlet-Funktionalität). 3. Befolgen Sie nicht das empfohlene Verb-Nomen-Namensmuster der PowerShell-Funktionen. und 4. die zweite Funktion fügt Benutzer tatsächlich einer Gruppe hinzu, anstatt sie zu entfernen. Die akzeptierte Antwort von vor 6 Jahren ist genau, vollständig und funktional. Ich sehe keinen Grund, warum eine zusätzliche Antwort benötigt wurde.
Semikolon
Du Eiferer! Es macht Sie nur engstirnig
Eine Sache noch. Ich habe genau dieses Skript in meiner Organisation mit über 5000 Benutzern und es funktioniert einwandfrei. Sie müssen der Funktion nur die Informationen zuführen. Beachten Sie auch, dass Trigger für einen Task-DC ausgeführt werden, bei dem ein ausgelöstes Ereignis ausgeführt wird, wenn ein neuer Benutzer erstellt oder deaktiviert wird. Bitte denken Sie über den Tellerrand hinaus ................
$ DomainController ist undefiniert. Ihre Funktion "RemoveUserFromGroup" verwendet das Cmdlet "Add-ADGroupMember". Ihr "Entfernen" (wenn das Cmdlet "Remove-ADGroupMember" eigentlich nur ein Tippfehler war) funktioniert nur, wenn sich der Benutzer nicht in der Gruppe befindet. Sie verweisen auch nicht aus der Ferne auf die Aufgabe, Benutzer aus einer bestimmten Organisationseinheit abzurufen. Bestenfalls handelt es sich um eine Teillösung für die Bedarfsarbeit - wenn bereits eine vollständige Lösung eingereicht und akzeptiert wurde.
Semikolon
Ehrfurcht, ich verstehe, wovon du gesprochen hast. LOL - Ich habe gerade die Oberseite kopiert und unten eingefügt. Ich habe es seitdem korrigiert ... $ DomainController wurde dort abgelegt, nur für den Fall, dass dieser Benutzer das Skript nicht von einem DC aus ausführt. Auch hier werden der Benutzer und die Gruppe bereitgestellt. Sie können einen einfachen Get-ADUser-Filter * ausführen, wenn Sie möchten, aber das scheint banal zu sein ... Es ist besser, nur die DC-Ereignisprotokolle zu lesen und den neuen Benutzer zu ziehen, anstatt durch jeden Benutzer zu blättern. Aber hey, es gibt mehr als einen Weg, eine Katze zu häuten