次の方法で共有


構成の拡張性

公開日: 2007 年 12 月 5 日 (作業者: IIS Team (英語))

更新日: 2008 年 4 月 6 日 (作業者: IIS Team (英語))

はじめに

IIS 7 では、ランタイムとすべてのコア管理ツールが使用する、まったく新しい構成システムが導入されています。この構成システムは、IIS、ASP.NET、その他のコンポーネントの構成が格納された分散 xml ファイルを基盤としています。この構成システムに備わる柔軟性によって、サーバー レベル、サイト レベル、アプリケーション レベルなど、さまざまなレベルで構成を設定できます。サイト レベルおよびアプリケーション レベルの構成を、web.config ファイルの ASP.NET の構成と共存させることができます。

新しい構成システムの特長の 1 つに、構成の拡張が容易なことが挙げられます。簡単な変更を加えるだけで、独自の構成セクションを直接構成システムに統合し、既存の管理 API を使用してこれらの設定を操作できます。構成を拡張する場合は、XML スキーマ ファイルで新しい構成セクションを定義し、IIS 7 スキーマ ディレクトリ (%windir%\system32\inetsrv\config\schema) に配置します。また、新しい構成セクションを IIS 7 グローバル構成ファイルに登録する必要があります。

この記事では、基本的な構成の拡張性の例と、いくつかのより高度なシナリオを使って説明を進めます。この例は説明のために作成したものですが、構成の拡張性の強力さは十分理解いただけるはずです。

必要条件

この記事の手順を実行するには、多くの必要条件があります。必要条件として以下のものがあります。

  1. IIS 7 が既定の状態でインストールされていること。IIS 7 がインストールされていない場合は、サーバー マネージャーを開き、Web サーバー (IIS) の役割を追加して、インストールを行ってください。
  2. .NET Framework SDK がインストールされていること。この SDK がインストールされていない場合は、https://www.microsoft.com/downloads から入手してください。
  3. SDK の bin ディレクトリにあるさまざまなツールを使用すること。[スタート] メニューから SDK のコマンド プロンプトを使用するか、bin ディレクトリをパスに追加します (%systemdrive%\Program Files\Microsoft.NET\SDK\v2.0\Bin など)。
  4. コマンドはすべて昇格した特権のコマンド プロンプトから実行すること。[スタート] メニューの [SDK コマンド プロンプト] (または [コマンド プロンプト]) を右クリックし、[管理者として実行] をクリックします。

構成の拡張性 - 基本

概要

カスタム ログ モジュールの例を使って、基本的な構成の拡張機能を紹介します。このモジュール自体はなんら特別なものではなく、その機能としては、組み込みの IIS 7 ログ イベント LogRequest を処理し、ログ エントリをディスク上のファイルに書き込むだけです。これは、IIS 7 のログ記録の基本バージョンと考えることができます。

モジュールが情報のログを記録する場所を指定するために、構成を拡張する必要があります。このモジュール用に、その構成 (この場合はログ ファイルの場所) を格納するカスタム構成セクションを作成します。

手順 1 - スキーマ ファイル

新しい構成セクションを追加するには、最初にセクションの定義を行います。XML 形式でセクション スキーマを定義し、そのファイルを %windir%\system32\inetsrv\config\schema ディレクトリに置きます。

simpleLogging_Schema.xml という名前の XML ファイルを作成し、次の内容を追加します。

<configSchema>
    <sectionSchema name="system.webServer/simpleLogging">
        <attribute name="logfileDirectory" type="string"
            defaultValue="%systemdrive%\inetpub\logs\simpleLogs" expanded="true" encrypted="false" />

    </sectionSchema>
</configSchema> 

前出のスキーマは 2 つの処理を行います。第一に、<sectionSchema> 要素を使用して、"simpleLogging" という名前の新しい構成セクションを定義します。第二に、"logfileDirectory" という名前の新しい構成セクションの属性を定義します。

このスキーマ ファイルから、属性は文字列であり、構成システムでは暗号化されないことがわかります。*expanded="true"*の記述によって、構成システムに対して、環境変数を使用時に自動的に展開するよう指示します。%windir%\system32\inetsrv\config\schema ディレクトリにファイルを作成していなかった場合は、このディレクトリにファイルを移動します。

