Javascript 针对IIS的ADSI查询与Vista上的IIS管理器不一致

Javascript 针对IIS的ADSI查询与Vista上的IIS管理器不一致,javascript,iis,isapi,adsi,Javascript,Iis,Isapi,Adsi,使用Vista 我有一个使用ADSI在IIS网站上设置脚本映射的脚本。它是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 = map

使用Vista

我有一个使用ADSI在IIS网站上设置脚本映射的脚本。它是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管理器中删除,那么它实际上就消失了,即使它仍然从ADSI查询返回


有人可以对此进行澄清吗?

当您使用ADSI兼容位添加“scriptmap”(出于论证的目的使用默认网站)时,这会为站点添加一个到
applicationHost.config
文件的处理程序映射:

<location path="Default Web Site">
  <system.webServer>
    <handlers>
        <add name="AboMapperCustom-12345678" ... />
    </handlers>
  </system>
</location>
使用新的托管
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
文件,也不会包括其处理程序
指令

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
中指定的指令

这就是IIS7 Manager应用程序在查看和修改处理程序映射时所做的操作。它通过在站点根文件夹(或子文件夹)中创建(如有必要)一个
web.config
文件并在此级别添加必要的
来添加和删除处理程序

IIS6兼容层似乎仅在
applicationHost.config
APPHOST级别(上面的选项1)运行,这就是为什么您会看到这些差异


是虫子吗?我不确定这是因为ADSI从一开始就不知道web.config。此外,MS还必须添加一个新的方法或标志,以允许您指定您真正希望在哪个级别进行这些“脚本映射”更改,这可能意味着破坏和测试ADSI组件,这反过来可能会引入错误。这种行为是为了模拟修改旧的IIS6元数据库,而实际上,
applicationHost.config
是对元数据库的一种分析,因此无论正确与否,您都可以认为它做了正确的事情。

当您使用ADSI兼容性位添加“scriptmap”时(为了论证而使用默认网站),这会将处理程序映射添加到位于以下位置的站点的
applicationHost.config
文件:

<location path="Default Web Site">
  <system.webServer>
    <handlers>
        <add name="AboMapperCustom-12345678" ... />
    </handlers>
  </system>
</location>
使用新的托管
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
文件,也不会包括其处理程序
指令

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
中指定的指令

这就是IIS7 Manager应用程序在查看和修改处理程序映射时所做的操作。它通过在站点根文件夹(或子文件夹)中创建(如有必要)一个
web.config
文件并在此级别添加必要的
来添加和删除处理程序

IIS6兼容层似乎仅在
applicationHost.config
APPHOST级别(上面的选项1)运行,这就是为什么您会看到这些差异


是虫子吗?我不确定这是因为ADSI从一开始就不知道web.config。此外,MS还必须添加一个新的方法或标志,以允许您指定您真正希望在哪个级别进行这些“脚本映射”更改,这可能意味着破坏和测试ADSI组件,这反过来可能会引入错误。这种行为是为了模拟修改旧的IIS6元数据库,
applicationHost.config
实际上是对元数据库的一种分析,因此你可以争辩,无论是对是错,它做的是正确的事情。

@Cheeso-dunno如果你得到我给出的答案的通知,那么留下一条评论(yep rep whoring:))我错过了它;谢谢@Cheeso-不知道你是否收到我给出的答案的通知,所以留下评论