Microsoft.Web.Administration.ServerManager не может прочитать разделы конфигурации, содержащие зашифрованные пароли в applicationHost.config

У меня есть несколько сайтов в IIS7, которые настроены для работы в качестве пользователей домена (MYDOMAIN\someuser).

Я использую пространство имен Microsoft.Web.Administration для сканирования конфигурации моего сервера, но оно вызывает исключение, когда я попадаю на один из этих "имитаторских" сайтов:

using (ServerManager sm = new ServerManager()) {
    foreach (Site site in sm.Sites) {
        foreach (Application app in site.Applications.Reverse()) {
            foreach (VirtualDirectory vdir in app.VirtualDirectories.Reverse()) {
                var config = app.GetWebConfiguration();
                foreach (var locationPath in config.GetLocationPaths()) {
                    // error occurs in GetLocationPaths()
                }
            }
        }
    }
}

Фактическое сообщение об ошибке:

COMException was unhandled 
Filename: \\?\C:\Windows\system32\inetsrv\config\applicationHost.config 
Line number: 279
Error: Failed to decrypt attribute 'password' because the keyset does not exist

Похоже, что IIS хранит пароль MYDOMAIN \ someuser, зашифрованный в applicationHost.config, что очень хорошо с точки зрения безопасности, но я понятия не имею, как заставить ServerManager расшифровать это.

Любые советы о том, как я могу позволить ServerManager расшифровать это, или просто сказать IIS хранить пароли в виде простого текста?

Это на IIS7 под Windows 7 RC, кстати.

1 ответ

IIS использует шифрование для атрибутов, помеченных как "encrypted=true" в его схеме. Также в своей схеме он определяет поставщика, который будет использоваться для шифрования (см. C:\Windows\System32\inetsrv\config\schema\IIS_Schema.xml), в случае пароля внутри виртуального каталога он использует AesProvider, который определен в раздел configProtectedData внутри ApplicationHost.config.

Там вы сможете увидеть KeyContainerName, который вам необходим для предоставления разрешений для любой учетной записи, которую вы хотите расшифровать, которая по соображениям безопасности по умолчанию включает только администраторов.

Это приводит меня к моему вопросу: если ваш код не работает, я бы предположил, что вы предоставили доступ к ApplicationHost.config пользователю, который не является администратором, это так? Если это так, то я бы посоветовал убедиться, что это не создаст угрозы безопасности для вашей среды.

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