Подтвердить что ты не робот

Как использовать 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, с повышенными правами? Очевидно, нет?

Спасибо за помощь!

4b9b3361

Ответ 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