繁体   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