Eine kürzlich gestellte Anforderung für ein Projekt bestand darin, Benutzer und Gruppen von Domäne B nach Domäne A bereitzustellen. Der Haken an der Sache war, dass bei der Migration von Anwendungen nach Domäne A deren Gruppen der Domäne A "gehören" würden, die nun die maßgebliche Quelle für alle Gruppenattribute wäre (in diesem Fall wird die maßgebliche Quelle durch die OU bestimmt, in der sich die Gruppe in Domäne B befindet. Der Name dieser OU ist in der Konfigurationsdatei der Regelerweiterung gespeichert).
Eine benutzerdefinierte Regelerweiterung wird verwendet, um festzustellen, welcher Verwaltungsagent maßgebend ist, und um sicherzustellen, dass die Benutzerobjekte, die dem Mitgliedsattribut hinzugefügt werden, aus der entsprechenden Domäne stammen.
Die Einstellung eines erweiterten Attributflusses von Mitglied zu Mitglied führt zu dieser Meldung:
"Die Definition einer Regelerweiterung für den Import von Attributen in ein Metaverse-Referenzattribut ist nicht zulässig."
Aber es gibt eine Möglichkeit, dies zu umgehen.
Hier ist der Aufbau:
- Bereich A: Dies ist der Bereich der übergeordneten Organisation.
- Bereich B: Dies ist der Bereich der Organisation, die mit der übergeordneten Organisation fusioniert wird.
- Die Sicherheitsgruppen beginnen alle in Domäne B. Mit fortschreitender Fusion wechselt ihre maßgebliche Quelle für jede Gruppe zu Domäne A.
Dies wird angezeigt, wenn die Gruppe manuell in die OU "Domain A Managed" in Domain B verschoben wird.
Hier ist die Lösung. Der Code für jeden Schritt folgt dieser Zusammenfassung:
- Erstellen Sie ein neues indiziertes mehrwertiges String-Attribut im Metaverse namens memberString.
- Erstellen Sie ein neues Attribut namens SourceCSEntryDN, um den DN-Wert in Domäne B für die Sicherheitsgruppe zu speichern. (Dies wird verwendet, um die OU nachzuschlagen, zu der die Gruppe in Domäne B gehört, wenn die Domäne A MA die Gruppe synchronisiert).
- Schreiben Sie eine Funktion in den Code der Regelerweiterung, um festzustellen, in welcher OE sich die Gruppe befindet.
- Erstellen Sie auf beiden Verwaltungsagenten einen erweiterten Import-Attributfluss, um die Mitglieder in das neue Attribut memberString zu leiten, wenn dieser MA maßgebend ist. Dieser Wert enthält die DN der Benutzer, die Mitglieder der Gruppe sind.
- Schreiben Sie eine Export-Attribut-Flussregel für beide Verwaltungsagenten, um Mitglieder aus dem memberString-Attribut in das member-Attribut zu leiten, wenn dieser MA maßgebend ist. Ein Teil dieser Funktion besteht darin, den Anschluss für die entsprechende Domäne auf der Mventry für den Benutzer CN zu finden, der im Attribut memberString enthalten ist.
Für die Schritte 4 und 5 wird die Prüfung in Schritt 3 durchgeführt, um sicherzustellen, dass die richtigen Attributwerte als maßgeblich behandelt werden.
Für den gemeinsam genutzten Code wurde eine allgemeine Utils-DLL namens "UtilsForFIM" erstellt. Außerdem wurde Code für die Import- und Export-Attributflussregeln in den jeweiligen Regelerweiterungen hinzugefügt.
Für Schritt 2 lautet der Attributfluss auf dem Verwaltungsagenten der Domäne B:
<dn>, cn ->SourceCSEntryDN
Dieser Code setzt den gesamten DN des Benutzerobjekts in das Attribut SourceCSEntryDN.
Hier ist der Code für Schritt 2:
Case “cd.group:<dn>,cn->mv.group:SourceCSEntryDN”
Dim sDNPath As String
Dim dn As ReferenceValue = csentry.DN
sDNPath = (dn.Subcomponents(0, dn.Depth).ToString())
mventry("SourceCSEntryDN").Value = sDNPath
In Schritt 3 ist der Code für die Verwaltungsagenten von Bereich A und Bereich B etwas anders. Der Verwaltungsagent für Bereich A stützt sich auf die SourceCSEntryDN, während der Verwaltungsagent für Bereich B direkt auf die dn aus dem csentry zugreifen kann.
Beide haben einen Attributfluss wie folgt auf den Verwaltungsagenten:
<dn>,member -> memberString
Dieser Code prüft, ob der DN der Gruppe die OU enthält, die angibt, dass die Gruppe von Domäne A verwaltet werden soll. Domäne A muss sich auf den Wert verlassen, der in das Attribut SourceCSEntryDN eingegeben wurde, während Domäne B den DN direkt aus dem csentry-Objekt lesen kann.
Hier ist der Code für Schritt 3 für Bereich A:
Public Shared Function IsGroupManagedByDomAByDN(ByVal sDNPath As String) As Boolean
Dim bIsGroupManagedByDomA As Boolean
Dim sDomAManagedGroupOU As String
bIsGroupManagedByDomA = False
sDomAManagedGroupOU = UtilsForFIM.CommonUtils.ReadAppSetting("FIMConfig/General", "DomAManagedGroupOU").ToString()
If (InStr(sDNPath.ToLower(), sDomAManagedGroupOU.ToLower())) < 1 Then
Die Gruppe wird immer noch von der Akquisitionsdomäne verwaltet.
bIsGroupManagedByDomA = False
Sonst
Die Gruppe wird jetzt von DomA verwaltet.
bIsGroupManagedByDomA = True
Ende wenn
Return bIsGroupManagedByDomA
Funktion beenden
Hier ist der Code für Schritt 3 für Bereich B:
Public Shared Function IsGroupManagedByDomA(ByVal csentry As CSEntry) As Boolean
Dim bIsGroupManagedByDomA As Boolean
Dim dn As ReferenceValue = csentry.DN
Dim sDomAManagedGroupOU As String
bIsGroupManagedByDomA = False
sDomAManagedGroupOU = UtilsForFIM.CommonUtils.ReadAppSetting("FIMConfig/General", "DomAManagedGroupOU").ToString()
Dim sDNPath As String
sDNPath = (dn.Subcomponents(0, dn.Depth).ToString())
If (InStr(sDNPath.ToLower(), sDomAManagedGroupOU.ToLower())) < 1 Then
Die Gruppe wird immer noch von der Akquisitionsdomäne verwaltet.
bIsGroupManagedByDomA = False
Sonst
Die Gruppe wird jetzt von DomA verwaltet.
bIsGroupManagedByDomA = True
Ende wenn
Return bIsGroupManagedByDomA
Funktion beenden
Für beide Domänen liest der Code die Mitglieder der Gruppe und schreibt den dn-Wert der Benutzer in ein mehrwertiges Attribut namens memberString. Hier ist der Attributfluss für Schritt 4 und der Code:
<dn>,member -> memberString
Der Code für diese Transformation für den Verwaltungsagenten des Bereichs A lautet:
Case “cd.group:<dn>,member->mv.group:memberString”
If (mventry("SourceCSEntryDN").IsPresent) Then
Dim bIsGroupManagedByDomA As Boolean = UtilsForFIM.CommonUtils.IsGroupManagedByDomAByDN(mventry("SourceCSEntryDN").Value)
If (bIsGroupManagedByDomA = True) Then
mventry("memberString").Values.Clear()
Dim i As Integer
For i = 0 To (csentry("member").Values.Count - 1)
Dim sMember As String = csentry("member").Values.Item(i).ToString()
mventry("memberString").Values.Add(sMember)
Weiter
Ende wenn
Ende wenn
Der Code für diese Umwandlung lautet, wenn der Verwaltungsagent der Bereich B ist:
Case "cd.group:member->mv.group:memberString"
Dim bIsGroupManagedByDomA As Boolean
bIsGroupManagedByDomA = UtilsForFIM.CommonUtils.IsGroupManagedByDomA(csentry)
If (bIsGroupManagedByDomA = False) Then
mventry("memberString").Values.Clear()
Dim i As Integer
For i = 0 To (csentry("member").Values.Count - 1)
Dim sMember As String = csentry("member").Values.Item(i).ToString()
mventry("memberString").Values.Add(sMember)
Weiter
Ende wenn
Für Schritt 5 haben beide Verwaltungsagenten die folgende Attributflussregel:
member <- memberString
Hier ist die Flussregel für das Exportattribut für Bereich A:
Case “cd.group:member<-mv.group:memberString”
Dim bIsGroupManagedByDomA As Boolean
If (mventry("SourceCSEntryDN").IsPresent) Then
bIsGroupManagedByDomA = UtilsForFIM.CommonUtils.IsGroupManagedByDomAByDN(mventry("SourceCSEntryDN").Value)
If (bIsGroupManagedByDomA = False) Then
csentry("member").Values.Clear()
UtilsForFIM.CommonUtils.memberStringToMembers(mventry, csentry, csentry.MA.Name)
Ende wenn
Sonst
Quelle csentry dn fehlt
Ende wenn
Und für den Bereich B:
Case “cd.group:member<-mv.group:memberString”
Dim bIsGroupManagedByDomA As Boolean
bIsGroupManagedByDomA = UtilsForFIM.CommonUtils.IsGroupManagedByDomA(csentry)
If (bIsGroupManagedByDomA = True) Then
csentry("member").Values.Clear()
UtilsForFIM.CommonUtils.memberStringToMembers(mventry, csentry, csentry.MA.Name)
Ende wenn
Hier ist die Funktion memberStringToMembers, die die Mitgliedschaft aus dem String-Wert in den entsprechenden csentry für die Domäne, in die die Gruppe exportiert wird, übersetzt. Beachten Sie, dass dies den Konnektor auf der mventry des Mitglieds für die MA nimmt, die den aktuellen Lauf verarbeitet, so dass wir das Benutzerobjekt in der entsprechenden Domäne haben.
Public Shared Sub memberStringToMembers(ByVal mventry As MVEntry, ByVal csentry As CSEntry, ByVal sMAName As String)
Dim i As Integer
For i = 0 To (mventry("memberString").Values.Count - 1)
Dim sMember As String = mventry("memberString").Values.Item(i).ToString()
Sie müssen die Mventry für diesen Anschluss finden und dann den DomA-Eintrag bestimmen.
Dim mvEntryMember() As MVEntry
Dim arrMVEntryCN As Array
Dim sMemberCN As String
arrMVEntryCN = sMember.Split(",")
sMemberCN = arrMVEntryCN(0).Replace("CN=", "").Replace("cn=", "")
mvEntryMember = Utils.FindMVEntries("cn", sMemberCN, 1)
If (mvEntryMember.Length > 0) Then
Dim ManagementAgent As ConnectedMA
Dim Connectors As Integer
ManagementAgent = mvEntryMember(0).ConnectedMAs(sMAName)
Verbinder = ManagementAgent.Verbinder.Anzahl
If (Anschlüsse > 0) Then
Dim csentryFound As CSEntry
csentryFound = ManagementAgent.Connectors.ByIndex(0)
csentry("member").Values.Add(mvEntryMember(0).ConnectedMAs.Item(sMAName).Connectors.ByIndex(0).DN.ToString().ToLower()))
Ende wenn
Ende wenn
Weiter
End Sub