Creating an Offline Address Book

Creating an Offline Address Book

This content is no longer actively maintained. It is provided as is, for anyone who may still be using these technologies, with no warranties or claims of accuracy with regard to the most recent product version or service release.

The following example creates an offline address book (OAB). This example uses a function for Getting the Value of a Specific Property On an Object, Getting the Byte Value of a String, and Getting a Windows GUID.

Visual Basic

'//////////////////////////////////////////////////////////////////////
' Function: createOfflineAddressBook()
' Purpose:  Creates an Offline Address Book.
'
' Input:    szDomainName:         Domain of the Exchange org
'           szOrganizationName:   Name of Exchange org
'           szAddressName:        Name of address book
'           szDomain:             Domain suffix
'           szUserName:           admin username
'           szUserPwd:            admin pwd
'           szDirectoryServer:    Name of the Directory Server
'           szAdminGroup:        Name of the Admin Group
'
' Output:   createOfflineAddressBook:   Contains Error code (if any)
'
' Note:  In order for this example to function correctly, it may be necessary to include
' references to the following libraries: Active DS Type Library, Microsoft CDO for
' Exchange Management Library, Microsoft Cluster Service Automation Classes,
' Microsoft CDO for Windows 2000 Library.
'//////////////////////////////////////////////////////////////////////
Public Function createOfflineAddressBook(ByVal szDomainName As String, _
                                         ByVal szOrganizationName As String, _
                                         ByVal szAddressName As String, _
                                         ByVal szDomain As String, _
                                         ByVal szUserName As String, _
                                         ByVal szUserPwd As String, _
                                         ByVal szDirectoryServer, _
                                         ByVal szAdminGroup) As Integer

    Dim objLdap As IADsOpenDSObject
    Dim objOAB As IADs
    Dim objOABContainer As IADsContainer
    Dim szLdapDomain As String
    Dim szConnString As String
    Dim szSiteFolderServer As String
    Dim szAddressBookLocation As String
    Dim baSchedule(83) As Byte
    Dim szaOfflineABSServer() As String
    Dim szOfflineABServer As String
    Dim iIndex As Integer
    Dim baGuidArray(15) As Byte
    Dim szaDomTokens() As String
    Dim szDomainDN As String
    Dim iIndex As Integer
    Dim iCounter As Integer
    Dim szChar As String
    Dim bConv As Byte
    Dim szGuid As String

    On Error GoTo errhandler

    ' Puts the domain specified into an ldap domain string.
    szaDomTokens = Split(szDomainName, ".", -1, 1)
    szDomainDN = Join(szaDomTokens, ",dc=")
    szDomainDN = "dc=" & szDomainDN
    szLdapDomain = szDomainDN

    ' Fill in byte array, this is expensive but it's only called once per
    ' hosted org creation.
    For iIndex = LBound(baSchedule) To UBound(baSchedule)
        Select Case iIndex
            Case 6
                baSchedule(iIndex) = 8
            Case 18
                baSchedule(iIndex) = 8
            Case 30
                baSchedule(iIndex) = 8
            Case 42
                baSchedule(iIndex) = 8
            Case 54
                baSchedule(iIndex) = 8
            Case 66
                baSchedule(iIndex) = 8
            Case 78
                baSchedule(iIndex) = 8
            Case Else
                baSchedule(iIndex) = 0
        End Select
    Next

    ' Location of address book.

    szAddressBookLocation = "cn=" + szAddressName + _
                            ",cn=All Global Address Lists,cn=Address Lists Container,cn=" + _
                            szOrganizationName + ",cn=microsoft exchange,cn=services,cn=configuration," + _
                            szLdapDomain

    ' Get the site server string.

    szConnString = "LDAP://" + szDirectoryServer + "/" + _
                   "cn=" + szAdminGroup + ",cn=Administrative Groups,cn=" + _
                   szOrganizationName + ",cn=Microsoft Exchange,CN=Services,CN=Configuration," + _
                   szLdapDomain

    ' On the Admin group object, get the site folder server value.

    getValue szConnString, "siteFolderServer", szSiteFolderServer, szUserName, szUserPwd

    ' The offlineABServer is the sitefolderserver minus the first four entries,
    ' so when putting the szOfflineABSServer string together, start indexing at 4.

    szaOfflineABSServer = Split(szSiteFolderServer, "cn=", -1, 1)
    szOfflineABServer = ""
    For iIndex = 4 To UBound(szaOfflineABSServer)
        szOfflineABServer = szOfflineABServer + "cn=" + szaOfflineABSServer(iIndex)
    Next

    ' Open up the directory with the passed credentials (preferably the admin).

    ' Create a connection string for the offline address book.

    szConnString = "LDAP://" + szDirectoryServer + "/" + _
                   "CN=Offline Address Lists,CN=Address Lists Container,CN=" + _
                   szOrganizationName + ",CN=Microsoft Exchange,CN=Services,CN=Configuration," + _
                   szLdapDomain

    Set objLdap = GetObject("LDAP:")

    ' Create object and get FID.

    Set objOABContainer = objLdap.OpenDSObject(szConnString, _
                                               szUserName, _
                                               szUserPwd, _
                                               ADS_SECURE_AUTHENTICATION)

    ' Create the recipient policy object.

    Set objOAB = objOABContainer.Create("msExchOAB", _
                                        "cn=" + szAddressName)

    ' Set required properties.
    ' Take the string guid and get the guid as a hex byte array.
    szGuid = GetGUID

    iIndex = 0
    For iCounter = 1 To Len(szGuid) Step 2
        ' Get the current character.
        szChar = Mid(szGUID, iCounter, 2)
        ' Convert the character to it's hex value.
        bConv = getByteValue(szChar)
        ' Stick that hex value into the byte array.
        baGuidArray(iIndex) = bConv
        iIndex = iIndex + 1
    Next

    With objOAB
        .Put "name", szAddressName
        .Put "showInAdvancedViewOnly", True
        .Put "systemFlags", 1610612736
        .Put "doOABVersion", 0
        .Put "msExchOABFolder", 0
        .Put "offLineABContainers", szAddressBookLocation
        .Put "offLineABSchedule", baSchedule
        .Put "offLineABServer", szOfflineABServer
        .Put "offLineABStyle", 1
        .Put "siteFolderGUID", baGuidArray
        .Put "siteFolderServer", szSiteFolderServer
        .Put "legacyExchangeDN", "/o=" + szOrganizationName + "/cn=addrlists/cn=oabs/cn=" + szAddressName
        .SetInfo
    End With

    createOfflineAddressBook = 0

    ' Clean up.
    Set objLdap = Nothing
    Set objOAB = Nothing
    Set objOABContainer = Nothing
    Exit Function

    ' Error handling.
errhandler:

    Set objLdap = Nothing
    Set objOAB = Nothing
    Set objOABContainer = Nothing
    createOfflineAddressBook = 1
    ' Implement error logging here.

    Exit Function

End Function

Send us your feedback about the Microsoft Exchange Server 2003 SDK.

Build: June 2007 (2007.618.1)

© 2003-2006 Microsoft Corporation. All rights reserved. Terms of use.