|
На днях столкнулся с достаточно интересной тонкостью при создании web setup
project. Задача, в целом, типичная. При инсталляции своего веб-приложения
необходимо в IIS настроить для определенных виртуальных путей Anonymous Access.
Естественно, как и многим разработчикам, для такой примитивной оперции мне
пришлось немало попотеть. Дело в том, что "благодаря" разработчикам, при
инсталляции в проекте можно настроить многое, но вот именно настройки
безопасности приходится настраивать вручную. По данной тематике можно найти не
одну статью, где вам предложат целых 2 способа: через WMI и Active Directory.
Наиболее распространённый подход (как мне показалось) это через AD. Делается это
примерно так:
создаём Custom Action в виде dll в которой перегружается класс
Installer. В нём перегружаем конструктор Installer, где и происходит поиск по AD
нужного виртуального пути, а затем выставляются параметры безопасности.
CODE
webEntry = new DirectoryEntry(String.Format("IIS://{0}{1}/Root/{2}",
hostName, siteName, virtualDir));
webEntry.Properties["AuthFlags"].Value = MD_AUTH_ANONYMOUS |
MD_AUTH_NT;
webEntry.CommitChanges();
где hostName - имя сервера, siteName - сайт на который производится установка
(например, для моего сайта по-умолчанию, это /W3SVC/1), virtualDir - это
имя виртуальной директории. Далее подцепляем данный Custom Action к проекту
инсталляции. Всё вроде бы хорошо, но вот имя сайта, которое возвращает setup
project через атрибут TARGETSITE выглядит так: /LM/W3SVC/1 где /LM
как я предполагаю обозначает local Machine, и она при поиске в AD указываться не
должна. Убил на эту мелочь больше часа.
Однако, это еще не всё. Моя задача осложнилась тем, что мне понадобилось задать
анонимность в поддиректории относительно виртуального пути всего приложения. А
для того чтобы сделать это, сначала требуется найти соответствующую
DirectoryEntry в AD. Пытался это делать 2-мя способами:
- webEntry = new DirectoryEntry(String.Format("IIS://{0}{1}/Root/{2}",
hostName, siteName, virtualDir)); с указанием в virtualDir пути в виде
parentPath/subPath
- и второй вариант - поиск из головной DirectoryEntry через метод
DirectoryEntry.Children.Find
Несмотря на долгие усилия она не находилась, при том что IIS в закладке ASP.NET
прекрасно показывал этот путь. Как я понял, в результате оказалось, что при
инталляции (с помощью setup project) в инфраструктуре IIS подпапки приложения не
регистрируются. Т.е. их IIS не воспринимает как объекты. Поэтому пришлось
сначала создавать их:
CODE
childEntry = webEntry.Children.Add("SubPath", "IIsWebDirectory");
webEntry.CommitChanges();
После чего всё заработало на ура и к childEntry можно было успешно применять
настройки безопасности.
Источник:
Vorant's Blog (Блоги
на Realcoding.NET)
|