Microsoft Identity Integration Server 2003 Developer Reference |
When an attribute value change to the metaverse occurs, such as changing the employee status, you might have to change the distinguished name of an existing connector space entry to rename or move the object in a connected data source.
You can change the distinguished name of an existing connector by first iterating through the ConnectorCollectionByIndex.Item property to get the first connector. If the metaverse entry contains multiple connectors, use conditional logic to identify the appropriate connector. After getting the appropriate connector, set the CSEntry.DN property to the new distinguished name.
The following example shows how to construct a distinguished name using the ReferenceValue.Concat method. If the distinguished name exists, this example catches the exception and appends an integer to the end of the distinguished name until the distinguished name is unique.
Public Sub Provision(ByVal mventry As MVEntry) _ Implements IMVSynchronization.Provision Dim uniqueDN As Boolean = False Dim connectors As Integer Dim index As Integer = 0 Dim csEntry As CSEntry Dim container, rdn As String Dim ma As ConnectedMA Dim dn As ReferenceValue Dim ExceptionMessage As String container = "CN=users,DC=fabrikam,DC=com" ma = mventry.ConnectedMAs("Fabrikam AD MA") If Not mventry("cn").IsPresent Then ExceptionMessage = "The attribute cn was unexpectedly not present on the metaverse object." Throw New UnexpectedDataException(ExceptionMessage) Else rdn = "CN=" & mventry("cn").Value dn = ma.EscapeDNComponent(rdn).Concat(container) connectors = ma.Connectors.Count ' If there are no existing connectors, create a new connector. If 0 = connectors Then ' Verify whether the distinguished name is unique. If it ' is not unique, create a new distinguished name. While Not uniqueDN Try csEntry = ma.Connectors.StartNewConnector("user") csEntry.DN = dn csEntry.CommitNewConnector() uniqueDN = True ' The catch block creates a new distinguished name by ' appending an integer to the original rdn (cnValue). Catch oaex As ObjectAlreadyExistsException rdn = "CN=" + mventry("cn").Value + index.ToString() dn = ma.EscapeDNComponent(rdn).Concat(container) index = index + 1 uniqueDN = False End Try End While End If End If End Sub
void IMVSynchronization.Provision (MVEntry mventry) { bool uniqueDN = false; int connectors, index = 0; CSEntry csEntry; string container, rdn; ConnectedMA ma; ReferenceValue dn; container = "CN=users,DC=fabrikam,DC=com"; ma = mventry.ConnectedMAs["Fabrikam AD MA"]; if(!mventry["cn"].IsPresent) { string ExceptionMessage; ExceptionMessage = "The attribute cn was unexpectedly not present on the metaverse object."; throw new UnexpectedDataException(ExceptionMessage); } else { rdn = "CN=" + mventry["cn"].Value; dn = ma.EscapeDNComponent(rdn).Concat(container); connectors = ma.Connectors.Count; // If there are no existing connectors, create a new connector. if(0 == connectors) { // Verify whether the distinguished name is unique. If it // is not unique, create a new distinguished name. while(!uniqueDN) { try { csEntry = ma.Connectors.StartNewConnector("user"); csEntry.DN = dn; // If connector space entry with the same distinguished name exists, // CommitNewConnector() throws an exception. csEntry.CommitNewConnector(); uniqueDN = true; } // The catch block creates a new distinguished name by // appending an integer to the original rdn (cnValue). catch(ObjectAlreadyExistsException) { rdn = "CN=" + mventry["cn"].Value + index.ToString(); dn = ma.EscapeDNComponent(rdn).Concat(container); index++; uniqueDN = false; } } } } }