次に、"logfileDirectory" 属性で指定した既定のディレクトリがコンピューター上にまだ存在しないので、このディレクトリを作成します。コマンド ラインから次のコマンドを実行してディレクトリを作成します。

md %systemdrive%\inetpub\logs\simpleLogs

手順 4. で作成する SimpleLogging モジュールがログ ファイルをこのディレクトリに書き込めるように、Windows グループ IIS_IUSRS に、このディレクトリに対する書き込みアクセス許可を割り当てます。コマンド ラインで次のコマンドを実行します。

icacls %systemdrive%\inetpub\logs\simpleLogs /grant BUILTIN\IIS_IUSRS:RW

スキーマの詳細

手順 1. の説明はこれで終わりですが、スキーマ ファイルについても説明しておきます。前述のスキーマでは、system.webServer の下に新しい構成セクション simpleLogging を作成して、カスタム属性を指定しました。コレクション、要素、属性を使用することで、より複雑なカスタム構成を簡単に作成できます。次の表に例をいくつか示しますが、IIS 7 の構成のスキーマ ファイルを眺めるのが最も参考になります。スキーマ ファイルは、%windir%\system32\inetsrv\config\schema\IIS_schema.xml にあります。

種類

スキーマ情報および例

属性

<attribute
name="" [String, Required] [XML name of the attribute]
type="" [bool|enum|flags|uint|int|int64|string|timeSpan, Required] [Runtime type]
required="false" [bool] [Indicates if it must be set]
isUniqueKey="false" [bool] [Serves as the collection key]
isCombinedKey="false" [bool] [Part of a multi-attribute key]
defaultValue="" [String] [Default value or comma-delimited flags]
encrypted="false" [bool] [Indicates if the value persisted is encrypted]
expanded="false" [bool] [Environment variables are expanded when read]
allowInfinite="false" [bool] [Indicates if "Infinite" can be set]
timeSpanFormat="string" [string|seconds|minutes] [hh:mm:ss or number]
validationType="" [See validation below]
validationParameter="" [See validation below]
/>

例:

<configSchema>
  <sectionSchema name="system.webServer/simpleLogging">
  <attribute name="logfileDirectory" type="string" />
  </sectionSchema>
</configSchema>  

要素

<element
 name="" [String, Required] [XML name of the element]
 isCollectionDefault="false" [bool] [Indicates if default values are held for other elements in this collection] />   
 

例:

<configSchema>
  <sectionSchema name="system.webServer/simpleLogging">
    <element name="logfile">
      <attribute name="fileLocation" type="string" />
    </element>
  </sectionSchema>
</configSchema>

コレクション

<collection
addElement="" [String] [Name of Add directive, if supported]
removeElement="" [String] [Name of Remove directive, if supported]
clearElement="" [String] [Name of Clear directive, if supported]
defaultElement="" [applicationDefaults|applicationPoolDefaults|siteDefaults|virtualDirectoryDefaults]
mergeAppend="true" [bool] [Indicates whether or not deepest set values are appended]
allowDuplicates="false" [bool] [Indicates if multiple elements may have the same key]
allowUnrecognizedAttributes="false" [bool] [Indicates if non-schema attributes are ok]
/>

例:

<sectionSchema name="system.webServer/simpleLogging">
    <collection addElement="add">
      <attribute name="logfileDirectory" type="string" />
    </collection>
  </sectionSchema>
</configSchema>

手順 2 - 新しいセクションの登録

新しいセクションの定義が完了したので、次に、このセクションを構成システムに登録します。%windir%\system32\inetsrv\config\applicationHost.config ファイルに新しいセクションを登録します。ファイルを開き、次のように simpleLogging セクションを登録します。

<configSections>
    ...
    <sectionGroup name="system.webServer">
        <section name="simpleLogging"/>
        ...
    </sectionGroup>
</configSections> 

これで手順は終わりです。セクションの定義と登録が完了しました。

セクションが正しく登録されていることを確認するには、コマンド ラインから次のコマンドを実行します。

%windir%\system32\inetsrv\appcmd list config –section:system.webServer/simpleLogging

作業がすべて正しく行われている場合は、構成セクションが次のように表示されます。

<system.webServer>
    <simpleLogging />
</system.webServer> 

手順 3 - 構成の設定

