Я пытаюсь программно добавить dll расширения ISAPI в IIS с помощью ADSI. Это работало много лет в предыдущих версиях 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();
После выполнения этого кода я действительно вижу запись «AboMapperCustom-12345678» для этой конкретной dll в «Сопоставлениях обработчиков» конкретного виртуального каталога, в который я добавил карту сценариев. Но когда я пытаюсь использовать это расширение в браузере, я всегда получаю
Ошибка HTTP 404.2 не найдена
Запрашиваемая страница не может быть обслужена из-за настроек списка ограничений ISAPI и CGI на веб-сервере.
Даже после добавления записи, разрешающей эту конкретную dll в «Ограничениях ISAPI и CGI», я продолжаю получать эту ошибку.
Чтобы заставить его работать, мне сначала нужно отменить эти шаги (столкнувшись с той же проблемой, что и OP вопроса, упомянутого выше: после удаления записи карты сценария из графического интерфейса диспетчера IIS, мне также нужно программно удалить ее с помощью ADSI, прежде чем она фактически ушел из метабазы).
А затем вручную добавьте такую запись:
<path to dll>
, имя = <doesn't matter, but it's mandatory>
Когда я сравниваю 2 записи, они абсолютно одинаковы, за исключением «Типа записи», который кажется «Унаследованным» для программно добавленного элемента и «Локальный» для добавленного вручную.
Странно то, что, хотя там написано «Унаследовано», я не вижу этого нигде в IIS на более высоком уровне. Откуда он наследуется?
В моем коде я добавляю карту сценария в конкретный виртуальный каталог, поэтому он также должен быть «Локальным». Возможно, в этом проблема, но я не знаю, как добавить «локальную» карту сценариев с помощью ADSI.
Я действительно хотел бы продолжать использовать метод ADSI, поскольку в противном случае мне придется использовать другие методы в нашей настройке при работе с IIS 7 или предыдущими версиями, и я бы хотел этого избежать.
Напомним: как я могу программно добавить запись карты сценария и сопутствующую запись ограничений CGI и ISAPI в IIS 7 с помощью ADSI?
Кто-нибудь может пролить свет на это? Любая помощь приветствуется.
IIS7 не полностью совместим со структурой метабазы предыдущих версий, вам необходимо включить его. Убедитесь, что в «службах ролей» для IIS включена «Совместимость с метабазой IIS6».
Для получения дополнительной информации см. Следующие 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
В конце концов я решил это так, как пытался избежать, используя 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
хоть путь!