自動發現服務是怎樣工作的?

自動發現服務是怎樣工作的?

自動發現服務爲 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 地址: [email protected]

我們用 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>[email protected]</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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章