博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自动发现服务是怎样工作的?
阅读量:6074 次
发布时间:2019-06-20

本文共 5467 字,大约阅读时间需要 18 分钟。

自动发现服务是怎样工作的?

自动发现服务为 Exchange 客户端, 包括 MAPI 连接的Outlook 2007,手机 ActiveSync 和 Outlook Anywhere 提供自动配置的功能,并提供给Outlook访问基于 web 的脱机地址簿,忙闲信息,统一消息服务的信息

【图1:Outlook自动侦测用户名】

【图2:自动配置Outlook 2007】

 

Exchange 2007 中使用自动发现服务来为客户端提供这些信息,Outlook首先要做的就是找到自动发现服务的位置。

(sigh……, 不能免俗,也要用到微软这个图)

【图3:域内客户端使用自动发现服务】

 

基本的访问流程是这样的:

  1. 域内的 Outlook 首先去寻找SCP 服务接入点

  2. SCP会返回给Outlook 自动发现服务的URL

  3. Outlook使用 HTTPS 加密的连接连到自动发现服务

  4. 得到需要的信息

 

一,SCP (Service Connection Point)服务连接点

当Outlook 2007 使用自动发现服务的时候第一步会使用LDAP查询 GC 寻找 SCP 对象,SCP对象为Outook提供信息。查询 objectclass=serviceconnectionpoint。

 

当安装 CAS 的时候,会创建一个SCP的对象在:

CN=Autodiscover,CN=Protocols,CN=<CASServer>,CN=Servers,CN=Exchange Administrative Group,CN=Administrative Groups,CN=First Organization,CN=Microsoft Exchange,CN=Services

【图4:SCP在哪里】

 

CAS 的安装会更新 serviceBindingInformation 的信息为:

https://<CASServerFQDN>/autodiscover/autodiscover.xml

【图5:SCP绑定的自动发现URL】

 

我们可以使用 Get-ClientAccessServer 来得到这个URL。

【图6:Get-ClientAccessServer 得到自动发现URL】

 

也可以使用 Set-ClientAccessServer –AutodiscoverServiceInternalURI 来更改这个URL。

【图7:Set-ClientAccessServer 更改自动发现URL】

【图8:更改后的URL】

 

如果你使用 DNS round-robin 来控制使用哪台CAS,你可能需要更改这个值。

 

注:SCP 只是AD中为服务保存信息的对象,并不是只有Exchange 会创建SCP。

 

 

 

 

 

 

 

 

 

 

 

二,Outlook 选择SCP信息

当Outlook 查询时,AD会返回所有SCP的信息,比如你有两个 CAS 服务器: CAS1 和 CAS2 ,那么返回的 SCP 的信息也有两个,一个指向 CAS1, 另一个指向 CAS 2.

 

CAS1:

CAS2:

 

Outlook 到底应该选择哪一个呢?

 

这时候就要用到 keywords, SCP 对象的属性里面有一项 keywords, 包含了SCP 所提供的服务的站点信息。

【图9:SCP 对应的站点信息】

 

比如 CAS1 属于 site1, 那么默认情况下,安装 CAS1 时,它会在keywords 属性里面添加 site1。图中的CAS服务器 Ex07SP2 属于站点 Default-First-Site-Name,那么它的 keywords 属性就会显示出站点的信息。

 

Outlook 得到所有的 SCP 信息后,会根据站点的信息,生成两个列表,站点内列表 和 站点外列表,优先选择的是站点内的CAS, 如果站点内的 CAS 无法联系,Outlook 才会选择站点外的CAS。

 

如果你只有一台 CAS 服务器在站点1 中,站点2 内没有安装过任何 Exchange服务器,那么站点2 的客户端从SCP 中得到的信息还是指向站点1 中的CAS服务器。

 

假设,站点1有 CAS1, 站点2 有 CAS2, 那么站点2 的客户端默认会使用站点2 的 SCP 信息,如下图:

 

【图10:按住ctrl 然后点击 Outlook 图标做自动配置的测试】

 

 

