自動發現服務是怎樣工作的?
自動發現服務爲 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 地址: [email protected]
我們用 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>[email protected]</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種錯誤對應的解決方法