セクションの登録が完了したので、他の構成の場合と作業と同じように、web.config ファイル、または %windir%\system32\inetsrv\ ディレクトリの appcmd.exe ツールを使用して構成を設定します。構成 API を使用して構成を設定することもできます。別の選択肢として、新しい IIS 7 管理 UI によって構成を設定できます。これには、UI モジュールを作成し、構成 API を呼び出して構成を設定します。

ここでは、既定の IIS 7 Web サイト用の新しい web.config ファイルに構成を追加します。既定の IIS 7 Web サイトは、%systemdrive%\inetpub\wwwroot\ にインストールされており、既定の IIS 7 の構成では "Default Web Site" という名前が付けられています。web.config という名前のファイルを作成し、次の内容を追加します。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <simpleLogging logfileDirectory="%systemdrive%\inetpub\logs\simpleLogs" />
    </system.webServer>
</configuration> 

同様の処理をするために、コマンド ラインから次のコマンドを実行することもできます。

%windir%\system32\inetsrv\appcmd set config "Default Web Site" –section:system.webServer/simpleLogging
                                    /logfileDirectory:""%"systemdrive"%"\inetpub\logs\simpleLogs"

次のコマンドを実行して、"Default Web Site" の構成の一覧を表示します。

%windir%\system32\inetsrv\appcmd list config "Default Web Site" –section:system.webServer/simpleLogging

次のように出力されます。

<system.webServer>
    <simpleLogging logfileDirectory="%systemdrive%\inetpub\logs\simpleLogs" />
</system.webServer> 

注: "logfileDirectory" 属性に指定したディレクトリが存在しない場合は、ここで作成します。次の手順で作成する SimpleLogging モジュールがログ ファイルをこのディレクトリに書き込めるように、Windows グループ IIS_IUSRS に、このディレクトリに対する書き込みアクセス許可を割り当てます。前述の手順 1. で、既定のディレクトリに対する適切なアクセス許可を割り当てるコマンドを紹介しました。別のディレクトリを作成していた場合は、このコマンドを流用してください。

手順 4 - SimpleLogging モジュール

これまで、カスタム構成セクション simpleLogging を使用して構成システムの拡張を進めてきました。最後に、モジュールを作成し、モジュールからカスタム構成を使用する方法を紹介することで、基本的な構成の拡張についての説明を終えたいと思います。

ここでは、IIS 7 のすべての Web サイトで使用できる、厳密に型指定された .NET アセンブリを作成します。ここでは、.NET SDK に含まれる一部のツールを使用します。SDK がインストールされていない場合は、Web サイト (www.microsoft.com/downloads) からダウンロードしてください。

