How to: Duplicate a Connected Data Source Hierarchy

You can duplicate the hierarchy of one connected data source in another connected data source during the provisioning phase of synchronization in Forefront Identity Manager Synchronization Service (FIM Synchronization Service). The following example shows how you can do this. This example requires that you flow the distinguished name (DN) into the objectDN attribute in the metaverse during import attribute flow.

Dim AFGALContainer As String

Public Sub Provision(ByVal mventry As MVEntry) _
    Implements IMVSynchronization.Provision

    Try
        Dim containerInfo As String

        Dim dn, finalValue       As ReferenceValue
        Dim myConnector, csentry As CSEntry
        Dim numADConnectors      As Integer

        Dim JDPMA As ConnectedMA = mventry.ConnectedMAs("AD-AMC")

        Dim dnValue As ReferenceValue = JDPMA.CreateDN(mventry("objectDN").Value)

        Dim depth As Integer = dnValue.Depth

        ' If there is no connector present, add a new AD connector
        ' and call a subroutine to set the initial values on the CS Object.
        numADConnectors = JDPMA.Connectors.Count

        If 0 = numADConnectors Then
            Dim adObjectType As String

            Select Case mventry.ObjectType.ToLower
                Case "person"
                    adObjectType  = "contact"
                    finalValue    = dnValue.Subcomponents(1, depth - 1)
                    containerInfo = finalValue.ToString
                    containerInfo = containerInfo.ToUpper
                    containerInfo = containerInfo.Replace("CN=", "OU=")

                    dn = JDPMA.CreateDN("CN=" + mventry("cn").Value + "," + containerInfo + "," + AFGALContainer)

                Case "container"
                    adObjectType  = "organizationalUnit"
                    finalValue    = dnValue.Subcomponents(0, depth - 1)
                    containerInfo = finalValue.ToString
                    containerInfo = containerInfo.ToUpper
                    containerInfo = containerInfo.Replace("CN=", "OU=")

                    dn = JDPMA.CreateDN(containerInfo + "," + AFGALContainer)

                Case "organizationalunit"
                    adObjectType  = "organizationalUnit"
                    finalValue    = dnValue.Subcomponents(0, depth - 1)
                    containerInfo = finalValue.ToString
                    containerInfo = containerInfo.ToUpper

                    dn = JDPMA.CreateDN(containerInfo + "," + AFGALContainer)
            End Select

            csentry    = JDPMA.Connectors.StartNewConnector(adObjectType)
            csentry.DN = dn
            csentry.CommitNewConnector()
        ElseIf 1 = numADConnectors Then
            ' Check if the connector has a different DN and rename if necessary.

            ' First get the connector.
            myConnector = JDPMA.Connectors.ByIndex(0)

            ' MMS will rename or move if different.
            myConnector.DN = dn

        Else
            Throw New UnexpectedDataException("multiple AD connectors:" + numADConnectors.ToString)
        End If

    Finally
        ' Add cleanup code.
    End Try

End Sub
string AFGALContainer = "";

void IMVSynchronization.Provision (MVEntry mventry)
{
    try
    {
        string containerInfo;
        ReferenceValue dn = null, finalValue;
        CSEntry myConnector, csentry;
        int numADConnectors;

        ConnectedMA JDPMA = mventry.ConnectedMAs["AD-AMC"];

        ReferenceValue dnValue = JDPMA.CreateDN(mventry["objectDN"].Value);

        int depth = dnValue.Depth;

        // If there is no connector present, add a new AD connector
        // and call a subroutine to set the initial values on the CS Object.
        numADConnectors = JDPMA.Connectors.Count;

        if(numADConnectors == 0)
        {
            string adObjectType = "";

            switch(mventry.ObjectType.ToLower())
            {
                case "person":
                    adObjectType  = "contact";
                    finalValue    = dnValue.Subcomponents(1, depth - 1);
                    containerInfo = finalValue.ToString();
                    containerInfo = containerInfo.ToUpper();
                    containerInfo = containerInfo.Replace("CN=", "OU=");

                    dn = JDPMA.CreateDN("CN=" + mventry["cn"].Value + "," + containerInfo + "," + AFGALContainer);
                    break;

                case "container":
                    adObjectType  = "organizationalUnit";
                    finalValue    = dnValue.Subcomponents(0, depth - 1);
                    containerInfo = finalValue.ToString();
                    containerInfo = containerInfo.ToUpper();
                    containerInfo = containerInfo.Replace("CN=", "OU=");

                    dn = JDPMA.CreateDN(containerInfo + "," + AFGALContainer);
                    break;

                case "organizationalunit":
                    adObjectType  = "organizationalUnit";
                    finalValue    = dnValue.Subcomponents(0, depth - 1);
                    containerInfo = finalValue.ToString();
                    containerInfo = containerInfo.ToUpper();

                    dn = JDPMA.CreateDN(containerInfo + "," + AFGALContainer);
                    break;
            }

            csentry    = JDPMA.Connectors.StartNewConnector(adObjectType);
            csentry.DN = dn;
            csentry.CommitNewConnector();
        }
        else if(numADConnectors == 1)
        {
            // Check if the connector has a different DN and rename if necessary.
            // First get the connector.
            myConnector = JDPMA.Connectors.ByIndex[0];

            // <tla rid="fim_sync_short"/> will rename or move if different.
            myConnector.DN = dn;
        }
        else
        {
            throw new UnexpectedDataException("multiple AD connectors:" + numADConnectors.ToString());
        }
    }
    finally
    {
        // Add cleanup code.
    }
}

See Also

Reference

IMVSynchronization

Concepts

Rules Extensions Examples
Using Rules Extensions
Provisioning Objects in the Connector Space