Exchange Cross Forest Migrations and x500 address calendar issues

After conducting an Exchange migration a much heard issue is that old calendar items of users cannot be modified or send to the recipients that are members of the appointment.

Reason for this behavior are x500 addresses which where available in the old environment, and are saved by Exchange in the appointment itself. x500 addresses are an alternative for smtp addresses, and can be used for internal message routing. The x500 message format includes addresses in the following format:

/o=First Organization/ou=First Administrative Group/cn=Recipients/cn=username

The above example comes from an Exchange 2003 environment. When looking at an Exchange 2010 environment, the standard format is as follows:

/o=OrgName/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/

Note that the actual path may differ when you are using other Administrative groups in your environment. At this point, after a migration, users have no x500 address in the new Exchange environment, so when a user updates an old calendar item and sends it to the members of the appointment, you’ll get a non-deliverable report (NDR) stating that the destination user does not exist. Other symptoms include crashing of Outlook.exe

When clicking the recipient in the appointment, you’ll see the x500 address that Exchange tries to contact.

Besides this, the x500 address can also be seen in the NDR.

How to fix this?

To make sending changes of old appointments working again, configure the users in the new Exchange environment with their old x500 address. The procedure is as follows:

1. Export a list of the ExchangeLegacyDN from the old environment

Export the value of ExchangeLegacyDN from the old environment. A nice tool to export this data is csvde. The exact command would be something like this:

csvde -f c:\users.csv -l "LegacyExchangeDN" -d "OU=OU-name,DC=fabrikam,DC=Local"

Create a separate column and populate it with the alias of the user from the new environment. Name both colums “username” and “x500″.

2. Add the combined x500 addresses to the new Exchange environment.

The following command let will create a new x500 address for a user. The easiest thing to do is create a powershell script that loops through your created csv file and adds the x500 addresses to the users. An example:


Import-Csv users.csv | Foreach-Object{

$user = Get-Mailbox -Identity $_.Username

$address = $_.x500

Set-Mailbox $user -EmailAddresses( (Get-Mailbox $user).EmailAddresses+="X500:"+ $x500 )

What about these attributes?

Along the way there are quite some attributes that can be used and queried to fix this x500 issue. I’ve created a small list with user attributes that can be used to extract information from Exchange and Active Directory. Take a look at them using adsiedit.

  • proxyaddresses: This attribute stores all addresses that you configure in exchange. All smtp, x500 and other addresses are stored here for a user.
  • ExchangeLegacyDN: The ExchangeLegacyDN provides backward compatibility with older Exchange systems. The x500 address is based on the ExchangeLegacyDN.

Workarounds

A workaround to the problem described in this article is to let users delete the recipient before re-sending the edited appointment. After this, select the recipient from the GAL. Outlook now queries Exchange for available addresses and selects a address that is valid (for example, the smtp address instead of the deprecated x500 address.)

Thanks to my colleague Jos Vanaubel who helped fixing the issue.

Dominique is an IT enthousiast who currently works as a consultant in the south of the Netherlands. He has a strong focus on Microsoft collaboration products (Microsoft Exchange, Lync) and Cisco Wireless Networking. He blogs about these technologies at www.techdom.nl

  • http://twitter.com/TooJawsome James Scott

    Your script has 2 issues, first the $address variable should be renamed $x500 and second you’re missing the closing curlie.
     
    Import-Csv users.csv | Foreach-Object{

    $user = Get-Mailbox -Identity $_.Username

    $x500 = $_.x500

    Set-Mailbox $user -EmailAddresses( (Get-Mailbox $user).EmailAddresses+=”X500:”+ $x500 )

    }