瞭解 IIS 7.0 組態委派

Saad Ladki

簡介

IIS 針對其第七個產品版本引進全新的檔案型組態系統。 這個新系統強調適用于整個 Web 平臺的資料驅動系統,其中 ASP.NET、Indigo,甚至是協力廠商元件等技術都可以使用和擴充此組態存放區來存放任何網站或應用程式屬性。

系統會以簡單且清楚的格式所定義的 XML 檔案為基礎,其語法類似 ASP.NET web.config檔案。 這些組態檔會保留邏輯群組中的設定,而且對檔案所做的任何變更都會立即反映在正在修改其屬性的月臺或應用程式上。

這個新系統也提供委派的系統管理體驗,其中:系統管理員可能會允許網站和應用程式擁有者修改特定設定;而且,這些變更的影響僅限於有問題的特定網站或應用程式。 此模型引進 了獨立式應用程式 的概念,其中內容和組態設定都位於月臺或應用程式目錄中,而且可以從一部電腦部署到另一部電腦。

組態檔和組態架構

IIS 7.0 和更新版本具有名為 applicationHost.config%WINDIR%\System32\InetSrv\Config\ 中央組態檔。 此檔案會取代 IIS 6.0 用於其組態存放區的metabase.xml檔案。 這個新的組態系統非常簡單、以檔案為基礎,但功能非常強大。 沒有組態服務,因為不需要 IISADMIN。 每個背景工作進程都有組態讀取器元件的實例,並直接從檔案擷取組態。

此外,沒有組態的記憶體內部標記法。 一旦對檔案發出變更,背景工作進程會立即加以挑選,並反映在指定的月臺、應用程式或虛擬目錄上。

applicationHost.config檔案會裝載 IIS 和其他 Web 技術之不同功能和元件的全域設定。 此檔案中設定的任何屬性都會套用至機器中的所有網站、應用程式和虛擬目錄。

IIS 所使用的組態讀取器會瞭解每個組態區段、元素和屬性的格式、語法和正確命名,因為它們是在架構檔案中定義。 組態的架構定義于目錄中的檔案中 %WINDIR%\System32\InetSrv\Config\Schema\ 。 具現化組態系統時,背景工作進程會將架構讀取至記憶體,這可協助系統瞭解可供設定的屬性及其格式。 至少IIS_schema.xml、ASPNET_schema.xml和FX_schema.xml檔案位於此目錄中並定義適用于 IIS 的區段組態結構,ASP.NET 和.NET Framework功能。

架構會定義組態及其區段的數個層面,例如區段和屬性的命名、值的預期類型、這些值的範圍,或是其中任何一個是唯一或必要的。 此外,它也會定義特定屬性將採用的預設值。 在指定的案例中,屬性未定義于 applicationHost.config 中,其值取自架構檔案中所描述的預設設定。

除了這個中央檔案,applicationHost.config,數 個web.config 檔案可以出現在 URL 階層的任何層級。 這些檔案可以出現在月臺、應用程式、虛擬目錄,甚至是實體路徑層級。 這些檔案會定義屬性,其值會覆寫applicationHost.config中定義的全域設定。不過,這些變更僅適用于檔案出現的範圍,也就是針對指定網站、應用程式、虛擬目錄或web.config檔案所在的實體路徑。

組態階層和有效組態

除了applicationHost.config之外,IIS 也會使用 ASP.NET,這同時依賴 machine.config根web.config 檔案。 machine.config檔案會定義所有 Framework 功能所需的屬性。 根web.config檔案會定義針對所有 ASP.NET Web 應用程式所定義之屬性的全域設定。 這兩個檔案類似于 IIS 的applicationHost.config。 這三個檔案存在,因為.NET Framework和 IIS 版本分開。 在具有單一 IIS 版本的指定 Windows Server 系統中,可以安裝多個版本的 Framework。

