Configure Attribute Flow
This step will likely take the most time and you
should pay close attention to the detail. As we map fields from Exchange
to the metaverse and visa-versa we have to pay close attention to the
flow direction as well as any advanced rules we need to apply. As you
will find out, standard mapping rules will allow us to meet our
objectives. From the Configure Attribute Flow screen, you can see that
we are configuring flow for all three object types we wish to
synchronize.

To make things simple for this installation, we are
importing each of the Exchange settings into a single object type called
Metaverse_contact. Moreover, we are only exporting objects into the
Exchange environment as Remote-Address (custom recipients) and only into
a specific, pre-determined container. When specifying attribute flow,
you choose the source, the target and the fields you wish to map. In
addition, you can specify any advanced mapping type you wish to use.
When using the advanced features, we can select more than one object
type as a source and the source code we wish to use to handle the
business logic. Let’s go over an example. You should notice that the
mail field highlighted in the picture shows an Advanced mapping rule is
in place. If we click Edit, we can see which rule is being identified.
From
the advanced flow options window, we can see that a specific flow rule
named “mail” is identified. This tells MIIS that when performing an
import on this object, it should reference the extension DLL identified
in this MA (we will get to that later in the document) and that the
logic in that code should be applied to this flow.
Inside our extension DLL, we have a sub called:
Public Sub
MapAttributesForImport(ByVal
FlowRuleName As
String, ByVal csentry
As
Microsoft.MetadirectoryServices.CSEntry, ByVal
mventry As
Microsoft.MetadirectoryServices.MVEntry)
Implements
Microsoft.MetadirectoryServices.IMASynchronization.MapAttributesForImport
Within this sub, there are several import rules
defined. This is the one named mail:
Case
"mail"
If
csentry(FlowRuleName).IsPresent Then
Dim work
As String
= csentry(FlowRuleName).Value
work = Replace(work, "/", "")
work = Replace(work, "\", "")
mventry(FlowRuleName).Value = work
End
If
The purpose of this code is to cleanout illegal
characters such as the “/” and “\” from the mail address (SMTP Address).
An illegal address of
Atlanta/sales@companya.com would be changed to
atlantasales@companya.com. While the illegal characters would remain
in the Exchange system, they would be clean in the metaverse and then
legal to push to AD.
Export Attribute Flow (Send to Exchange from Metaverse)
Here are the current flow settings for the Exchange
MA. You can see from this table, that we did not require specialized
code to manipulate the data. Instead, we elected to clean the
information during the import process so that data in the metaverse is
“normalized”.
|
Export Attribute Flow
|
|
Data Source Attribute |
To |
Metaverse Attribute |
Mapping Type |
Allow Nulls |
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
cn |
<-- |
cn |
Direct |
-
|
|
givenName |
<-- |
givenName |
Direct |
Allow |
|
mail |
<-- |
mail |
Direct |
-
|
|
uid |
<-- |
uid |
Direct |
Allow |
|
MAPI-Recipient |
<-- |
MapiRecipient |
Direct |
Allow |
|
otherMailbox |
<-- |
proxyAddresses |
Direct |
-
|
|
sn |
<-- |
sn |
Direct |
Allow |
|
department |
<-- |
department |
Direct |
Allow |
|
Company |
<-- |
company |
Direct |
Allow |
|
initials |
<-- |
initials |
Direct |
Allow |
|
pager |
<-- |
pager |
Direct |
Allow |
|
title |
<-- |
title |
Direct |
Allow |
|
st |
<-- |
st |
Direct |
Allow |
|
postalCode |
<-- |
postalCode |
Direct |
Allow |
|
postalAddress |
<-- |
streetAddress |
Direct |
Allow |
|
l |
<-- |
l |
Direct |
Allow |
|
facsimileTelephoneNumber |
<-- |
facsimileTelephoneNumber |
Direct |
Allow |
|
mobile |
<-- |
mobile |
Direct |
Allow |
|
telephoneNumber |
<-- |
telephoneNumber |
Direct |
Allow |
|
physicalDeliveryOfficeName |
<-- |
physicalDeliveryOfficeName |
Direct |
Allow |
|
rdn |
<-- |
uid |
Direct |
-
|
|
co |
<-- |
c |
Direct |
Allow |
|
Target-Address |
<-- |
targetAddress |
Direct |
Allow |
|
|
|
|
Import Attribute Flow (Send to Metaverse from Exchange)
Importing Exchange information into the metaverse
required much more work in that we needed to reformat, clean and
construct new fields based on information collected from other fields.
In order to correctly populate the proxyaddresses attribute, we had to
contruct the field based on three Exchange 5.5 fields; otherMailbox,
rfc822Mailbox and textEncodedORaddress. Custom code was created to
combine these strings into a collection in order to populate the
multi-value field in the MV. To see the source code for the specific
rules extensions, refer to the code section at the end of this document.
|
Import Attribute Flow
|
|
Data Source Attribute |
To |
Metaverse Attribute |
Mapping Type |
Precedence Order |
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
cn |
-->
|
cn |
Direct |
2
|
|
groupOfNames
|
-
|
Metaverse_Contact
|
-
|
-
|
|
cn |
-->
|
cn |
Direct |
3
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
cn |
-->
|
cn |
Direct |
4
|
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
Company |
-->
|
company |
Direct |
2
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
Company |
-->
|
company |
Direct |
3
|
|
department |
-->
|
department |
Direct |
2
|
|
mail |
-->
|
mail |
Rules
Extension - mail |
1
|
|
groupOfNames
|
-
|
Metaverse_Contact
|
-
|
-
|
|
mail |
-->
|
mail |
Rules
Extension - mail |
2
|
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
mail |
-->
|
mail |
Direct |
3
|
|
co |
-->
|
co |
Direct |
2
|
|
givenName |
-->
|
givenName |
Direct |
2
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
givenName |
-->
|
givenName |
Direct |
3
|
|
initials |
-->
|
initials |
Direct |
2
|
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
mobile |
-->
|
mobile |
Direct |
2
|
|
title |
-->
|
title |
Direct |
2
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
title |
-->
|
title |
Direct |
3
|
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
cn |
-->
|
displayName |
Direct |
3
|
|
groupOfNames
|
-
|
Metaverse_Contact
|
-
|
-
|
|
cn |
-->
|
displayName |
Direct |
4
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
cn |
-->
|
displayName |
Direct |
6
|
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
sn |
-->
|
sn |
Direct |
2
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
sn |
-->
|
sn |
Direct |
3
|
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
facsimileTelephoneNumber |
-->
|
facsimileTelephoneNumber |
Direct |
2
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
facsimileTelephoneNumber |
-->
|
facsimileTelephoneNumber |
Direct |
3
|
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
rdn |
-->
|
mailNickname |
Direct |
3
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
rdn |
-->
|
mailNickname |
Direct |
5
|
|
groupOfNames
|
-
|
Metaverse_Contact
|
-
|
-
|
|
rdn |
-->
|
mailNickname |
Rules
Extension - mailNickname |
6
|
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
pager |
-->
|
pager |
Direct |
2
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
pager |
-->
|
pager |
Direct |
3
|
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
postalCode |
-->
|
postalCode |
Direct |
2
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
postalCode |
-->
|
postalCode |
Direct |
3
|
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
st |
-->
|
st |
Direct |
2
|
|
rfc822Mailbox |
-->
|
targetAddress |
Rules
Extension - targetAddress |
1
|
|
groupOfNames
|
-
|
Metaverse_Contact
|
-
|
-
|
|
rfc822Mailbox |
-->
|
targetAddress |
Rules
Extension - targetAddress |
2
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
rfc822Mailbox |
-->
|
targetAddress |
Rules
Extension - targetAddress |
3
|
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
Hide-From-Address-Book |
-->
|
msExchHideFromAddressLists |
Direct |
2
|
|
groupOfNames
|
-
|
Metaverse_Contact
|
-
|
-
|
|
Hide-From-Address-Book |
-->
|
msExchHideFromAddressLists |
Direct |
4
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
Hide-From-Address-Book |
-->
|
msExchHideFromAddressLists |
Direct |
6
|
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
postalAddress |
-->
|
streetAddress |
Direct |
4
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
postalAddress |
-->
|
streetAddress |
Direct |
5
|
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
telephoneNumber |
-->
|
telephoneNumber |
Direct |
1
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
telephoneNumber |
-->
|
telephoneNumber |
Direct |
3
|
|
uid |
-->
|
uid |
Direct |
3
|
|
rdn |
-->
|
uid |
Direct |
4
|
|
groupOfNames
|
-
|
Metaverse_Contact
|
-
|
-
|
|
uid |
-->
|
uid |
Rules
Extension - uid |
6
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
otherMailbox,rfc822Mailbox,textEncodedORaddress |
-->
|
proxyAddresses |
Rules
Extension - proxyaddresses |
1
|
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
otherMailbox,rfc822Mailbox,textEncodedORaddress |
-->
|
proxyAddresses |
Rules
Extension - proxyaddresses |
2
|
|
groupOfNames
|
-
|
Metaverse_Contact
|
-
|
-
|
|
otherMailbox,rfc822Mailbox,textEncodedORaddress |
-->
|
proxyAddresses |
Rules
Extension - proxyaddresses |
3
|
|
textEncodedORaddress |
-->
|
textEncodedORAddress |
Direct |
2
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
textEncodedORaddress |
-->
|
textEncodedORAddress |
Direct |
5
|
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
MAPI-Recipient |
-->
|
MapiRecipient |
Direct |
1
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
MAPI-Recipient |
-->
|
MapiRecipient |
Direct |
3
|
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
l |
-->
|
l |
Direct |
1
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
l |
-->
|
l |
Direct |
3
|
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
physicalDeliveryOfficeName |
-->
|
physicalDeliveryOfficeName |
Direct |
1
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
physicalDeliveryOfficeName |
-->
|
physicalDeliveryOfficeName |
Direct |
3
|
|
organizationalPerson
|
-
|
Metaverse_Contact
|
-
|
-
|
|
co |
-->
|
c |
Direct |
3
|
|
Remote-Address
|
-
|
Metaverse_Contact
|
-
|
-
|
|
co |
-->
|
c |
Direct |
4
|
|
rfc822Mailbox |
-->
|
Rfc822Mailbox |
Rules
Extension - Rfc822Mailbox |
1
|
|
groupOfNames
|
-
|
Metaverse_Contact
|
-
|
-
|
|
rfc822Mailbox |
-->
|
Rfc822Mailbox |
Rules
Extension - Rfc822Mailbox |
2
|
|
|
|
|
|