必要な手順は次のとおりです。

  1. 作業用のディレクトリを作成して、開きます。

  2. SimpleLoggingModule.cs ファイルを作成し、テキスト エディターを使用して次のコードを追加します。

    using System;
    using System.Web;
    using System.Web.Hosting;
    using System.IO;
    using Microsoft.Web.Administration;
    
    namespace ConfigurationExtensibility
    {
        public class SimpleLoggingModule : IHttpModule
        {
            private string GetlogfileDirectory(HttpContext context)
            {
                ConfigurationSection section = WebConfigurationManager.GetSection(
                        context, "system.webServer/simpleLogging");
                return (string)section["logfileDirectory"];
            }
    
            public void Init(HttpApplication context)
            {
                context.LogRequest += new EventHandler(LogRequest_EventHandler);
            }
    
            private void LogRequest_EventHandler(object sender, EventArgs e)
            {
                HttpApplication application = (HttpApplication)sender;
                LogRequest(application.Context);
            }
    
            private void LogRequest(HttpContext context)
            {
                string logfileDirectory = GetlogfileDirectory(context);
    
                if (Directory.Exists(logfileDirectory) == false)
                {
                    Directory.CreateDirectory(logfileDirectory);
                }
    
                string logfile = Path.Combine(logfileDirectory, DateTime.Now.ToString("yyyyMMdd") + ".log");
                string ogline = string.Format("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}",
                        DateTime.Now,
                        context.Request.HttpMethod,
                        context.Request.UserHostAddress,
                        context.Request.Url.ToString(),
                        context.Request.ServerVariables["LOGON_USER"],
                        context.Request.UserAgent,
                        context.Response.StatusCode,
                        HostingEnvironment.SiteName);
            File.AppendAllText(logfile, ogline + Environment.NewLine);
            }
    
            public void Dispose()
            {
            }    
        }
    }
    
  3. このモジュールを厳密な名前のモジュールに変換して、IIS 7 のすべての Web サイトで使えるグローバル モジュールを作成します。これには、まず最初に、厳密な名前のキー ファイルを作成します。コマンド プロンプトを開き、SimpleLoggingModule.cs ファイルが保存されているディレクトリに移動します。次に、以下のコマンドを実行します (.NET Framework SDK の bin ディレクトリがパスに含まれている必要があります)。

    sn.exe /k keyFile.snk
    

    このコマンドが正しく実行されると、sn.exe によって "Key pair written to keyFile.snk" のような出力が表示されます。

  4. ファイルをコンパイルし、DLL を作成します。コマンド プロンプトで次のコマンドを実行します。

    %windir%\Microsoft.NET\Framework\v2.0.50727\csc.exe /t:library SimpleLoggingModule.cs /r:System.Web.dll
                       /r:%windir%\system32\inetsrv\Microsoft.Web.Administration.dll /keyfile:keyFile.snk
    
  5. 次に、コンパイルしたアセンブリ (SimpleLoggingModule.dll) をグローバル アセンブリ キャッシュに配置します。コマンド プロンプトで次のコマンドを実行します。

    gacutil.exe /i SimpleLoggingModule.dll
    
  6. ここで、モジュールを IIS 7 で利用可能なモジュールの一覧に追加する必要があります。ただし、その前に、作成したアセンブリの完全な名前を取得する必要があります。コマンド ラインで次のコマンドを実行します。

    gacutil.exe /l SimpleLoggingModule
    

    次のような情報が出力されます。

    SimpleLoggingModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=652a8d02f48e4288, processorArchitecture=MSIL
    
  7. モジュールを IIS 7 で利用可能なモジュールの一覧に追加します。次に示すコマンドを実行します。ただし、変数の部分は、最後に実行したコマンドの出力に置き換えてください。

    %windir%\system32\inetsrv\appcmd add module /name:"SimpleLoggingModule"
    /type:"ConfigurationExtensibility.SimpleLoggingModule, SimpleLoggingModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=652a8d02f48e4288"
    

    必要な構成エントリが、IIS 7 のグローバル構成ファイルである applicationHost.config に追加されます。

  8. これで手順が完了しました。カスタム構成を使用するカスタム モジュールがセットアップされました。後はモジュールをテストするだけです。ブラウザーを起動して、https://localhost/ にアクセスします。次のページが表示されます。

    Ff454022.241_1(ja-jp,TechNet.10).jpg

    エラーが表示された場合は、このディレクトリに対する書き込みアクセス許可が IIS_IUSRS グループに付与されていることを確認します。

    %systemdrive%\inetpub\logs\simpleLogs (または構成で使用したディレクトリ) を開き、現在の日付の .log ファイルを探します。このファイルを開くと、次のような内容が表示されます。

    Ff454022.241_2(ja-jp,TechNet.10).jpg

    試しに、構成に変更を加えて、正しく機能することを確認します。web.config ファイルの simpleLogging セクションを削除して、ログが既定の場所に保存されるかどうかを確認します (ASP.NET ユーザーが適切なアクセス許可を持っている必要があります)。

注: 作成したモジュールは、説明のための使用のみを目的としています。運用環境では使用しないでください。複数の要求が同時にログ エントリを書き込もうとすると、エラーが発生します。

構成の拡張性 - さらに高度なシナリオ

概要

前のセクションでは、構成の拡張性の基本的な事項として、スキーマを使用した単純な構成の拡張について説明しました。構成の拡張では、さらに強力な機能を利用できます。

第一に、構成を拡張して、COM オブジェクトを使用して構成を取得できるようにすることができます。これにより、構成 API で読み取れるかどうかを心配せずに、いつでも自由に構成情報を保存できます。

第二に、構成の操作や処理を行うメソッドを定義し、既存の構成 API を使用して呼び出すことができます。この 2 つの機能は、カスタム構成拡張機能の作成を強力にサポートします。

