Dans le cadre d'un projet récent, il fallait que les utilisateurs et les groupes soient transférés du domaine B vers le domaine A. C'était assez simple, mais il y avait un problème : lorsque les applications étaient transférées vers le domaine A, leurs groupes étaient "détenus" par le domaine A, qui faisait désormais autorité pour tous les attributs des groupes (dans ce cas, la source faisant autorité est déterminée par l'OU dans laquelle se trouve le groupe dans le domaine B. Le nom de cette OU est stocké dans le fichier de configuration de l'extension des règles).
Une extension de règles personnalisées est utilisée pour déterminer l'agent de gestion qui fait autorité et pour s'assurer que les objets utilisateur ajoutés à l'attribut membre appartiennent au domaine approprié.
La définition d'un flux d'attributs avancés d'un membre à l'autre donne ce message :
"Defining a rules extension import attribute flow to a metaverse reference attribute is not allowed".
Mais il existe un moyen de contourner ce problème.
Voici comment procéder :
- Domaine A : Il s'agit du domaine de l'organisation mère.
- Domaine B : Il s'agit du domaine de l'organisation fusionnée avec l'organisation mère.
- Les groupes de sécurité commencent tous leur vie dans le domaine B. Au fur et à mesure de la fusion, leur source d'autorité passera au domaine A, groupe par groupe.
Ceci est indiqué lorsque le groupe est déplacé manuellement vers l'OU appelée "Domain A Managed" dans le Domain B.
Voici la solution. Le code de chaque étape suivra ce résumé :
- Créer un nouvel attribut multivalué de type chaîne indexée dans le métavers appelé memberString.
- Créez un nouvel attribut appelé SourceCSEntryDN pour contenir la valeur DN du groupe de sécurité dans le domaine B. (Cette valeur est utilisée pour rechercher l'OU à laquelle appartient le groupe dans le domaine B lorsque l'AM du domaine A synchronise le groupe). (Cette valeur est utilisée pour rechercher l'OU auquel le groupe appartient sur le domaine B lorsque l'autorité de gestion du domaine A synchronise le groupe).
- Écrire une fonction dans le code d'extension des règles pour déterminer dans quelle OU se trouve le groupe.
- Créer un flux d'attributs d'importation avancé sur les deux agents de gestion pour diriger les membres vers le nouvel attribut memberString si cet agent de gestion fait autorité. Cette valeur contiendra le DN des utilisateurs qui sont membres du groupe.
- Rédigez une règle de flux d'attribut d'exportation sur les deux agents de gestion pour transférer les membres de l'attribut memberString vers l'attribut member si cet agent de gestion fait autorité. Une partie de cette fonction consiste à trouver le connecteur pour le domaine approprié sur le mventry pour le CN de l'utilisateur qui se trouve dans l'attribut memberString.
Pour les étapes 4 et 5, la vérification de l'étape 3 est effectuée pour s'assurer que les bonnes valeurs d'attribut sont traitées comme faisant autorité.
Pour le code partagé, une dll Utils générale appelée "UtilsForFIM" a été créée. Du code a également été ajouté aux règles d'importation et d'exportation des flux d'attributs dans les extensions de règles respectives.
Pour l'étape 2, le flux d'attributs sur l'agent de gestion du domaine B est le suivant :
<dn>, cn ->SourceCSEntryDN
Ce code place l'intégralité du DN de l'objet utilisateur dans l'attribut SourceCSEntryDN.
Voici le code de l'étape 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
Pour l'étape 3, le code est un peu différent pour les agents de gestion des domaines A et B. L'agent de gestion du domaine A s'appuie sur le SourceCSEntryDN alors que l'agent de gestion du domaine B peut accéder directement au dn de la csentry.
Les deux ont un flux d'attributs comme suit sur l'agent de gestion :
<dn>,member -> memberString
Ce code vérifie si le DN du groupe contient l'OU qui indique que le groupe doit être géré par le domaine A. Les fonctions sont différentes pour chaque domaine. Le domaine A doit s'appuyer sur la valeur qui a été placée dans l'attribut SourceCSEntryDN, tandis que le domaine B peut lire le DN directement à partir de l'objet csentry.
Voici le code de l'étape 3 pour le domaine 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
Le groupe est toujours géré par le domaine d'acquisition.
bIsGroupManagedByDomA = False
Autre
Le groupe est désormais géré par DomA.
bIsGroupManagedByDomA = True
Fin Si
Retour bIsGroupManagedByDomA
Fin de la fonction
Voici le code de l'étape 3 pour le domaine 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
Le groupe est toujours géré par le domaine d'acquisition.
bIsGroupManagedByDomA = False
Autre
Le groupe est désormais géré par DomA.
bIsGroupManagedByDomA = True
Fin Si
Retour bIsGroupManagedByDomA
Fin de la fonction
Pour les deux domaines, le code lit les membres du groupe et écrit la valeur dn des utilisateurs dans un attribut multivalué appelé memberString. Voici le flux d'attributs pour l'étape 4 et le code :
<dn>,member -> memberString
Le code de cette transformation pour l'agent de gestion du domaine A est le suivant :
Case “cd.group:<dn>,member->mv.group:memberString”
Si (mventry("SourceCSEntryDN").IsPresent) Alors
Dim bIsGroupManagedByDomA As Boolean = UtilsForFIM.CommonUtils.IsGroupManagedByDomAByDN(mventry("SourceCSEntryDN").Value)
Si (bIsGroupManagedByDomA = True) Alors
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)
Suivant
Fin Si
Fin Si
Le code de cette transformation lorsque l'agent de gestion est le domaine B est le suivant :
Case "cd.group:member->mv.group:memberString"
Dim bIsGroupManagedByDomA As Boolean
bIsGroupManagedByDomA = UtilsForFIM.CommonUtils.IsGroupManagedByDomA(csentry)
Si (bIsGroupManagedByDomA = False) Alors
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)
Suivant
Fin Si
Pour l'étape 5, les deux agents de gestion ont la règle de flux d'attributs suivante :
member <- memberString
Voici la règle de flux des attributs d'exportation pour le domaine A :
Case “cd.group:member<-mv.group:memberString”
Dim bIsGroupManagedByDomA As Boolean
Si (mventry("SourceCSEntryDN").IsPresent) Alors
bIsGroupManagedByDomA = UtilsForFIM.CommonUtils.IsGroupManagedByDomAByDN(mventry("SourceCSEntryDN").Value)
Si (bIsGroupManagedByDomA = False) Alors
csentry("membre").Values.Clear()
UtilsForFIM.CommonUtils.memberStringToMembers(mventry, csentry, csentry.MA.Name)
Fin Si
Autre
Source csentry dn is missing
Fin Si
Et pour le domaine B :
Case “cd.group:member<-mv.group:memberString”
Dim bIsGroupManagedByDomA As Boolean
bIsGroupManagedByDomA = UtilsForFIM.CommonUtils.IsGroupManagedByDomA(csentry)
Si (bIsGroupManagedByDomA = True) Alors
csentry("membre").Values.Clear()
UtilsForFIM.CommonUtils.memberStringToMembers(mventry, csentry, csentry.MA.Name)
Fin Si
Voici la fonction memberStringToMembers qui traduit l'appartenance à partir de la valeur de la chaîne vers l'entrée de données appropriée pour le domaine vers lequel le groupe est exporté. Notez que cette fonction prend le connecteur sur l'événement du membre pour l'autorité de gestion qui traite l'exécution actuelle afin que nous ayons l'objet de l'utilisateur dans le domaine approprié.
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()
Il faut trouver l'événement pour ce connecteur et ensuite déterminer l'entrée DomA.
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)
Si (mvEntryMember.Length > 0) Alors
Dim ManagementAgent As ConnectedMA
Dim Connecteurs As Integer
ManagementAgent = mvEntryMember(0).ConnectedMAs(sMAName)
Connecteurs = ManagementAgent.Connectors.Count
Si (Connecteurs > 0) Alors
Dim csentryFound As CSEntry
csentryFound = ManagementAgent.Connectors.ByIndex(0)
csentry("membre").Values.Add(mvEntryMember(0).ConnectedMAs.Item(sMAName).Connectors.ByIndex(0).DN.ToString().ToLower()))
Fin Si
Fin Si
Suivant
End Sub