how-to-synchronize-the-global-address-list-and-use-it-in-outlook

How To Synchronize the Global Address List and Use It in Outlook

Ana NetoProducts and Solutions Leave a Comment

Ever start typing a name in the "To" field and watch Outlook auto-complete it perfectly? In a corporate environment, that "magic" often comes from the Global Address List in Exchange Server, but when you need to work across separate Exchange organizations or Microsoft 365 tenants, Outlook can no longer “magically” look everyone up.

Key Takeaways

  • The Global Address List (GAL) works as the built-in company directory of mail-enabled recipients, such as users, groups, and distribution lists. Each separate Exchange organization or Microsoft 365 tenant typically has its own Global Address List.
  • When partner companies or merging organizations use separate Exchange organizations or Microsoft 365 tenants, each will have its own separate Global Address List. Users will not automatically see people in the other organization’s directory.
  • The common solution is Global Address List synchronization, which copies address list entries back and forth between the separate environments so that users in each organization can find and address people in the other organization. CB Global Address List Sync, an add-on for CB Exchange Server Sync, does this automatically and runs quietly in the background.

First published in June 2023, last updated in September 2026

What is the Global Address List (GAL)?

The Global Address List (GAL) is Microsoft Exchange’s central organizational directory. It contains mail-enabled recipients that users can search and select when addressing email or scheduling meetings.

Depending on how the organization is configured, the GAL can include:

  • User mailboxes
  • Mail contacts
  • Microsoft 365 groups and mail-enabled security groups
  • Distribution lists
  • Shared mailboxes
  • Rooms and equipment, such as meeting rooms or projectors

How Does a Global Address List Work?

The GAL is built from recipient and directory information managed in Microsoft Exchange Server or Microsoft 365.

In an on-premises Exchange deployment, much of this information is stored in and synchronized through Active Directory. In Microsoft 365, recipient data is maintained in Microsoft Entra ID and Exchange Online; hybrid organizations may synchronize directory data from on-premises Active Directory to the cloud.

When someone sends an email or creates a meeting invitation, Outlook can search the GAL to resolve a person’s name into an email address.

For Outlook desktop users in Cached Exchange Mode, the GAL is often available through an Offline Address Book (OAB). The OAB is a downloaded local copy of address-list data that enables users to browse and search the directory even when Outlook has limited connectivity. Because the OAB updates on a schedule, recently changed contact details may not appear immediately in a user’s desktop Outlook client.

Where to View the Global Address List

To check the Global Address List of your organization in Microsoft Outlook, all you need to do is follow these steps:

  • Launch Microsoft Outlook.
  • Open a New mail window.
    Microsoft Outlook screenshot - New mail
  • Click on To or use the shortcut Ctrl+Shift+B.
    Microsoft Outlook screenshot - Send To
  • Select the Global Address List or Default Global Address List option.
    Microsoft Outlook screenshot - Default Global Address List

Voilà! It’s as easy as this. 

When Do You Need GAL Synchronization?

Separate organizations typically have separate GALs, even if they are related. Users in one organization will not automatically see recipients in the other organization’s directory. This happens more than you'd think: mergers, partnerships, or multiple Exchange environments across branches or subsidiaries.

Access to more than one GAL is not supported. To provide cross-organization visibility, administrators can synchronize directory entries, commonly by creating and maintaining mail-enabled contact or recipient objects in each environment.

Let’s look at a couple of scenarios that could call for this:

  • Mergers and Acquisitions – If company A is merging with company B, synchronizing the Global Address Lists of both companies will make life easier for end-users since all contact information will now be common to both structures. You can read more on Exchange Server challenges in M&A scenarios by checking out this blog post.
  • Partners – Partnerships bring a natural increase in back-and-forth between both teams. Syncing one GAL with another means everyone can look each other up in Outlook from day one, instead of asking around for contacts.
  • Multiple Microsoft Exchange servers – Companies operating within the same group can be connected to their own Exchange environments, which is common, for example, when subsidiaries are spread across different countries. Imagine company group A has several branches across the globe, each with their own IT infrastructure and different Exchange servers. Then, if an employee from the European branch is reallocated to the North American branch of the same company group A, GAL synchronization can also come in useful.