因此,系統會針對系統的組態設定定義和計算組態階層。 階層會從machine.config開始,然後繼續進行根web.config檔案,後面接著applicationHost.config。然後,任何位於月臺、應用程式或虛擬目錄層級的選擇性web.config檔案,會新增並套用至階層。 最後,如果指定路徑有任何) ,則屬性會從父檔案繼承至子檔案machine.config到最後一個web.config檔案 (。

繼承行為預設為完成。 階層中較低層級的任何設定會覆寫在目前層級上方檔案中定義的父設定。 不過,進一步向下進行階層,設定的範圍會受到限制。 其中作為machine.config,根目錄web.config和applicationHost.config檔案的設定會套用至系統中的所有內容,選擇性web.config檔案的設定只會套用至目前的位置,而以下 (是月臺、應用程式或虛擬目錄) 。

組態區段

在組態檔中,可能會有可讀取和設定的設定。 這些設定會以結構化方式分組。 類似或適用于特定功能的多個設定 (,也就是 ASP、驗證、ISAPI 等) 會分組在稱為組 態區段的邏輯單元區塊中。 每個組態區段都可以包含其中的其他組態區段,但最常定義元素、集合或屬性。

組態專案是定義多個組態屬性的 XML 專案。 組態集合是組態專案的特殊案例,其中包含使用 add/remove/clear 組態指示詞所定義的專案清單。 最後,組態屬性是代表 XML 屬性的分葉組態設定。

下列程式碼片段顯示defaultDocument > 區段的 <設定。 啟用的字組是一個屬性,其中檔案單字是元素,其中包含add指示詞和一系列屬性所定義的其他元素清單。

<defaultDocument enabled="true"> 
    <files> 
        <add value="Default.htm" /> 
        <add value="Default.asp" /> 
        <add value="index.htm" /> 
        <add value="index.html" /> 
        <add value="iisstart.htm" /> 
        <add value="default.aspx" /> 
    </files> 
</defaultDocument>

此組態區段具有相關聯的架構。 下列程式碼片段顯示檔案中 defaultDocument > 區段的架構 < IIS_schema.xml。 架構會定義區段的名稱,以及它出現在 (的命名空間,在此案例中為 system.webServer) 。 此外,架構也會描述屬性和元素,以及每個名稱、類型、預設值和其他有趣的資料。

<sectionSchema name="system.webServer/defaultDocument"> 
    <attribute name="enabled" type="bool" defaultValue="true" /> 
    <element name="files"> 
      <collection addElement="add" clearElement="clear" removeElement="remove" mergeAppend="false"> 
        <attribute name="value" type="string" isUniqueKey="true"/> 
      </collection> 
    </element> 
</sectionSchema>

特殊區段: < configSections>

<configSections> 態區段是在 applicationHost.config中定義的特殊區段。它會作為 IIS 伺服器的組態區段的登錄點。 本節是註冊系統中目前可用的組態區段。 在指定的案例中,組態系統已擴充,而且自訂區段會新增至伺服器,則必須藉由將元素專案新增至此區段來註冊。

下列程式碼片段顯示 <configSections> defaultDocument > 區段的專案 < 。 為了清楚起見,已省略其他專案。 的 <configSections> 有趣部分是定義每個區段的命名空間的區段群組專案,在此案例中為 system.webServer 和 overrideModeDefault 屬性的值,此區段的值為 「Allow」。 由於未宣告 allowDefinition,因此會取自架構,預設值為 「Everywhere」。

<configSections> 
    <sectionGroup name="system.webServer"> 
        <section name="defaultDocument" overrideModeDefault="Allow" />
    </sectionGroup>
</configSections>

除了定義區段及其區段群組之外,還有兩個已定義的索引鍵屬性: overrideModeDefaultallowDefinition

overrideModeDefault 屬性是選擇性屬性,可定義區段的鎖定狀態。 其可用值為 AllowDeny。 預設值為 「Allow」。 所有與伺服器效能、安全性或重要層面相關的 IIS 區段都會鎖定,並將此屬性設定為 「拒絕」。 如果 overrideModeDefault 屬性設定為 「Deny」,則較低層級的任何組態檔 (亦即,web.config檔案) 為特定組態區段設定屬性的值,將無法生效並覆寫全域值。 這會在鎖定違規中產生,併發生錯誤。

allowDefinition 屬性是另一個選擇性屬性,可定義區段的階層層級,而且可以設定屬性。 如果其值為 MachineOnly,則區段只能在 applicationHost.config 或 machine.config 中設定。如果其值為 MachineToRootWeb,則可以在 MachineOnly 檔案或根web.config中設定區段。如果其值為 MachineToApplication,則可以在前三個檔案中設定區段,也可以在應用程式根資料夾中的web.config檔案中設定。 最後,如果其值為 Everywhere (這是預設) 則可以在任何組態檔中設定,無論是全域影響組態的組態,還是套用至指定月臺、應用程式或虛擬目錄的web.config檔案。

位置的概念

組態階層的指定檔案中指定的任何設定都會套用至該層級和以下層級,而且子檔案可能會覆寫。 不過,您可以使用 位置 標籤搭配 path 屬性,來指定和套用組態設定至目前組態檔下的特定路徑。 如果組態檔applicationHost.config,位置標籤可以包含路徑,範圍從系統中的所有月臺、應用程式和虛擬目錄到特定月臺、應用程式、虛擬目錄或檔案。 位置標籤也可以在web.config檔案中指定,而且它可以包含目前月臺、應用程式或虛擬目錄下路徑的任何相對路徑。

下列程式碼片段示範如何指定要僅適用于開發人員網站的組態屬性。 這也可以透過網站內容中的web.config檔案來達成。 開發人員網站的有效組態會是 applicationHost.config 中檔案集合的專案清單,以及網站的位置路徑和任何web.config檔案。

<location path="Developer Site" overrideMode="Allow"> 
    <defaultDocument enabled="true"> 
        <files> 
            <add value="Developer.htm" /> 
        </files> 
    </defaultDocument> 
</location>

如果未宣告路徑,這相當於指定點 (.) ,則路徑會從這個層級和下方瞭解到所有子路徑。 在applicationHost.config也會指定全域層級的組態。

可以在位置標籤中定義的屬性是 overrideMode。 如同 overrideModeDefault,這會指定指定的組態區段是否可在階層的較低層級編輯和覆寫目前位置標記中所設定的屬性。

鎖定和解除鎖定區段

您可以透過 區段中的 overrideModeDefault 標籤 <configSections> 來鎖定區段的初始概念,並加以擴充以更精細。 藉由允許在層級覆 <configSections> 寫區段,區段會開啟,而且其值可由系統中的任何人透過 URL 命名空間的任何層級web.config檔案覆寫。 不過,這可能會造成嚴重的安全性風險,而且可能會對系統的可用性或效能造成負面影響。 透過位置標記,使用者可以使用 overrideMode 屬性,並指定區段的鎖定狀態,並針對指定的路徑加以限制。

下列程式碼片段示範如何解除鎖定 <windowsAuthentication> 系統中所有網站、應用程式和虛擬目錄的 區段。 做法是在 overrideModeDefault 屬性中設定 「Allow」。 這種方法的缺點是,它會解除鎖定每個人的區段,且任何人都可以透過web.config檔案覆寫其網站或應用層級的設定。

<section name="windowsAuthentication" overrideModeDefault="Allow" />

下列程式碼片段示範如何達成相同的動作、解除鎖定 <windowsAuthentication> 區段,但僅適用于 AdministratorSite,以便透過月臺 AdministratorSite 層級的web.config檔案修改該區段的屬性。 系統中的其他月臺具有鎖定 <windowsAuthentication> 區段的預設行為。 這可透過 overrideMode 屬性來完成。

<location path="AdministratorSite" overrideMode="Allow"> 
   <security> 
        <authentication> 
            <windowsAuthentication enabled="false"> 
                <providers> 
                    <add value="Negotiate" /> 
                    <add value="NTLM" /> 
                </providers> 
            </windowsAuthentication> 
        </authentication> 
   </security> 
</location> 
 
The location tag path can be specified here a site, application or even a virtual directory to which the administrator wants to unlock configuration and/or apply configuration at that level.

可以達到相反的行為,這是鎖定特定網站的區段,而其餘的系統可以編輯它。 例如,defaultDocument > 是一個區段, < 其 overrideModeDefault 屬性設定為區段中的 「Allow」 <configSections> ,但透過位置標籤,我們可以鎖定基本網站的本節。 下列程式碼片段示範如何完成此作業,同時設定 ,讓系統接受的唯一值做為伺服器的預設頁面,如首頁標題為 basic.htm。 clear 指示詞會從組態階層中的上述層級,為任何繼承的值,在此情況下是來自 applicationHost.config 的檔案全域清單。

<location path="Basic Site" overrideMode="Deny"> 
    <defaultDocument enabled="true"> 
        <files> 
       </clear> 
            <add value="basic.htm" /> 
        </files> 
    </defaultDocument> 
</location>

細微鎖定

透過位置標籤開啟區段是解除鎖定區段及其所有屬性的有效方式,適用于指定路徑之網站或應用程式的擁有者。 這在讓網站和應用程式擁有者可以無限制地存取區段時,作用中是無條件的方法。 不過,有時候系統管理員想要特定控制區段中的特定屬性,並想要控制特定值。 其他人可以委派。 這是細微鎖定的所在位置。

細微鎖定是可在專案或其他屬性上設定的特定屬性群組。 細微鎖定可以宣告目前路徑下方的路徑是否可以修改組態值。 可以讀取值,但如果已設定鎖定,就無法編輯或甚至宣告這些值。 請勿編輯已設定鎖定的值,因為這樣會導致設定鎖定違規錯誤。

細微鎖定群組中的第一個屬性是 lockAttributes。 lockAttributes 會定義以逗號分隔的屬性清單,這些屬性會鎖定在目前組態層級下方的路徑。 它也接受星號 (*) 作為其值,這表示所有屬性都會鎖定。 此時,組態區段可以在子層級路徑中讀取,甚至是鎖定的屬性,但編輯受保護的屬性會導致錯誤。

下列程式碼片段示範如何鎖定開發人員網站的 defaultDocument > 區段已啟用狀態 < 。 如果開發人員網站的擁有者停用預設檔功能,或甚至宣告屬性的值與位置標籤中所陳述的值相同,就會發生鎖定違規。

<location path="Developer Site" > 
    <defaultDocument enabled="true" lockAttributes="enabled" /> 
</location>

細微鎖定群組中的第二個屬性是 lockElements。 lockElements 會定義以逗號分隔的元素清單,這些元素會鎖定在目前組態層級下方的路徑。 如同 lockAttributes,它也接受星號 (*) 作為其值,這表示所有元素都會鎖定。 這非常適用于具有多個元素或集合且必須保護子層級路徑的組態區段。 同樣地,編輯任何鎖定的值會導致錯誤。

下列程式碼片段示範如何鎖定開發人員網站的檔案集合。 這會讓網站擁有者決定是否啟用預設檔功能;但是,如果啟用,它就無法修改全域值,並繼承電腦系統管理員在applicationHost.config中陳述的內容。

<location path="Developer Site"> 
    <defaultDocument enabled="true" lockElements="files" > 
        <files> 
            <add value="Developer.htm" /> 
        </files> 
    </defaultDocument> 
</location>

lockElement 範例在集合中也很有用,可鎖定這類集合的 指示詞 。 指示詞是 新增、移除、清除 集合等關鍵字。 藉由鎖定 指示詞,系統管理員可以微調集合清單是否可用於新增或移除特定或所有元素。

下列程式碼片段示範如何鎖定檔案集合中目前專案的移除和清除。 如有需要,網站擁有者可以將新專案新增至檔案集合。 如果網站擁有者指定清除標籤或嘗試移除專案,就會發生鎖定違規。

<location path="Developer Site"> 
    <defaultDocument enabled="true" > 
        <files lockElements="clear,remove"> 
            <add value="Developer.htm" /> 
        </files> 
    </defaultDocument> 
</location> 
 
Besides lockAttribute and lockElement, there are negative counterparts: lockAllAttributesExcept, and lockAllElementsExcept. These attributes achieve  the inverse action of the previous ones in which the comma-separated list declares the attributes and elements to be unlocked while the rest are not  available to be edited in child paths.

另外還有 lockItem 屬性。 這會鎖定屬性,並在 XML 屬性層級運作。 下列程式碼片段顯示網站管理員如何執行想要執行的任何動作,例如新增或移除集合中的專案,但修改檔案集合中的basic.htm專案。

<location path="Developer Site"> 
    <defaultDocument enabled="true" > 
        <files> 
            <add value="basic.htm" lockItem="true"/> 
        </files> 
    </defaultDocument> 
</location>

總結

本檔概述組態系統、其檔案、架構和委派功能的基本概觀。 它也會討論群組態階層和有效組態。 本文也介紹組態區段及其專案和屬性的結構。 其示範位置、鎖定和細微鎖定的概念。

整體來說,IIS 引進和新的檔案型組態系統,其中包含集中組態檔中的所有組態,或透過月臺和應用程式系統管理員能夠修改套用至其應用程式和內容之屬性的web.config檔案散發。 透過分散式組態模型,獨立式應用程式的概念包括內容和組態設定都儲存在月臺或應用程式目錄中,而且可以從一部電腦部署至另一部機器的x 複本