什么是自动发现?
自动发现服务为 Exchange 客户端, 包括 MAPI 连接的Outlook 2007,手机 ActiveSync 和 Outlook Anywhere 提供自动配置的功能,并提供给Outlook访问基于 web 的脱机地址簿,忙闲信息,统一消息服务的信息
【图1:Outlook自动侦测用户名】
【图2:自动配置Outlook 2007】
Exchange 2007 中使用自动发现服务来为客户端提供这些信息,Outlook首先要做的就是找到自动发现服务的位置。
(sigh……, 不能免俗,也要用到微软这个图)
【图3:域内客户端使用自动发现服务】
基本的访问流程是这样的:
- 域内的 Outlook 首先去寻找SCP 服务接入点
- SCP会返回给Outlook 自动发现服务的URL
- Outlook使用 HTTPS 加密的连接连到自动发现服务
- 得到需要的信息
一,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: https://cas1.domain.local/autodiscover/autodiscover.xml
CAS2: https://cas2.domain.local/autodiscover/autodiscover.xml
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:
https://momo.local/autodiscover/autodiscover.xml
https://autodiscover.momo.local/autodiscover/autodiscover.xml
这两个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
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,不成功,然后就改用其它方式了。
【图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, 然而自动发现需要你的信息,你没有给它,所以出现错误:
【图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内容:
我们可以根据XML,看看自动发现都提供了什么信息,有一些信息可能比较难猜,比如DeploymentID, 这个表示Exchange 组织的唯一值。如果需要可以到 MSDN 上去查 Autodiscover XML Elements。
五,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)
www.testexchangeconnectivity.com
如果发现了错误,我们可以到 TechNet 上去找相应错误的答案,上面已列出了ExRCA 检测到的N种错误对应的解决方法