Как использовать ServerManager для чтения сайтов IIS, а не IIS express, из библиотеки классов ИЛИ как процессы с повышенными правами обрабатывают библиотеки классов? - PullRequest
35 голосов
/ 12 декабря 2011

У меня есть несколько служебных методов, использующих 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, не должны выполняться с повышенными правами?Видимо нет?

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

Ответы [ 4 ]

56 голосов
/ 13 декабря 2011

Убедитесь, что вы добавляете ссылку на правильный Microsoft.Web.Administration, должен быть v7.0.0.0, который находится в каталоге c: \ windows \ system32 \ inetsrv \ Похоже, что вы добавляете ссылку на Microsoft.Web.Administraiton IIS Express, которая даст вам такое поведение

9 голосов
/ 30 января 2014

Ваш вопрос помог мне найти ответ для 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
4 голосов
/ 10 февраля 2017

ВНИМАНИЕ!Используя этот подход, мы увидели, казалось бы, случайные проблемы, такие как исключения «неподдерживаемых операций», сбой при добавлении / удалении привязок HTTPS, сбой при запуске / остановке пулов приложений при работе в IIS Express и другие проблемы.Неизвестно, связано ли это с IIS, как правило, с ошибками или с неортодоксальным подходом, описанным здесь.В целом, у меня сложилось впечатление, что все инструменты для автоматизации IIS (appcmd, Microsoft.Web.Administration, PowerShell, ...) работают нестабильно и нестабильно, особенно в разных версиях ОС.Хорошее тестирование желательно (как всегда)!

Стандартный пакет 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

0 голосов
/ 07 марта 2019
var iisManager = new ServerManager(Environment.SystemDirectory + "\\inetsrv\\config\\applicationhost.config");

Это отлично работает. Нет необходимости менять какие-либо ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...