ここでは、まず、この記事の前半で扱ったカスタム構成 simpleLogging を修正して、COM コンポーネントを使って構成値を取得できるようにする手順を説明します。次に、COM コンポーネントによってアクションが実行される構成メソッドを追加する手順を説明します。

構成の拡張 - COM によってサポートされる属性

ここでは、スキーマを拡張して、"logfileCount" という名前の属性を作成します。.NET アセンブリ (マネージ DLL: C# で作成) でサポートされるこの構成属性は、ログ ディレクトリ内のログ ファイルの数をカウントします。この例は説明のために作ったシナリオですが、役に立つ場合があります。

: .NET コンポーネントを作成する必要はありません。有効な COM コンポーネントならばどれでも使用できます。

手順 1 - .NET COM コンポーネントの作成と登録

まず、.NET COM コンポーネントを作成します。作成するファイルと構築するコンポーネントの格納先のディレクトリを作成して、開きます。

作成するコンポーネントには、IIS 7 構成システムで COM を通じて公開するインターフェイスを実装する必要があります。.NET コンポーネントから COM インターフェイスを使用するには、相互運用 DLL を作成する必要があります。これによって、IIS 7 構成システムは、コンポーネントと通信して logfileCount 属性の値を取得できるようになります。相互運用 DLL を作成するには、.NET Framework SDK の tlbimp.exe ツールを使用します。この記事では、Visual Studio または .NET SDK がインストールされていることを前提としています。.NET SDK がインストールされていない場合は、www.microsoft.com/downloads からダウンロードしてください。

.NET COM コンポーネントを作成する手順を以下に示します。

  1. コマンド ライン プロンプトを開き、ファイルの格納先として作成したディレクトリに移動します。.NET Framework の bin ディレクトリがパスに含まれていることを確認し、コマンド ラインで次のコマンドを実行します。

    tlbimp %windir%\system32\inetsrv\nativerd.dll /keyfile:keyFile.snk
    

    tlbimp.exe ツールによって、AppHostAdminLibrary.dll という名前のファイルが作成されます。この相互運用 DLL が必要になります。

  2. 先ほど作成したディレクトリで ConfigurationExtensibility.cs ファイルを作成し、テキスト エディターを使用して、次の C# コードをこのファイルにコピーします。

    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    using AppHostAdminLibrary;
    
    namespace ConfigurationExtensibility
    {
        [ComVisible(true)]
        public class SimpleLoggingExtension : IAppHostPropertyExtension
        {
            public void ProvideGetProperty(IAppHostElement pElement, IAppHostProperty pProperty)
            {
                switch(pProperty.Name)
                {
                case "logfileCount":
                string logDirectory = (string) pElement.Properties["logfileDirectory"].Value;
    
                if(Directory.Exists(logDirectory))
                pProperty.Value = Directory.GetFiles(logDirectory, "????????.log").Length;
                else
               pProperty.Value = 0;
                break;
            }
            }
        }
    }
    

    : IAppHostPropertyExtension インターフェイスを実装しているクラスがあります。このコードの処理は、logfileDirectory 属性を読み取ってログ ファイルのディレクトリを取得し、SimpleLoggingModule が作成したログ ファイルの内、ファイル名のパターンに一致するすべてのファイルをカウントするだけです。

  3. コマンド ラインから次のコマンドを実行してコンポーネントをビルドします。

    %windir%\Microsoft.NET\Framework\v2.0.50727\csc.exe /t:library /r:AppHostAdminLibrary.dll
                        ConfigurationExtensibility.cs /keyfile:keyFile.snk
    

    これで、.NET COM コンポーネント ConfigurationExtensibility.dll が完成しました。

  4. 作成したマネージ COM コンポーネントを登録します。コマンド プロンプトで次のコマンドを実行します。

    %windir%\Microsoft.NET\Framework\v2.0.50727\regasm.exe /register /codebase ConfigurationExtensibility.dll
    

これによって、COM コンポーネントがレジストリに登録されます。これで、構成システムで使用できる .NET COM コンポーネントの作成および登録が完了しました。

手順 2 - スキーマ ファイルの更新

次に、前に作成した simpleLogging_Schema.xml ファイルを変更します。ファイルを開き、次のように変更します (新しい属性を太字で示しています)。

<configSchema>
    <sectionSchema name="system.webServer/simpleLogging">
        <attribute name="logfileDirectory" type="string"
             defaultValue="%systemdrive%\inetpub\logs\simpleLogs\" expanded="true" encrypted="false" />
        <attribute name="logfileCount" type="int" extension="ConfigurationExtensibility.SimpleLoggingExtension" />
    </sectionSchema>
</configSchema> 

手順 3 - テスト

すべての機能が正しく動作しているはずです。後は、テストを行うだけです。単純なスクリプトを使って、拡張機能をテストします。SimpleLoggingTest.vbs ファイルを作成して、次のテキストを入力します。

Dim adminManager, section
Set adminManager = WScript.Createobject("Microsoft.ApplicationHost.AdminManager")
Set section = adminManager.GetAdminSection("system.webServer/simpleLogging",
                    "MACHINE/WEBROOT/APPHOST/Default Web Site")
WScript.Echo(section.Properties.Item("logfileCount").Value)

この時点では、前に SimpleLoggingModule をテストした際のログ ファイルが 1 つ存在しているだけのはずです。コマンド ラインから前述のスクリプトを実行します。"1" と出力されます。

構成の拡張 - COM によってサポートされるメソッド

最後に、この記事では、メソッドによる構成の拡張について説明します。構成メソッドを呼び出すことで、構成システムは、構成の変更やログ ファイルの削除などの処理を行うことができます。この例では、SimpleLoggingModule によって作成されたすべてのログ ファイルを削除するメソッドを追加します。

手順 1 - コード

  1. 最初に、メソッドに必要なコードを追加します。前に作成した ConfigurationExtensibility.cs ファイルを開き、次のように更新します (新しいコードは太字で示しています)。

    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    using AppHostAdminLibrary;
    
    namespace ConfigurationExtensibility
    {
        [ComVisible(true)]
        public class SimpleLoggingExtension : IAppHostPropertyExtension, IAppHostMethodExtension 
        {
            public void ProvideGetProperty(IappHostElement pElement, IappHostProperty pProperty)
            {
                switch(pProperty.Name)
                {
                case "logfileCount":
                string logDirectory = (string) pElement.Properties["logfileDirectory"].Value;
    
                if(Directory.Exists(logDirectory))
                pProperty.Value = Directory.GetFiles(logDirectory, "????????.log").Length;
                else
               pProperty.Value = 0;
                break;
            }
            }
    
            public void ProvideMethod(IappHostMethod pMethod,
                IappHostMethodInstance pMethodInstance,
                IappHostElement pElement)
            {
                switch(pMethod.Name)
            {
                case "deleteLogs":
                string logDirectory = (string) pElement.Properties["logfileDirectory"].Value;
    
                if(Directory.Exists(logDirectory))
                {
                foreach(string logFile in Directory.GetFiles(logDirectory, "????????.log"))
                {
                    File.Delete(logFile);
                    }
                }
    
                break;
            }
            }
        }
    }
    

    注: ここでは、IappHostMethodExtension インターフェイスを実装しました。このインターフェイスには、メソッドを論理的に提供する ProvideMethod というメソッドが 1 つあります。ユーザーがメソッドを呼び出すと (方法については手順 3. を参照)、構成システムは ProvideMethod を呼び出してパラメーターを渡します。パラメーターの 1 つには、呼び出されているメソッドの名前が保持されてます。上記のコードでは、"deleteLogs" という名前のメソッドのみ処理しています。

  2. 次のコマンドを使用して、プロジェクトをビルドします。

    %windir%\Microsoft.NET\Framework\v2.0.50727\csc.exe /t:library /r:AppHostAdminLibrary.dll
                ConfigurationExtensibility.cs /keyfile:keyFile.snk
    

手順 2 - スキーマの更新

次に、スキーマに新しいメソッドを登録します。これまで何度も使用してきた simpleLogging_Schema.xml ファイルをもう一度開き、次のように変更します。

<configSchema>
    <sectionSchema name="system.webServer/simpleLogging">
        <attribute name="logfileDirectory" type="string"
            defaultValue="c:\inetpub\logs\simpleLogs\" expanded="true" encrypted="false" />
        <attribute name="logfileCount" type="int" extension="ConfigurationExtensibility.SimpleLoggingExtension" />
        <method name="deleteLogs" extension="ConfigurationExtensibility.SimpleLoggingExtension" />
    </sectionSchema>
</configSchema> nfigSchema>

この変更によって、"deleteLogs" という新しいメソッドが定義され、メソッドを探す場所が構成に登録されます。

手順 3 - テスト

最後に、メソッドが正しく機能するかどうかを確認します。素早く簡単に確認するには、単純な VB スクリプトを作成します。以下に示すサンプル スクリプトは、logfileCount を出力した後、作成したメソッドを呼び出して logfileCount を出力します。これには、前に作成した SimpleLoggingTest.vbs ファイルを更新して、次のように入力します。

Dim adminManager, section
Set adminManager = WScript.Createobject("Microsoft.ApplicationHost.AdminManager")
Set section = adminManager.GetAdminSection("system.webServer/simpleLogging", "MACHINE/WEBROOT/APPHOST/Default Web Site")
WScript.Echo(section.Properties.Item("logfileCount").Value)
section.Methods.Item("deleteLogs").CreateInstance().Execute()
WScript.Echo(section.Properties.Item("logfileCount").Value)

コマンド ラインからこのスクリプトを実行すると、次のような出力が表示されます。

1
0

ここでは、COM コンポーネントによってサポートされる新しい構成および構成メソッドを用意する方法の概要について手短に説明しました。この例からわかるように、こうしたメソッドによる構成の拡張は非常に強力です。

構成の拡張性 - 既存の構成の拡張

構成の拡張性の最後の特徴として、system.webServer/sites セクションなどの既存の構成セクションを拡張したり、上で作成した system.webServer/simpleLogging セクションを拡張したりすることができます。

既存の構成セクションの拡張は、新しいセクションを作成するのと同じくらい簡単で、スキーマを XML として定義し、スキーマ ファイルを %windir%\system32\inetsrv\config\schema\ ディレクトリに配置するだけです。この手順は、これまでに何度か行ってきたのでもう慣れているはずです。

"sites" 構成の拡張

既存の構成セクションを拡張する方法についてわかりやすく説明するため、ここでは、サイトの定義に使用する構成セクション system.applicationHost/sites を拡張します。"owner" 属性と "ownerEmail" 属性を追加して、sites セクションを拡張します。このような属性は、1 台のコンピューター上で複数のサイトをホストしている場合に、それぞれのサイトの所有者を追跡するのに便利です。

最初に、新しいスキーマ ファイルを作成します。siteExtension_schema.xml ファイルを %windir%\system32\inetsrv\config\schema\ ディレクトリで作成し、次のテキストを入力します。

<configSchema>
    <sectionSchema name="system.applicationHost/sites">
        <collection addElement="site">
            <attribute name="owner" type="string" />
            <attribute name="ownerEmail" type="string" />
        </collection>
    </sectionSchema>
</configSchema> 

既存のセクションのスキーマを拡張する場合は、<sectionSchema> 要素を作成して、name 属性が既存のセクションと同じになるように設定します。前出のスキーマ ファイルでは、"system.applicationHost/sites" という名前で <sectionSchema> を定義しました。これは、Schema ディレクトリにある IIS_Schema.xml ファイル内の sectionSchema という名前と同じ名前です。

"owner" 属性と "ownerEmail" 属性の値を追加した後、構成ファイルに変更が適用されていることを確認します。コマンド ラインから次のコマンドを実行します。

%windir%\system32\inetsrv\appcmd set site "Default Web Site" /owner:"John Contoso" /ownerEmail:"john@contoso.com"

構成が適用されたかどうかを確認するには、次のコマンドを実行し、出力を調べます。

%windir%\system32\inetsrv\appcmd list site "Default Web Site" /config

次のような出力が表示されます。

<system.applicationHost>
    <sites>
    ...
        <site name="Default Web Site" id="1" siteOwner="John Contoso" siteOwnerEmail="john@contoso.com">
        ...
        ...
        </site>
    </sites>
</system.applicationHost> 

: この時点で https://localhost/ にアクセスすると、HTTP 500.19 サーバー エラー メッセージが表示される場合があります。これは既知の問題です。IIS 7 の今後のリリースで解決される予定です。この問題を回避するには、コマンド ラインから "iisreset" を実行します。

これで、構成の拡張性に関する概要の説明は終わりです。この記事の例を参考にすれば、構成の拡張性をさまざまな方法で活用できるようになるでしょう。