【图11:站点2 内的客户端使用 站点2 的 SCP 信息】

 

如果 site2的 CAS2 down 掉的话,site2 的客户端就会出现下面的错误。因为虽然 CAS2 不存在了,但是 CAS2 安装的时候生成的 SCP 在AD中依然存在,当客户端进行查询的时候,依然会得到 site2 SCP 的信息,并且这些信息指向 site2 的 CAS服务器,但是由于CAS2 已经联系不到了,所以,就会报出错误:

Autodiscover to https://ex02.momo.local/Autodisover/Autodiscover.xml FAILED (0x800C8203)

我们从下图中还可以看到客户端还试图去联系下面两个URL:

这两个URL是在 Outlook 中内定的 autodiscover URL,当SCP找不到时,就会试图联系这两个URL。

【图12:站点2中的 CAS  down掉时,客户端会报错】

 

 

 

如果我们想要避免这种情况,如果 CAS2 遇到了问题,站点2 的客户端能够使用 CAS1 的自动发现服务,我们可以使用cmdlet:

Set-ClientAccessServer CAS1 –AutoDiscoverSiteScope “site1”,"site2”

 

这样站点1 中的 CAS1 就可以同时为 site1 和 site2 提供服务了, 这个叫做 Site Affinity。在我的环境中 CAS1 就是 EX07SP2,site1 的名字是Default-First-Site-Name,所以我使用下面的 cmdlet:

【图13:Ex07SP2 同时为站点 site2 和 Default-First-Site-Name 提供自动发现服务】

 

这时候,我们就发现站点2 的客户端使用了站点1 的 CAS 服务器

【图14:站点2的客户端使用站点1 的自动发现服务】

 

 

 

三,Outlook 怎样寻找自动发现服务

 

1. 第一步永远是从AD中寻找 SCP 服务接入点。

2. 然后会去查找两个固定的URL

3.如果上面两个URL都失败了,那么Outlook 就会使用 HTTP redirect 方式进行查找

 

HTTP redirect 会试图访问 (注意,没有S)

这个方法一般适用于单域名证书,比如你的证书颁发给了 mail.domain.com 那么这个时候就不能通过 或者 来和自动发现服务通信 ,你可以新建一个website, 用户可以通过http://autodiscover.domain.com/autodiscover/autodiscover.xml 来访问,然后我们在IIS中对设置重定向,当用户访问 的时候,重定向到 这样就不需要多主机名证书(SAN Certificate)了。

 

4.如果以上都失败了,Outlook 还会查询DNS上的SRV记录来寻找自动发现服务。

 

只有打了补丁 KB 939184 或 SP1 的Outlook 2007 才有这项功能,详情看KB

 

如果是在域内,那么第一步寻找SCP都应该成功,所以 2,3,4 方法一般应用于 Internet 的用户访问。方法3 需要两个IP地址,方法4 必须要在公共的DNS上添加 SRV记录。

下图就显示第一步域外用户,第一步寻找SCP,不成功,然后就改用其它方式了。

【图15:Internet 用户使用 AutoDiscover 过程】

 

5. 其实前面4步都用光了,Outlook 还可以配置本地的 XML 文件,我们可以配置客户端的注册表键值:

[HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Outlook\Autodiscover] "contoso.com"="%PROGRAMFILES%\Microsoft Office\Office12\contoso.xml"

这样的配置会使用xml文件: %PROGRAMFILES%\Microsoft Office\Office12\contoso.xml

 

 

 

四,XML文件里有什么?

HTTP 的请求有两种方式 POST 和 GET, POST是被用来向服务器放东西的, GET是从服务器上拿东西. 当访问下面得URL时

使用的都是 POST, 也就是说先向服务器放东西, 放的是什么呢?用户的Email 地址:

我们用 IE 去访问这个XML文件会报错,就是因为IE访问是 GET, 然而自动发现需要你的信息,你没有给它,所以出现错误:

【图16:直接访问 XML 会报错】

 

而访问 时, 使用 GET ,(不是https, 是http, 因为这是个转向)

 

HTTP POST 内容:

 

