你是否曾尝试在"收件人"字段中输入一个名字,然后看到 Outlook 完美地自动补全了它? 在企业环境中,这种"魔力"通常源自 Exchange 服务器中的全局地址列表,但当您需要在不同的 Exchange 组织或 Microsoft 365 租户之间进行协作时,Outlook 就无法再“神奇地”查找到所有人了。.
主要收获
- 该 全球地址列表(GAL) 用作启用了邮件功能的用户(如个人用户、组和分发列表)的内置公司通讯录。每个独立的 Exchange 组织或 Microsoft 365 租户通常都有自己的全局地址列表。.
- 当合作伙伴公司或合并的组织使用 将Exchange组织分开 对于 Microsoft 365 租户,每个租户都将拥有自己的 单独的全局地址列表. 用户不会自动看到另一组织目录中的人员。.
- 常见的解决方案是 全局地址列表同步, ,该功能可在不同的环境之间来回复制地址列表条目,以便每个组织中的用户都能查找并联系另一组织中的人员。. CB Global Address List Sync, ,这是一个针对 CB Exchange Server Sync 的插件,它会自动执行此操作,并在后台静默运行。.
首次发布于2023年6月,最后更新于2026年9月
什么是全局地址列表(GAL)?
全局地址列表(GAL)是 Microsoft Exchange 的中央组织目录。它包含已启用邮件功能的收件人,用户在编写电子邮件或安排会议时可以搜索并选择这些收件人。.
根据组织的配置情况,全局地址列表(GAL)可能包含:
- 用户邮箱
- 邮件联系人
- Microsoft 365 组和启用了邮件功能的安全组
- 分发列表
- 共享邮箱
- 场地和设备,例如会议室或投影仪
全局地址列表是如何工作的?
GAL 基于在 Microsoft Exchange Server 或 Microsoft 365 中管理的收件人和目录信息构建而成。.
在本地部署的 Exchange 环境中,这些信息中的大部分都存储在 Active Directory 中,并通过其进行同步。在 Microsoft 365 中,收件人数据由 Microsoft Entra ID 和 Exchange Online 管理;采用混合部署的组织可将本地 Active Directory 中的目录数据同步到云端。.
当有人发送电子邮件或创建会议邀请时,Outlook 可以搜索全局地址列表(GAL),将联系人姓名解析为电子邮件地址。.
对于处于“缓存 Exchange 模式”下的 Outlook 桌面用户,通常可通过脱机通讯录 (OAB) 访问全局地址列表 (GAL)。 OAB 是地址列表数据的本地下载副本,即使用户的 Outlook 设备网络连接受限,也能通过它浏览和搜索目录。由于 OAB 按计划更新,最近更改的联系人详细信息可能不会立即显示在用户的 Outlook 桌面客户端中。.
哪里可以查看全球地址列表
要在微软Outlook中检查你的组织的全局地址列表,你所需要做的就是遵循这些步骤:
- 启动微软Outlook。
- 打开一个 新邮件 window.

- 点击 致 或者使用快捷键 Ctrl+Shift+B。.

- 选择全球地址列表或默认全球地址列表选项。

瞧!就是这么简单。.
何时需要进行GAL同步?
不同的组织通常拥有各自独立的GAL,即使它们之间存在关联。一个组织中的用户不会自动看到另一个组织目录中的收件人。这种情况比你想象的要常见:例如合并、合作关系,或者跨分支机构或子公司的多个Exchange环境。.
不支持访问多个 GAL。为了实现跨组织可见性,管理员可以同步目录条目,通常方法是在每个环境中创建并维护支持邮件功能的联系人或收件人对象。.
让我们来看几个可能需要这样做的场景:
- 兼并与收购 – 若A公司与B公司合并,同步两家公司的全局地址列表将为终端用户带来便利,因为所有联系信息现已适用于两个组织架构。您可通过查阅此文档了解并购场景中Exchange服务器的挑战。 博文.
- 合作伙伴 – 建立合作伙伴关系会自然而然地增加双方团队之间的互动。将一个GAL与另一个GAL进行同步,意味着从第一天起,每个人都能在Outlook中直接查找彼此的信息,而无需四处打听联系方式。.
- 多个微软Exchange服务器 – 同一集团内的公司可以连接到各自的 Exchange 环境,例如,当子公司分布在不同国家时,这种情况很常见。 假设A集团在全球设有多个分支机构,每个分支机构都拥有独立的IT基础设施和不同的Exchange服务器。此时,如果A集团欧洲分支机构的一名员工被调至同一集团的北美分支机构,全局地址列表(GAL)同步功能也能派上用场。.
GAL与CB Exchange Server Sync的同步性
CB Exchange Server Sync 这是我们专为 Microsoft Exchange Server 开发的同步工具。它能在多个 Exchange 环境之间保持电子邮件、日历、联系人、笔记、任务和文件夹的同步,并在后台静默运行,无需人工看管。.
对于还需要在这些环境之间同步其全局地址列表的组织,, CB Global Address List Sync 该插件是专门为该任务开发的。.
安装过程极其简单,因此您无需花费大量时间来研究如何让该解决方案投入运行。除了软件本身操作简便之外,我们还提供 在线文件 和我们的 支持门户网站 为您提供。
你准备好开始同步你的全球地址列表了吗? 取得联系 加入我们,我们将带您前往那里!
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))
{
返回;
}
var entity = (Entity) context.InputParameters["Target"];
var isLoginEnabled = HasLoginEnabled(entity);
if (isLoginEnabled == false)
{
返回;
}
try
{
var emailAddress = (string) entity["emailaddress1"];
var contactsWithSameEmailAddress = GetContactsByEmailAddress(service, entity.Id, emailAddress);
如果 (contactsWithSameEmailAddress.Entities.Count > 0)
{
var hasLoginEnabled = HasLoginEnabled(contactsWithSameEmailAddress.Entities[0]);
if (hasLoginEnabled)
{
throw new InvalidPluginExecutionException(OperationStatus.Failed、
"用户已存在。请尝试使用不同的电子邮件地址注册,或登录现有账户。");
}
var mergeRequest = new MergeRequest
{
SubordinateId = entity.Id、
Target = new EntityReference("contact", contactsWithSameEmailAddress.Entities[0].Id)、
更新内容 = GetUpdateContent(entity)
};
var _ = (MergeResponse) service.Execute(mergeRequest);
entity[CustomAttributeName] = true;
service.Update(entity);
}
否则
{
var domain = emailAddress.Split('@')[1];
如果 (_publicDomains.Contains(domain))
{
SendEmailAndDeactivateContact(service, tracingService, entity);
}
否则
{
var contactsWithSameDomain = GetContactsByDomain(service, entity.Id, domain);
if (contactsWithSameDomain.Entities.Count > 0)
{
entity["parentcustomerid"] = contactsWithSameDomain.Entities[0]["parentcustomerid"];
service.Update(entity);
}
否则
{
SendEmailAndDeactivateContact(service, tracingService, entity);
}
}
}
}
catch (FaultException) ex)
{
throw new InvalidPluginExecutionException("ContactPostOperationPlugin.",ex);
}
}
关闭代码关于作者

作者 Ana NetoConnecting Software 技术顾问。
“我从1997年起就从事软件工程师工作,最近对写作和公开演讲产生了浓厚兴趣。您对这篇文章有什么问题或意见吗?我很乐意听取您的反馈,请在下方留言!”"
