Пути конфигурации IIS 7

Я пытаюсь сделать мое приложение C++ ahadmin совместимым с IIS 7. Моему приложению необходимо прочитать конфигурацию веб-сайтов (через свойства метабазы ​​в IIS 6).

Я прочитал много статей о путях конфигурации и думаю, что у меня есть хорошее представление о том, как это работает, но я не уверен в одном:

Чтобы перейти к настройке, я могу зафиксировать путь MACHINE/WEBROOT/APPHOST/ или MACHINE/WEBROOT/APPHOST/Default Web Site.

Я понимаю, что последнее относится к фактическому web.config конкретного сайта, а первый относится к общему applicationHost.config файл, в котором установлены общие настройки.

Однако мое приложение не знает, является ли web.config Файл существует.

Мой вопрос: если я хочу попасть на этот путь - Object.ConfiguredObject.Site.Bindingsмне нужно совершить APPHOST путь или APPHOST/Default Web Site дорожка?

Откуда я знаю, что во время выполнения?

2 ответа

Вы всегда будете связывать себя MACHINE/WEBROOT/APPHOST,

Вы должны взглянуть на файлы схемы в:

%systemroot%\System32\inetsrv\config\schema

Они помогут вам определить, где настройки должны принадлежать.

Обновить:

За ваш комментарий:

Так, например, AccessSSLFlags будет сопоставлен с ConfigurationSection.AccessSection.SslFlags - какой раздел я буду фиксировать в этом случае? Как мне узнать, какой раздел мне нужно зафиксировать?

Это все зависит. IIS7 поддерживает механизм, называемый делегированием функций. Если функция делегирована, это означает, что пользователь может настроить эту функцию в своем локальном web.config, Некоторые функции настраиваются под system.webServerдругие system.web,

Что пользователь может и не может настроить локально в его / ее web.config контролируется записями в двух файлах:

%systemrooot%\system32\inetsrv\config\administration.config
%systemrooot%\system32\inetsrv\config\applicationHost.config

Если вы пойдете и посмотрите на схему конфигурации IIS7 в:

%systemroot%\System32\inetsrv\config\schema\IIS_schema.xml

Вы обнаружите, что есть два основных типа разделов:

system.applicationHost/xxxx
system.webServer/xxxx

Все, что настраивается под system.applicationHost обычно не считается изменяемым пользователем элементом конфигурации. На самом деле, если вы откроете applicationHost.config ты увидишь:

<sectionGroup name="system.applicationHost">
  <section name="applicationPools" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
  <section name="configHistory" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
  <section name="customMetadata" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
  <section name="listenerAdapters" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
  <section name="log" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
  <section name="serviceAutoStartProviders" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
  <section name="sites" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
  <section name="webLimits" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
</sectionGroup>

Обратите внимание на allowDefinition="AppHostOnly"? Это в основном говорит вам, что эти параметры не могут быть настроены в web.config,

Сфера действия делегирования функций слишком широка, чтобы в ней можно было найти ответ, поэтому я предлагаю вам прочитать статью, на которую есть ссылки выше.

Похоже, вы пытаетесь создать универсальный инструмент для управления конфигурацией, и поэтому вы можете подумать о том, чтобы следовать аналогичному шаблону, которому следует IIS Manager; короче говоря, он всегда пытается сохранить конфигурацию на максимально возможный путь. Это означает, что он всегда будет фиксировать его там, где он может, посмотрев, заблокирован ли раздел или нет. Он использует управляемый код (Microsoft.Web.Administration), но вы можете получить доступ к тем же данным из C++, используя AppHostElement.GetMetadata("isLocked"). Кстати, если вы используете C++, я бы настоятельно рекомендовал использовать AHADMIN напрямую (а не WMI или что-то еще), в частности IAppHostWritableAdminManager.

Таким образом, алгоритм будет таким, установите для CommitPath то же значение, что и указанный путь конфигурации GetAdminSection. Затем проверьте наличие IsLocked, затем удалите последнюю "часть пути" (обрезать, начиная с последнего символа "/"), и читайте снова, пока не найдете место, где раздел разблокирован. Это самое глубокое место, где вы можете его спасти. Кроме того, вам нужно будет переключиться на MACHINE/WEBROOT в какой-то момент, если это раздел system.web. IsLocked будет уважать такие вещи, как определение раздела, разрешить местоположение и другие необходимые вещи. Если вы хотите сделать это пуленепробиваемым, вам даже нужно проверить блокировку на уровне атрибутов, но я думаю, что это довольно продвинутое.

Другие вопросы по тегам