2009-09-08 23 views
10

¿Cómo puedo detener y luego reiniciar un grupo de aplicaciones de IIS 7 desde un script de MSBuild que se ejecuta dentro de TeamCity? Quiero implementar nuestras compilaciones nocturnas en un servidor IIS para que los verifiquen los verificadores externos.Detenga el grupo de aplicaciones de IIS 7 desde el script de compilación

He intentado usar appcmd así:

appcmd stop apppool /apppool.name:MYAPP-POOL 

... pero se han topado con problemas de elevación en Windows 2008 que hasta ahora me han dejado de ser capaz de ejecutar ese comando de mi proceso de construcción TeamCity porque Windows 2008 requiere elevación para ejecutar appcmd.

Si no detengo el grupo de aplicaciones antes de copiar mis archivos al servidor web, mi script MSBuild no puede copiar los archivos en el servidor.

¿Alguien más ha visto y solucionado este problema al implementar sitios web en IIS de TeamCity?

+0

que tienen el mismo problema con CruiseControl.NET. Tengo un proyecto que tengo que tener parada/arranque de IIS, pero no ejecutar todo el servicio climatizador como una cuenta elevada. – CodingWithSpike

Respuesta

0

Puede intentar cambiar la configuración del servicio de agente de compilación para iniciar sesión como una cuenta de usuario normal en lugar de SISTEMA (valor predeterminado), esto se puede hacer desde el panel de control de servicios (Inicio | Ejecutar | servicios.msc).

Si no ayuda, también puede intentar configurar el appcmd para que siempre se ejecute elevado, consulte this document para obtener más información.

En caso de que dicha opción no esté disponible para appcmd o aún no funciona, puede desactivar completamente el UAC para este usuario.

+0

Gracias por las sugerencias. appCmd ​​es un archivo de sistema por lo que parece que no se puede configurar para que siempre se ejecute elevado. estoy corriendo bajo una cuenta de usuario dedicada pero sigue sin ponerse en contacto con el servicio fue al intentar ejecutar appcmd de mi servidor de compilación –

+0

tratar de desactivar el control de cuentas de usuario para el usuario que ejecuta el agente de compilación. Intenta ejecutar el agente usando el archivo .bat en lugar del servicio. – CrazyCoder

1

esta es la solución bastante hackey Terminé usando:

1) Configurar una cuenta de acceso limitado por su servicio a ejecutar como. Como estoy ejecutando un servicio CruiseControl.NET, llamaré a mi usuario 'ccnet'. Él NO tiene derechos de administrador.

2) Cree una nueva cuenta de usuario local y asigne al grupo Administradores (lo llamaré 'iis_helper' para este ejemplo). Dale una contraseña y configúrala para que nunca caduque.

3) Cambie los permisos de acceso de iis_helper para NO permitir el inicio de sesión local o el inicio de sesión de escritorio remoto, y cualquier otra cosa que desee hacer para bloquear esta cuenta.

4) Inicie sesión (ya sea de forma local o mediante escritorio remoto) como su usuario no administrador, 'ccnet' en este ejemplo.

5) Abra un terminal de comando, y use el comando 'runas' para ejecutar lo que sea que necesite ejecutarse escalado. Use la opción/savecred. Especifique su nuevo usuario administrativo.

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

La primera vez que se le pedirá 'contraseña de iis_helper. Después de eso, se almacenará gracias a la opción/savecred (esta es la razón por la que lo estamos ejecutando una vez desde un símbolo del sistema real, por lo que podemos ingresar la contraseña una vez).

6) Suponiendo que el comando se haya ejecutado bien, ahora puede cerrar la sesión. Luego, inicié sesión como administrador local y apagué el usuario 'ccnet' para el inicio de sesión interactivo local y el escritorio remoto. La cuenta solo se usa para ejecutar un servicio, pero no hay inicios de sesión reales. Este no es un paso obligatorio.

7) Configure su servicio para que se ejecute como su cuenta de usuario ('ccnet').

8) Configure el servicio que se esté ejecutando (CruiseControl.NET en mi caso) para ejecutar el comando 'runas' en lugar de 'appcmd.exe' directamente, el mismo que antes:

reemplazar:

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

con:

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

Lo observar que el comando debe estar en un conjunto de comillas, con todas las comillas internas escapadas (comillas).

9) Pruebe, llámelo un día, vaya al pub local.


Editar: Me hizo parecer # 9 en el orden equivocado y tenía algunos demasiados antes de la prueba ...

Este método también no funciona por completo. Es intenta intentar ejecutarse como la cuenta administrativa, sin embargo, todavía se ejecuta como un proceso no escalado bajo el usuario administrativo, por lo que todavía no hay permisos de administrador. Inicialmente no capté el error porque el comando 'runas' genera una ventana de cmd separada y luego se cierra de inmediato, por lo que no estaba viendo la salida de falla.

Está empezando a parecer que la única posibilidad real podría ser escribir un servicio de Windows que se ejecutará como administrador, y su único propósito es ejecutar appcmd.exe, y de alguna manera llamar a ese servicio para iniciar/detener IIS.

No es genial cómo UAC está allí para asegurar cosas, pero en realidad solo deshace más servidores, porque todo lo que quieras hacer es administrar, así que es más fácil simplemente ejecutar todo como administrador y olvidar ¿eso?

+0

acaba de elaborar un paso más allá, la 'agradable' pensar en usar 2 cuentas aquí es que mi servicio CruiseControl.net no se está ejecutando como administrador, el proceso de construcción no se está ejecutando como administrador, las pruebas unitarias no se están ejecutando como administrador, etc. ... sólo el inicio/parada de IIS se ejecuta como administrador, y no se puede iniciar sesión en el cuadro de forma local o remota a través de escritorio de cualquiera de las cuentas. Encuentro esto bastante seguro ... y mucho mejor que deshabilitar el UAC o ejecutar todo el proceso como administrador. – CodingWithSpike

7

El msbuild community tasks incluye un AppPoolController que parece hacer lo que quiera (aunque como se ha señalado que está anticuado y en la actualidad sólo es compatible con IIS6.) Un ejemplo:

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

Tenga en cuenta que también puede proporcionar un nombre de usuario y una contraseña si es necesario.

Edición: Recién noté que el MSBuild Extension Pack tiene una tarea Iis7AppPool que es probablemente más apropiada.

+0

Solo suplido para IIS6 NO para IIS7 – Adam

+0

@ Adam - Ah ... No lo había visto en la documentación. Parece que la enumeración IISVersion tiene las versiones compatibles, que sólo incluye actualmente 4-6. – Pedro

+1

1 de MSBuild Extension Pack – ongle

3

Este article describe el uso de un archivo htm llamado App_offline.htm para desconectar un sitio. Una vez que el IIS detectes este archivo en la raíz de un directorio de aplicaciones web,

ASP.NET 2.0 se cerrará hacia abajo la aplicación, descarga la aplicación dominio desde el servidor, y detener el procesamiento de nuevas solicitudes entrantes para esa aplicación.

En App_offline-htm, puede poner un mensaje fácil de usar que indique que el sitio está actualmente bajo mantenimiento.

Jason Lee muestra las llamadas MSDeploy que necesita utilizar (¡y mucho más acerca de la integración de estos pasos en sus scripts de compilación!).

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 

Después de despliegue, puede eliminar el archivo app_offline.htm utilizando la siguiente llamada:

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