Почему использование Microsoft.Web.Management.dll в IIS7.5 работает только в 64-битном процессе? - PullRequest
3 голосов
/ 17 сентября 2010

Я пишу некоторый код, чтобы позволить пользователям удаленно управлять IIS7.Под капотом это добавляет правила авторизации к c:\windows\system32\inetsrv\config\administration.config в следующем разделе конфигурации:

system.webServer/management/authorization/authorizationRules

Я использую сборку и пространство имен Microsoft.Web.Administration скод, подобный следующему:

using Microsoft.Web.Management.Server;
...
ManagementAuthorization.Grant("MySiteUser, "My Web Site", false);

Этот код вызывает исключение, если выполняется в 32-разрядном процессе, если он построен как 64-разрядный, он работает нормально:

System.Runtime.InteropServices.COMException was unhandled
  Message=Filename: \\?\C:\Windows\system32\inetsrv\config\administration.config
Error: The configuration section 'system.webServer/management/authorization' cannot be read because it is missing a section declaration`

Однако управление другим серверомзадачи, выполняемые с использованием сборки Microsoft.Web.Administration и пространства имен, прекрасно работают в 32-разрядном процессе, например:

using Microsoft.Web.Administration;
....
int iisNumber = 60000;
using (ServerManager serverManager = new ServerManager())
{
  var site = serverManager.Sites.Where(s => s.Id == iisNumber).SingleOrDefault();
  if (site != null)
  {
    site.Stop();
  }
}

Обе эти сборки отображаются в GAC и являются чистым MSIL (даже при наличии взаимодействия COMслой для непосредственного общения с базовыми механизмами управления IIS7.

Базовые файлы конфигурации applicationHost.config и administration.config видны только для 64-разрядных редакторов (например, notepad.exe или NotePad2.exe), и я подозреваю, что этоВот почему мой код не может изменить administration.config через Microsoft.Web.Management

Почему Microsoft.Web.Administration позволяет мне читать / изменять applicationHost.config в 32-битном процессе, но Microsoft.Web.Management может только читать /изменить administration.config если run в 64-битном процессе?

Я не могу перекомпилировать свой проект для целевой x64, потому что существует зависимость от 32-битной библиотеки COM, для которой у нас нет исходного кода.Я могу построить обходной путь, который будет включать в себя вызовы внепроцессного 64-битного приложения WCF (или чего-то подобного), но я бы предпочел этого не делать.

1 Ответ

2 голосов
/ 17 сентября 2010

После некоторого копания это выглядит как ошибка:

Эта ветка форума и сообщение Карлоса Агилара объясняют все:

http://forums.iis.net/p/1157779/1956471.aspx

Теперь я понимаю вопрос, в чем заключается происходит то, что Кассини является 32-битным процесс и что в сочетании с ошибка в нашей конфигурации заставляет нас попробовать загрузить «перенаправленный» syswow (вместо system32), который является причина, по которой мы не можем найти administration.config. Работает в 64 бит процесс облегчает проблему потому что нет "волшебного" перенаправления и мы идем в нужную папку.

Любой 32-битный процесс столкнется с этим препятствием.

...