Как использовать ServerManager для чтения сайтов IIS, а не IIS express, из библиотеки классов или как обработать классные библиотеки с помощью повышенных процессов?
У меня есть некоторые утилиты, которые используют Microsoft.Web.Administration.ServerManager
, с которыми у меня возникли проблемы. Для иллюстрации используйте следующий мертвый простой код.
using(var mgr = new ServerManager())
{
foreach(var site in mgr.Sites)
{
Console.WriteLine(site.Name);
}
}
Если я поместил этот код непосредственно в консольное приложение и запустил его, он получит и перечислит веб-сайты IIS express. Если я запустил это приложение из командной строки с повышенными правами, он перечислит веб-сайты IIS7. Немного неудобно, но пока так хорошо.
Если вместо этого я помещаю этот код в библиотеку классов, на который ссылается и вызывается консольным приложением, он ВСЕГДА будет перечислять сайты IIS Express, даже если приложение консоли будет повышено.
Google заставил меня попробовать следующее, без везения.
//This returns IIS express
var mgr = new ServerManager();
//This returns IIS express
var mgr = ServerManager.OpenRemote(Environment.MachineName);
//This throws an exception
var mgr = new ServerManager(@"%windir%\system32\inetsrv\config\applicationhost.config");
Очевидно, я неправильно понял что-то в том, как работает "повышенный" процесс. Должно ли выполняться все повышенные процессы, даже код из другой DLL, с повышенными правами? Очевидно, нет?
Спасибо за помощь!
Ответы
Ответ 1
Убедитесь, что вы добавляете ссылку на правильную Microsoft.Web.Administration, должен быть v7.0.0.0, который находится в каталоге c:\windows\system32\inetsrv \
Похоже, вы добавляете ссылку на IIS Express Microsoft.Web.Administraiton, которая даст вам это поведение.
Ответ 2
Ваш вопрос помог мне найти ответ для PowerShell, поэтому, если Интернет ищет, как это сделать:
$assembly = [System.Reflection.Assembly]::LoadFrom("$env:systemroot\system32\inetsrv\Microsoft.Web.Administration.dll")
# load IIS express
$iis = new-object Microsoft.Web.Administration.ServerManager
$iis.Sites
# load IIS proper
$iis = new-object Microsoft.Web.Administration.ServerManager "$env:systemroot\system32\inetsrv\config\applicationhost.config"
$iis.Sites
Ответ 3
Обычный пакет Microsoft.Web.Administration
, установленный из NuGet, отлично работает. Нет необходимости копировать любые системные DLL.
Очевидное решение из официальной документации также прекрасно работает:
ServerManager iisManager = new ServerManager(@"C:\Windows\System32\inetsrv\config\applicationHost.config");
Это работает даже при выполнении вышеуказанного из пула приложений IIS Express. Вы по-прежнему увидите конфигурацию "реального" IIS. Вы даже сможете добавлять новые сайты, если ваше приложение работает как пользователь с разрешения на это.
Обратите внимание, что конструктор, описанный выше, документируется как "только внутреннее использование Microsoft":
https://msdn.microsoft.com/en-us/library/ms617371(v=vs.90).aspx