Notes from the field: Transporter Suite

A couple of weeks ago I participated in a migration project which involved a migration from Lotus Domino 7.0 to Exchange Server 2007.

I used the (free) Microsoft tool: Transporter Suite. Transporter Suite has all it takes to perform a full mail (and application) migration from Lotus to Exchange. The latest version is v08.02.0012, but I used the RTM version (if you want to know what’s new, read Microsoft Transporter Suite for Lotus Domino Release Notes).

There are several approaches you can take in a similar migration project, but I prefer to place the Exchange Server in front of the Lotus Notes server, adding a non-authoritative SMTP domain and forward messages for the users not yet migrated. The following picture depicts the scenario I used.


Actually you can even make the SMTP domain authoritative for the Exchange Server, it will still forward any unresolved addresses to the Lotus Notes server if you configure a Send Connector.

My personal feeling is that Transporter Suite has lots of space for improvements. Probably there are some commercial tools more powerful and even more stable, but with a little bit of patience and some testing, the tool provided by Microsoft will do the job.

I would like to share my findings, hoping that they might help you. As I mentioned before, there is a new release of Transporter Suite that may have solved some of the problems I faced.

  1. Install the connector components on a server with the Hub Transport (HT) role. Although the documentation mentions that it can be installed on a HT or/and CAS, without the HT role I couldn’t create any connections. Here’s an excerpt from the official documentation:
    All connector components (Directory Connector and Free/Busy Connector): Can only be installed on Exchange Server 2007 servers with the Hub and/or Client Access Server (CAS) roles installed; optionally, other roles (such as Mailbox or Unified Messaging) can also be installed.
  2. There’s a small misprint on the documentation. You’ll need to increase the maximum attachment size by editing the web.config file in the exchweb\EWS subdirectory of the ClientAccess directory on each CAS. The line that you’ll need to add is:

    <httpRuntime maxRequestLength=”10240″ />

    Please don’t forget the “/” at the end!
    (that’s the misprint)

  3. I had some problems migrating users. The error I had was:

    Summary: 1 item(s). 0 succeeded, 1 failed.
    Elapsed time: 00:00:01

  4. User1

    The value “SMTP:User1@DOMAIN.COM” of property “ExternalEmailAddress” is used by another recipient object “DOMAIN.COM/Domino Contacts/User1\/HQ\/Company”. Please specify another value.

    Exchange Management Shell command attempted:
    ‘CN=User1/OU=Sede/O=Company’ | move-dominouser -Quiet -DominoDirectoryServer ‘SRVNOTES’ -GlobalCatalog ‘DC01.DOMAIN.COM’ -TargetOU ‘.’ -InitialPassword ‘System.Security.SecureString’ -TargetId ‘DOMAIN\User1’

    Elapsed Time: 00:00:01

    I didn’t find a way of solving this problem. I think it’s related with the timings associated with the remove process of the contact created previously and the subsequent copy of all proxy addresses. So, the solution was to write my own migration code. Here it is, you might find it useful:

       1: '*******************************************************************************
       2: 'migrateUsers.VBS: Copy proxyAddresses from a Domino contact to an AD user
       3: '
       4: 'Version: 0.1    
       5: 'Date:    2008/01/07
       6: 'Author:  RUI SILVA rui.silva(a)
       7: '
       8: '*******************************************************************************
      10: Const ForReading = 1
      11: Const ForWriting = 2
      12: Const ADS_SCOPE_SUBTREE = 2
      13: Const ADS_PROPERTY_UPDATE = 2
      15: Set objConnection = CreateObject("ADODB.Connection")
      16: Set objCommand = CreateObject("ADODB.Command")
      17: objConnection.Provider = "ADsDSOObject"
      18: objConnection.Open "Active Directory Provider"
      19: Set objCommand.ActiveConnection = objConnection
      21: objCommand.Properties("Page Size") = 1000
      22: objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
      24:     strName=InputBox("Enter username:")
      25:     objCommand.CommandText = _
      26:         "SELECT distinguishedName FROM 'LDAP://ou=Domino Contacts,dc=DOMAIN,dc=COM' WHERE objectCategory='user' " & _
      27:             "AND mailNickname='" & strName & "'"
      28:     Set objRecordSet = objCommand.Execute
      30:     If objRecordset.RecordCount = 1 Then
      31:         strDN = objRecordSet.Fields("distinguishedName").Value
      32:         MsgBox(strDN & ": FOUND")
      33:     strDN = Replace(strDN, "/", "\/")
      34:         Set objContact = GetObject("LDAP://" & strDN)
      35:         arrProxyAddresses = objContact.GetEx("proxyAddresses")
      36:         nArr = UBound(arrProxyAddresses)
      37:         For n=0 To nArr
      38:             If InStr(arrProxyAddresses(n), "SMTP:") Then
      39:                 strEmailAddr = Mid(arrProxyAddresses(n), 6) 
      40:             End If
      41:         Next
      43:         objCommand.CommandText = _
      44:             "SELECT distinguishedName FROM 'LDAP://ou=USERS,dc=DOMAIN,dc=COM' WHERE objectCategory='user' " & _
      45:                 "AND sAMAccountName='" & strName & "'"
      46:         Set objRecordSet2 = objCommand.Execute
      48:         If objRecordset2.RecordCount = 1 Then
      49:             strDN2 = objRecordSet2.Fields("distinguishedName").Value
      50:             MsgBox(strDN2 & ": USER FOUND")
      51:             Set objRecipient = GetObject("LDAP://" & strDN2)
      53:             objRecipient.ProxyAddresses = arrProxyAddresses
      54:             objRecipient.put "mailnickname", strName
      55:             objRecipient.put "mail", strEmailAddr
      56: '            objRecipient.MailEnable strEmailAddr
      57:             objRecipient.SetInfo
      58:             MsgBox("OK")
      59:         End If
      61:         objContact.DeleteObject(0)
      63:         objRecordset.Close
      64:         objRecordset2.Close
      66:     Else    
      67:         MsgBox(strName & ": NOT_FOUND")
      68:     End If
      70: objConnection.Close

Good luck for your migration! Don’t forget to read the documentation: Microsoft Transporter for Lotus Domino End-to-End Guidance.

Share it! :

Leave a Reply

Your email address will not be published. Required fields are marked *