GAL Synchronization with CB Exchange Server Sync

CB Exchange Server Sync is our synchronization tool for Microsoft Exchange Server. It keeps emails, calendars, contacts, notes, tasks, and folders in sync across multiple Exchange environments, running quietly in the background so nobody has to babysit it.

For organizations that also need their Global Address Lists synced across those environments, CB Global Address List Sync is the add-on built specifically for that job.

Installation is incredibly easy, so you will not have to spend endless time figuring out how to get this solution up and running. Besides the software itself being straightforward, we also have Online Documentation and our Support Portal available for you.

Are you ready to start synchronizing your Global Address List? Get in touch with us, and we will take you there!

      public void Execute(IServiceProvider serviceProvider)
    {
        var tracingService = (ITracingService) serviceProvider.GetService(typeof(ITracingService));
        var context = (IPluginExecutionContext) serviceProvider.GetService(typeof(IPluginExecutionContext));
        var serviceFactory = (IOrganizationServiceFactory) serviceProvider.GetService(typeof(IOrganizationServiceFactory));
        var service = serviceFactory.CreateOrganizationService(context.UserId);
        if (!context.InputParameters.Contains("Target") || !(context.InputParameters["Target"] is Entity))
        {
            return;
        }

        var entity = (Entity) context.InputParameters["Target"];
        var isLoginEnabled = HasLoginEnabled(entity);
        
        if (isLoginEnabled == false)
        {
            return;
        }

        try
        {
            var emailAddress = (string) entity["emailaddress1"];
            var contactsWithSameEmailAddress = GetContactsByEmailAddress(service, entity.Id, emailAddress);
            if (contactsWithSameEmailAddress.Entities.Count > 0)
            {
                var hasLoginEnabled = HasLoginEnabled(contactsWithSameEmailAddress.Entities[0]);
                if (hasLoginEnabled)
                {
                    throw new InvalidPluginExecutionException(OperationStatus.Failed,
                        "User already exists. Try a different email address to register, or login to your existing account.");
                }

                var mergeRequest = new MergeRequest
                {
                    SubordinateId = entity.Id,
                    Target = new EntityReference("contact", contactsWithSameEmailAddress.Entities[0].Id),
                    UpdateContent = GetUpdateContent(entity)
                };
                var _ = (MergeResponse) service.Execute(mergeRequest);
                entity[CustomAttributeName] = true;
                service.Update(entity);
            }
            else
            {
                var domain = emailAddress.Split('@')[1];
                if (_publicDomains.Contains(domain))
                {
                    SendEmailAndDeactivateContact(service, tracingService, entity);
                }
                else
                {
                    var contactsWithSameDomain = GetContactsByDomain(service, entity.Id, domain);
                    if (contactsWithSameDomain.Entities.Count > 0)
                    {
                        entity["parentcustomerid"] = contactsWithSameDomain.Entities[0]["parentcustomerid"];
                        service.Update(entity);
                    }
                    else
                    {
                        SendEmailAndDeactivateContact(service, tracingService, entity);
                    }
                }
            }
        }
        catch (FaultException ex)
        {
            throw new InvalidPluginExecutionException("An error occurred in ContactPostOperationPlugin.", ex);
        }
    }
Close code

About the Author

Ana Neto

By Ana Neto, technical advisor at Connecting Software.

“I have been a software engineer since 1997, with a more recent love for writing and public speaking. Do you have any questions or comments about this article? I would love to have your feedback, please leave a comment below!"

Leave a Reply

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

For security, use of Google's reCAPTCHA service is required which is subject to the Google Privacy Policy and Terms of Use.