簡體   English   中英

在Vista上,針對IIS的ADSI查詢與IIS管理器不一致

[英]ADSI Query against IIS does not agree with IIS Manager, on Vista

使用Vista ...

我有一個腳本,該腳本使用ADSI在IIS網站上設置ScriptMap。 它是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管理器中查看時,可以在“處理程序映射”列表中看到新條目。 它有一個奇怪的名稱“ AboMapperCustom-43155”,據我了解它來自用於ADSI的IIS7兼容性層。

如果在IIS管理器中刪除了這些處理程序映射,然后運行另一個ADSI腳本來查詢ScriptMaps屬性,則腳本中檢索到的ScriptMaps仍會列出剛剛刪除的條目。 ADSI腳本中的結果與IIS管理器中顯示的“處理程序映射”列表不一致。

即使在IISADMIN和W3SVC的啟動/停止之后,該問題仍然存在。

這是預期的行為嗎? IIS7中將ADSI作為“兼容模式”支持。 這是假象嗎?

我相信,如果從IIS MAnager中刪除了“處理程序映射”,則即使它仍然從ADSI查詢返回,它也確實消失了。

誰能對此提供任何澄清?

當您使用ADSI兼容性位添加“腳本映射”(出於參數目的,使用默認網站)時,這會將處理程序映射添加到該站點的applicationHost.config文件中,位於:

<location path="Default Web Site">
  <system.webServer>
    <handlers>
        <add name="AboMapperCustom-12345678" ... />
    </handlers>
  </system>
</location>

當您在IIS7管理器中刪除處理程序映射時,不是從applicationHost.config文件和上面顯示的部分中刪除映射,而是將web.config文件添加到站點的根目錄中,並具有以下內容:

<configuration>
  <system.webServer>
    <handlers>
        <remove name="AboMapperCustom-12345678" />
    </handlers>
  </system>
</configuration>

使用新的托管Microsoft.Web.Administration .NET API獲取網站的配置時,您可以在不同級別讀取配置,例如:

1:在applicationHost.config或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);
}

在上面的示例中,即使您刪除了映射,在迭代處理程序映射集合時仍將列出該映射。 這是因為您要求在應用程序主機級別進行配置。 站點根目錄或更低版本中存在的任何web.config文件都不會被讀取,並且它們的處理程序<add/><remove/>指令將不包括在內。

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);
}

這還將讀取站點web.config文件,並將返回一個處理程序映射列表,該列表說明了web.config指定的<add/><remove/>指令。

當您查看和修改處理程序映射時,這就是IIS7 Manager應用程序正在做的事情。 它是通過在站點根文件夾(或子文件夾)中創建(如果需要) web.config文件並在此級別添加必需的<add/><remove/>來添加和刪除處理程序的。

IIS6兼容性層似乎僅在applicationHost.config APPHOST級別(上面的選項1)下運行,這就是為什么您會看到這些差異。

是蟲子嗎? 我不確定這是因為最終ADSI從來沒有意識到web.config MS還必須添加新的方法或標志,以允許您指定真正要進行“腳本映射”更改的級別,這可能意味着破壞和測試ADSI組件,從而可能引入錯誤。 該行為可以模擬修改舊的IIS6元數據庫,而applicationHost.config實際上類似於該元數據庫,因此您可以說是對是非。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM