使用 ADSI 以编程方式在 IIS 7 中添加 ISAPI 扩展 dll?

使用 ADSI 以编程方式在 IIS 7 中添加 ISAPI 扩展 dll?

我正在尝试使用 ADSI 以编程方式在 IIS 中添加 ISAPI 扩展 dll。此方法在以前版本的 IIS 上已经有效,但在 IIS 7 上似乎失败了。

我正在使用类似如下的代码这个问题

var web = GetObject("IIS://localhost/W3SVC/1/ROOT/specificVirtualDirectory");
var maps = web.ScriptMaps.toArray();
map[maps.length] = ".aaa,c:\\path\\to\\isapi\\extension.dll,1,GET,POST";
web.ScriptMaps = maps.asDictionary();
web.SetInfo();

执行该代码后,我确实在添加了脚本映射的特定虚拟目录的“处理程序映射”中看到了该特定 dll 的“AboMapperCustom-12345678”条目。但当我尝试在浏览器中使用该扩展时,我总是得到

HTTP 错误 404.2 未找到
由于 Web 服务器上的 ISAPI 和 CGI​​ 限制列表设置,无法提供您请求的页面。

即使在“ISAPI 和 CGI​​ 限制”中添加条目以允许该特定 dll 后,我仍然收到该错误。

为了使其真正起作用,我首先必须撤消这些步骤(遇到与上述问题的 OP 相同的问题:从 IIS 管理器 GUI 中删除脚本映射条目后,我还必须使用 ADSI 以编程方式删除它,然后它才会真正从元数据库中消失)。

然后手动添加这样的条目:

  • inetmgr -> web 服务器 -> 网站 -> 虚拟目录 -> 处理程序映射 -> 添加脚本映射...
  • 路径 = *.dll,可执行文件 = <path to dll>,名称 =<doesn't matter, but it's mandatory>
  • 在“您是否允许此 ISAPI 扩展?”问题上单击“是”。

当我比较这两个条目时,它们完全相同,除了“条目类型”之外,对于以编程方式添加的条目,它似乎是“继承”,而对于手动添加的条目,它似乎是“本地”。

奇怪的是,尽管上面写着“继承”,但我在 IIS 的更高级别上却看不到它。它是从哪里继承的?

在我的代码中,我确实将脚本映射添加到了特定的虚拟目录,因此它也应该是“本地”。也许存在问题,但我不知道如何使用 ADSI 添加“本地”脚本映射。

我真的很想继续使用 ADSI 方法,否则在使用 IIS 7 或以前的版本时,我将不得不在我们的设置中使用不同的方法,我想避免这种情况。

回顾一下:如何使用 ADSI 以编程方式将脚本映射条目及其配套的 CGI 和 ISAPI 限制条目添加到 IIS 7?

有谁能解释一下这个问题吗?任何帮助都值得感激。

答案1

IIS7 并非 100% 兼容以前版本的 Metabase 结构,您需要启用它。在 IIS 的“角色服务”中,请确保已启用“IIS6 Metabase 兼容性”。

请参阅以下 2 个站点以了解更多信息:
http://learn.iis.net/page.aspx/125/metabase-compatibility-with-iis-7
http://learn.iis.net/page.aspx/126/how-to-use-metabase-compatibility-with-iis-7

话虽如此,我发现 ADSI 和 Metabase 兼容性似乎不是 100% 可靠的。更好的解决方案是重新调整脚本以使用 appcmd.exe。命令如下:

appcmd set config /section:handlers /+[name='MyIsapiExtension',path='*.aaa',verb='GET,POST',scriptProcessor='c:\path\to\extension.dll']

请参阅此网站以了解更多信息:
http://technet.microsoft.com/en-us/library/cc754147(WS.10).aspx

答案2

我最终用我试图避免的方式解决了这个问题,使用appcmd。但要补充的是@MattB 的回答,我需要添加一个额外的参数modules='IsapiModule'才能使其真正起作用:

appcmd set config 'website/virtualdir' /section:handlers /+[name='a name',path='*.dll',verb='*',scriptProcessor='path\to\webisapi.dll',modules='IsapiModule']

我还必须在“ISAPI 和 CGI​​ 限制”部分添加一个条目:

appcmd set config /section:isapiCgiRestriction /+[path='path\to\isapi.dll', description='a description',allowed='True']

我检查 是否存在,%windir%\system32\inetsrv\appcmd.exe以确定使用哪种方式。如果存在,我使用appcmd,如果不存在,我返回ADSI

尽管如此,我仍然对纯粹的ADSI方式感兴趣!

相关内容