IISに対するADSIクエリは、Vista上のIISマネージャーと一致しません
-
05-07-2019 - |
質問
Vistaを使用しています...
ADSIを使用してIIS WebサイトにScriptMapsを設定するスクリプトがあります。これはjavascriptであり、cscript.exe内で実行され、コードは次のようになります。
var web = GetObject("IIS://localhost/W3SVC/1");
var maps = web.ScriptMaps.toArray();
map[maps.length] = ".aaa,c:\\path\\to\\isapi\\extension.dll,1,GET,POST";
web.ScriptMaps = maps.asDictionary();
web.SetInfo();
スクリプトの実行後にIISマネージャーを見ると、ハンドラーマッピングのリストに新しいエントリが表示されます。奇妙な名前<!> quot; AboMapperCustom-43155 <!> quot;がありますが、これはADSIのIIS7互換性レイヤーに由来すると理解しています。
IISマネージャーでこれらのハンドラーマッピングを削除してから、別のADSIスクリプトを実行してScriptMapsプロパティを照会した場合、スクリプト内の取得されたScriptMapsには削除されたばかりのエントリーがリストされます。 ADSIスクリプトの結果は、<!> quot; Handler Mappings <!> quot;のリストと一致しません。 IISマネージャーに表示されます。
これは、IISADMINおよびW3SVCの開始/停止後も持続します。
これは予想される動作ですか? ADSIは、<!> quot;互換モード<!> quot;としてサポートされています。 IIS7で。これはアーティファクトですか?
ハンドラーマッピングがIIS MAnagerから削除された場合、ADSIクエリから返されたとしても、実際にはなくなっていると思います。
これについて説明できる人はいますか
解決
ADSI互換ビットを使用して(引数のために既定のWebサイトを使用して) 'scriptmap'を追加すると、次の場所のサイトのapplicationHost.config
ファイルにハンドラーマッピングが追加されます。
<location path="Default Web Site">
<system.webServer>
<handlers>
<add name="AboMapperCustom-12345678" ... />
</handlers>
</system>
</location>
IIS7マネージャーでハンドラーマッピングを削除すると、web.config
ファイルと上記のセクションからマッピングを削除する代わりに、次のようにMicrosoft.Web.Administration
ファイルがサイトのルートに追加されます。
<configuration>
<system.webServer>
<handlers>
<remove name="AboMapperCustom-12345678" />
</handlers>
</system>
</configuration>
新しいマネージ<add/>
.NET APIを使用してWebサイトの構成を取得する場合、さまざまなレベルで構成を読み取ることができます。例:
1:<remove/>
またはAPPHOSTレベルで設定を読み取ります
ServerManager serverManager = new ServerManager();
var site = serverManager.Sites.Where(s => s.Id == 1).SingleOrDefault();
Configuration siteConfig = serverManager.GetApplicationHostConfiguration();
ConfigurationSection handlersSection =
siteConfig.GetSection("system.webServer/handlers", site.Name);
ConfigurationElementCollection handlersCollection =
handlersSection.GetCollection();
foreach (var item in handlersCollection)
{
Console.WriteLine(item.Attributes["name"].Value);
}
上記の例では、マッピングを削除した場合でも、ハンドラーマッピングコレクションを繰り返し処理するときにリストされます。これは、アプリケーションホストレベルで構成を要求したためです。サイトのルート以下に存在する<=>ファイルは読み込まれず、ハンドラーの<=>および<=>ディレクティブは含まれません。
2:サイト(またはサイトのサブフォルダー)に固有の構成を読むことができます:
ServerManager serverManager = new ServerManager();
Configuration siteConfig = serverManager.GetWebConfiguration("Default Web Site");
ConfigurationSection handlersSection =
siteConfig.GetSection("system.webServer/handlers");
ConfigurationElementCollection handlersCollection =
handlersSection.GetCollection();
foreach (var item in handlersCollection)
{
Console.WriteLine(item.Attributes["name"].Value);
}
これはサイトの<=>ファイルも読み取り、<=>で指定された<=>および<=>ディレクティブを説明するハンドラーマッピングリストを返します。
これは、ハンドラーマッピングを表示および変更するときにIIS7マネージャーアプリケーションが実行していることです。サイトルートフォルダー(またはサブフォルダー)に<=>ファイルを作成し(必要な場合)、このレベルで必要な<=>および<=>を追加して、ハンドラーを追加および削除します。
IIS6互換性レイヤーは、<=> APPHOSTレベル(上記のオプション1)でのみ動作するように見えるため、これらの違いが見られます。
それはバグですか?そもそもADSIが<=>を認識していなかったためかどうかはわかりません。また、MSは新しいメソッドまたはフラグを追加して、これらの「スクリプトマップ」の変更を実際に行うレベルを指定できるようにする必要があります。この動作は、古いIIS6メタベースの変更をシミュレートするためのものであり、<=>は実質的にメタベースに類似しているので、正しいか間違っているかを議論することができます。