Назад | Перейти на главную страницу

Программно добавить DLL расширения ISAPI в IIS 7 с помощью ADSI?

Я пытаюсь программно добавить 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, прежде чем она фактически ушел из метабазы).

А затем вручную добавьте такую ​​запись:

Когда я сравниваю 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 хоть путь!