Остановите пул приложений IIS 7 из сценария сборки

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

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

appcmd stop apppool /apppool.name:MYAPP-POOL

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

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

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

5 ответов

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

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

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

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

В этой статье описывается использование 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

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

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

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

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

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

Ну вот. Вы можете использовать это из CC.NET с NAnt или просто с NAnt:

http://nantcontrib.sourceforge.net/release/latest/help/tasks/iisapppool.html

Другие вопросы по тегам