Der Countdown für die Keyfactor Tech Days läuft - sichern Sie sich noch heute Ihren Platz!

  • Startseite
  • Blog
  • Gruppenzugehörigkeit und wechselnde Quellen der Autorität - Keyfactor

Gruppenzugehörigkeit und wechselnde Quellen der Autorität - Keyfactor

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:

  1. Erstellen Sie ein neues indiziertes mehrwertiges String-Attribut im Metaverse namens memberString.
  2. 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).
  3. Schreiben Sie eine Funktion in den Code der Regelerweiterung, um festzustellen, in welcher OE sich die Gruppe befindet.
  4. 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.
  5. 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