Я пишу некоторый код, чтобы позволить пользователям удаленно управлять 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 (или чего-то подобного), но я бы предпочел этого не делать.