Программная разблокировка разделов конфигурации IIS в Powershell - PullRequest
10 голосов
/ 19 апреля 2011

Я пишу сценарий powershell для создания и настройки ряда веб-сайтов и виртуальных каталогов. Я использую сборку .NET Microsoft.Web.Administration. Я создал новое приложение на веб-сайте по умолчанию и добавил новый виртуальный каталог, и все это работает хорошо. Сейчас я пытаюсь настроить параметры аутентификации для виртуального каталога. Я делаю следующее в powershell:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Web.Administration")

$oIIS = new-object Microsoft.Web.Administration.ServerManager
$oWebSite = $oIIS.Sites["Default Web Site"]
$oApp = $oWebSite.Applications["/MyApp"]

$oConfig = $oApp.GetWebConfiguration()

$oAnonAuth = $oConfig.GetSection("system.webServer/security/authentication/anonymousAuthentication")
$oAnonAuth.SetAttributeValue("enabled", "False")

Однако команда SetAttributeValue выдает мне следующую ошибку:

"Этот раздел конфигурации нельзя использовать по этому пути. Это происходит, когда раздел заблокирован на родительском уровне. Блокировка выполняется либо по умолчанию (overrideModeDefault =" Deny "), либо устанавливается явно с помощью тега местоположения с помощью overrideMode =" Запретить "или наследие allowOverride =" false "

Из того, что я читал в другом месте, есть некоторые предложения изменить файл XML для приложения, чтобы разрешить переопределение. Я не хочу этого делать - есть ли способ программно разблокировать конфигурацию, чтобы я мог ее изменить? Я вообще не хочу вводить пользователя в этот процесс ..

Спасибо за любую помощь, Al.


Нашел ответ, который искал, но будучи новым пользователем, я не могу ответить на свой вопрос в течение 24 часов.

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

#
# Allow overriding of the security settings.
#
$oGlobalConfig = $oIIS.GetApplicationHostConfiguration()
$oConfig = $oGlobalConfig.GetSection("system.webServer/security/authentication/anonymousAuthentication", "Default Web Site/mySite")
$oConfig.OverrideMode="Allow"
$oIIS.CommitChanges()

#
# Following the commit above, we need a new instance of the configuration object, which we can now 
# modify.
#
$oGlobalConfig = $oIIS.GetApplicationHostConfiguration()
$oConfig = $oGlobalConfig.GetSection("system.webServer/security/authentication/anonymousAuthentication", "Default Web Site/mySite")
$oConfig.SetAttributeValue("enabled", "False")
$oIIS.CommitChanges()

1 Ответ

7 голосов
/ 19 апреля 2011

Я написал пост в блоге об этом довольно давно. http://www.danielrichnak.com/powershell-iis7-teach-yoursel/

Приведенный ниже код перебирает все на уровне system.webserver и разблокирует его. Вы можете ориентироваться на разные узлы, как считаете нужным.

$assembly = [System.Reflection.Assembly]::LoadFrom("$env:systemroot\system32\inetsrv\Microsoft.Web.Administration.dll")

# helper function to unlock sectiongroups
function unlockSectionGroup($group)
{
    foreach ($subGroup in $group.SectionGroups)
    {
        unlockSectionGroup($subGroup)
    }
    foreach ($section in $group.Sections)
    {
        $section.OverrideModeDefault = "Allow"
    }
}

# initial work
# load ServerManager
$mgr = new-object Microsoft.Web.Administration.ServerManager
# load appHost config
$conf = $mgr.GetApplicationHostConfiguration()

# unlock all sections in system.webServer
unlockSectionGroup(
     $conf.RootSectionGroup.SectionGroups["system.webServer"])

Ваше решение похоже, но достаточно отличается, так что я не могу проверить, что у вас есть, но раз вы говорите, что оно работает - звучит хорошо. :)

...