<!-- REQUEST TO SERVER. In HTTP POST DATA -->

<?xml version="1.0" encoding="utf-8" ?>

<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006">

<Request>

<AcceptableResponseSchema>http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a</AcceptableResponseSchema>

<!-- EMailAddress: Optional

This tag indicates the user’s email address.

-->

<EMailAddress>JohnDoe@sample.com</EMailAddress>

</Request>

</Autodiscover>

 

服务器端再回应 POST 的时候,使用的动态的 XML,根据用户 Post 的信息来动态的生成 XML。但无论是动态的还是静态的,都有一个基本的架构,可以参考:

 

我们也可以使用Outlook端的测试电子邮件自动配置来查看得到的XML内容:

【图17:测试电子邮件自动配置查看XML】

 

我们可以根据XML,看看自动发现都提供了什么信息,有一些信息可能比较难猜,比如DeploymentID, 这个表示Exchange 组织的唯一值。如果需要可以到 MSDN 上去查

 

 

 

五,Outlook Provider

提到自动发现服务,不能不提 Outlook Provider, 因为这是为自动发现服务提供信息的组件。其实也是AD中的对象。

【图18:Outlook Provider 在AD中的位置】

 

这个组件为 自动发现服务提供信息,我们可以再XML中经常发现 Exch, ExPR 和 web 这三个符号,其实这就是Outlook Provider. 客户端从自动发现服务获取信息, 自动发现从 Outlook Provider 获取信息,OP从AD中获取信息。

【图19:Outlook Provider 为自动发现服务提供信息】

 

你可以使用cmdlet: Get-OutlookProvider 来查看他们的具体信息,可以使用 Set-OutlookProvider 来设定需要的值。

【图20:Get-OutlookProvider 】

EXCH:为RPC请求提供服务,也就是域内的用户

EXPR:为HTTP用户提供服务,Outlook Anywhere的用户

WEB:为用户提供最佳的OWA地址。

 

其中 EXPR 除了为 Outlook Anywhere 用户提供外部 URL 外(比如OAB URL等),它还提供 Proxy Server 和 CertPrincipalName. 如果你有多个站点,每个站点都连到 Internet,你可能将proxyserver 就要设置为 $null, 以便为不同站点的客户端提供不同的代理服务器,如果你使用了Mutual Authentication, 某些情况下你可能要将 CertPrincipalName 设置为 none.

【图21:EXPR 为Outlook Anywhere客户端提供额外的信息】

 

 

六,如何排错

在服务器端,我们可以利用 cmdlet: Test-OutlookWebServices 来检测自动发现是否能提供正确的信息:

【图22:Test-OutlookWebServices】

如果是Internet上的用户,怎么办呢?最简单的方法,利用网页工具 ExRCA (Exchange Remote Connectivity Analyzer)

 

如果发现了错误,我们可以到 TechNet 上去找相应错误的答案,上面已列出了ExRCA 检测到的N种错误对应的解决方法

转载地址:http://iungx.baihongyu.com/

你可能感兴趣的文章
后缀数组 3160 最长公共子串
查看>>
计算机IDE接口与SATA接口的区别
查看>>
PLSQL_基础系列05_视图控制WITH CHECK OPTION(案例)
查看>>
[开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [二] 基本使用
查看>>
高级软件工程师技术要求
查看>>
centos6.9(Linux系统)安装VMware tools教程
查看>>
oracle树结构查询
查看>>
博客园首弹
查看>>
求数组元素的最大值
查看>>
学习:C#无标题窗体移动
查看>>
ajax学习笔记1
查看>>
c#进制转换
查看>>
vs中常用的快捷键
查看>>
CSS3中border-image属性详解
查看>>
你得学会并且学得会的Socket编程基础知识(续)——Silverlight客户端(转)
查看>>
ubuntu下配置vim及插件
查看>>
paper 69:Haar-like矩形遍历检测窗口演示Matlab源代码[转载]
查看>>
ole辅助类-sqlhelper-access
查看>>
Http详解
查看>>
C#开发邮件收发(同步)
查看>>