什么是自动发现?

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

image

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

image

【图2:自动配置Outlook 2007】

 

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

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

image

【图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

image

【图4:SCP在哪里】

 

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

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

image

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

 

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

image

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

 

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

image

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

image

【图8:更改后的URL】

 

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

 

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

 

 

 

二,Outlook 选择SCP信息

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

 

CAS1: https://cas1.domain.local/autodiscover/autodiscover.xml

CAS2: https://cas2.domain.local/autodiscover/autodiscover.xml

 

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

 

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

image

【图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 信息,如下图:

 

image

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

 

image 

【图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:

https://momo.local/autodiscover/autodiscover.xml

https://autodiscover.momo.local/autodiscover/autodiscover.xml

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

image

【图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:

image

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

 

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

image

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

 

 

 

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

 

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

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

https://domain.com/autodiscover/autodiscover.xml

https://autodiscover.domain.com/autodiscover/autodiscover.xml

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

 

HTTP redirect 会试图访问 http://autodiscover.domain.com/autodiscover/autodiscover.xml (注意,没有S)

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

 

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

 

只有打了补丁 KB 939184 或 SP1 的Outlook 2007 才有这项功能,详情看KB http://support.microsoft.com/?kbid=940881

 

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

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

image

【图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时

https://domain.com/autodiscover/autodiscover.xml

https://autodiscover.domain.com/autodiscover/autodiscover.xml

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

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

image

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

 

而访问 http://autodiscover.domain.com/autodiscover/autodiscover.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。但无论是动态的还是静态的,都有一个基本的架构,可以参考:http://technet.microsoft.com/en-us/library/cc511507.aspx#AutodiscoverXMLSchema

 

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

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

 

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

 

 

 

五,Outlook Provider

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

image

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

 

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

image

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

 

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

image

【图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.

image

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

 

 

六,如何排错

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

image

【图22:Test-OutlookWebServices】

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

www.testexchangeconnectivity.com

 

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

http://technet.microsoft.com/en-us/library/dd439364.aspx