Остановить пул приложений IIS 7 от сборки script

Как я могу остановить, а затем перезапустить пул приложений IIS 7 из MSBuild script, запущенного внутри TeamCity. Я хочу развернуть наши ночные сборки на сервере IIS для просмотра тестеров.

Я пробовал использовать appcmd так:

appcmd stop apppool /apppool.name:MYAPP-POOL

... но я столкнулся с проблемами с рельефом в Windows 2008, которые до сих пор мешали мне запускать эту команду из моего процесса сборки TeamCity, потому что Windows 2008 требует повышения, чтобы запустить appcmd.

Если я не остановлю пул приложений, прежде чем копировать свои файлы на веб-сервер, мой MSBuild script не сможет скопировать файлы на сервер.

Кто-нибудь еще видел и решал эту проблему при развертывании веб-сайтов в IIS от TeamCity?

Ответ 1

задачи сообщества msbuild включает AppPoolController, который, как представляется, делает то, что вы хотите (хотя, как уже отмечалось, он устарел и в настоящее время поддерживает только IIS6.) Пример:

<AppPoolController ApplicationPoolName="MyAppPool" Action="Restart" />

Обратите внимание, что при необходимости вы также можете указать имя пользователя и пароль.

Изменить: просто заметил, что MSBuild Extension Pack имеет задачу Iis7AppPool, которая, вероятно, более уместна.

Ответ 2

В этой статье описывается использование htm файла с именем App_offline.htm для перехода на сайт в автономном режиме. Как только IIS обнаружит этот файл в корне каталога веб-приложений,

ASP.NET 2.0 отключит приложение, выгрузит приложение домена с сервера и прекратить обработку любых новых входящих запросов для этого приложения.

В App_offline-htm вы можете поместить удобное для пользователя сообщение о том, что сайт в настоящее время находится под управлением.

Джейсон Ли показывает вызовы MSDeploy, которые вам нужно использовать (и многое другое об интеграции этих шагов в скрипты сборки!).

MSDeploy 
-verb:sync 
-source:contentPath="[absolute_path]App_offline-Template.htm" 
-dest:contentPath="name_of_site/App_offline.htm",computerName="copmuter_name",
username=user_with_administrative priviliges,password=passwort

После развертывания вы можете удалить файл App_offline.htm, используя следующий вызов:

MSDeploy 
-verb:delete 
-dest:contentPath="name_of_site/App_offline.htm",computerName="computer_name",
username=user_with_administrative_priviliges,password=passwort

Ответ 3

это довольно hackey обходной путь, который я использовал:

1) Настройте учетную запись с ограниченным доступом для вашей службы, которая будет работать как. Поскольку я запускаю службу CruiseControl.NET, я позвоню своему пользователю 'ccnet'. У него нет прав администратора.

2) Создайте новую учетную запись локального пользователя и назначьте группе "Администраторы" (я буду называть его "iis_helper" для этого примера). Дайте ему пароль и установите его, чтобы он никогда не истекал.

3) Измените права доступа iis_helper, чтобы НЕ разрешить вход в локальный логин или удаленный рабочий стол, и все, что вы могли бы сделать, чтобы заблокировать эту учетную запись.

4) Войдите в систему (локально или через удаленный рабочий стол) в качестве пользователя, не являющегося администратором, "ccnet" в этом примере.

5) Откройте командный терминал и используйте команду "runas" для выполнения того, что нужно, чтобы выполнить эскалацию. Используйте параметр /savecred. Укажите нового административного пользователя.

runas /savecred /user:MYMACHINE\iis_helper "C:\Windows\System32\inetsrv\appcmd.exe"

В первый раз вам будет предложено ввести пароль iis_helper. После этого он будет сохранен благодаря опции /savecred (вот почему мы запускаем его один раз из реальной командной строки, поэтому мы можем ввести пароль один раз).

6) Предположим, что команда выполнена нормально, теперь вы можете выйти из системы. Затем я зарегистрировался в качестве локального администратора и отключил пользователя "ccnet" для локального интерактивного входа и удаленного рабочего стола. Учетная запись используется только для запуска службы, но нет реальных логинов. Это необязательный шаг.

7) Настройте свою службу для запуска в качестве учетной записи пользователя ('ccnet').

8) Настройте любую службу (CruiseControl.NET в моем случае) для выполнения команды "runas" вместо "appcmd.exe" напрямую, так же, как и раньше:

заменить:

"C:\Windows\System32\inetsrv\appcmd.exe" start site "My Super Site"

с:

runas /savecred /user:MYMACHINE\iis_helper "\"C:\Windows\System32\inetsrv\appcmd.exe\" start site \"My Super Site\""

Следует отметить, что команда должна быть в одном наборе кавычек, причем все внутренние кавычки экранированы (косой чертой).

9) Протестируйте, назовите это днем, нажмите на локальный паб.


Изменить: я, по-видимому, делал # 9 в неправильном порядке и имел несколько слишком много до тестирования...

Этот метод также не работает полностью. Он пытается запустить как административную учетную запись, однако она по-прежнему выполняется как неэскапированный процесс под административным пользователем, поэтому до сих пор не разрешено администратором. Я изначально не поймал ошибку, потому что команда runas запускает отдельное окно cmd и сразу же закрывается, поэтому я не видел выход сбоя.

Его начало казаться единственной реальной возможностью, возможно, заключается в написании службы Windows, которая будет запускаться как администратор, и единственная ее цель - запустить appcmd.exe, а затем вызвать ее для запуска/остановки IIS.

Разве не здорово, как UAC там защищает вещи, но на самом деле просто не защищает больше серверов, потому что все, что вы хотите сделать, вам нужно делать как администратор, поэтому его проще просто всегда запускать все как администратор и забывать об этом

Ответ 4

Вы можете попробовать изменить настройки службы агента сборки для входа в систему как обычную учетную запись пользователя, а не SYSTEM (по умолчанию), это можно сделать с панели управления службами (Start | Run | services.msc).

Если это не поможет, вы также можете попробовать настроить appcmd, чтобы всегда работать с повышенным уровнем, обратитесь к к этому документу./p >

Если такой параметр недоступен для appcmd или он все еще не работает, вы можете полностью отключить UAC для этого пользователя.