2009-09-08 8 views
10

Comment puis-je arrêter, puis redémarrer un pool d'applications IIS 7 à partir d'un script MSBuild exécuté dans TeamCity. Je veux déployer nos builds nocturnes sur un serveur IIS pour que les testeurs puissent les voir.Arrête le pool d'applications IIS 7 à partir du script de génération

J'ai essayé d'utiliser appcmd comme ceci:

appcmd stop apppool /apppool.name:MYAPP-POOL 

... mais j'ai rencontrer des problèmes d'élévation dans Windows 2008 que jusqu'à présent me ont cessé d'être en mesure d'exécuter cette commande de mon processus de construction de TeamCity car Windows 2008 nécessite une élévation pour exécuter appcmd.

Si je n'arrête pas le pool d'applications avant de copier mes fichiers sur le serveur Web, mon script MSBuild est incapable de copier les fichiers sur le serveur.

Est-ce que quelqu'un d'autre a vu et résolu ce problème lors du déploiement de sites Web sur IIS à partir de TeamCity?

+0

J'ai le même problème avec CruiseControl.NET. J'ai un projet dont j'ai besoin pour arrêter/démarrer IIS, mais PAS pour exécuter le service CruiseControl entier en tant que compte élevé. – CodingWithSpike

Répondre

0

Vous pouvez essayer de modifier les paramètres du service Build Agent pour ouvrir une session en tant que compte d'utilisateur normal au lieu de SYSTEM (par défaut), à partir du panneau de contrôle des services (Démarrer | Exécuter | services.msc).

Si cela ne vous aide pas, vous pouvez également essayer de configurer l'appcmd pour toujours l'élever, référez-vous à this document pour plus de détails.

Si cette option n'est pas disponible pour appcmd ou si elle ne fonctionne toujours pas, vous pouvez désactiver complètement l'UAC pour cet utilisateur.

+0

Merci pour les suggestions. appCmd ​​est un fichier système, il semble qu'il ne peut pas être configuré pour toujours être élevé. Je suis sous un compte d'utilisateur dédié mais il ne parvient toujours pas à contacter le service WAS lorsque j'essaie d'exécuter appcmd depuis mon serveur de build –

+0

Essayez de désactiver le contrôle de compte d'utilisateur pour l'utilisateur exécutant l'agent de construction. Essayez d'exécuter l'agent en utilisant le fichier .bat au lieu du service. – CrazyCoder

1

c'est la solution de contournement assez hackey je me suis retrouvé à l'aide:

1) Mettre en place un compte d'accès limité à votre service pour fonctionner comme. Comme j'utilise un service CruiseControl.NET, j'appelle mon utilisateur 'ccnet'. Il n'a pas de droits d'administrateur.

2) Créez un nouveau compte utilisateur local et affectez-le au groupe Administrateurs (je l'appellerai 'iis_helper' pour cet exemple). Donnez-lui un mot de passe, et réglez-le pour qu'il n'expire jamais. 3) Modifier les autorisations d'accès de iis_helper pour NE PAS autoriser la connexion locale ou la connexion au bureau à distance, et tout ce que vous pourriez vouloir faire pour verrouiller ce compte.

4) Connectez-vous (localement ou par l'intermédiaire du bureau distant) en tant que votre utilisateur non administrateur, 'ccnet' dans cet exemple.

5) Ouvrez un terminal de commande et utilisez la commande 'runas' pour exécuter tout ce qui doit être exécuté. Utilisez l'option/savecred. Indiquez votre nouvel utilisateur administratif.

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

La première fois, il vous demandera le mot de passe de 'iis_helper'. Après cela, il sera stocké grâce à l'option/savecred (c'est pourquoi nous l'exécutons une fois à partir d'une vraie invite de commande, donc nous pouvons entrer le mot de passe une fois).

6) En supposant que la commande soit OK, vous pouvez maintenant vous déconnecter. Je me suis ensuite reconnecté en tant qu'administrateur local et j'ai désactivé l'utilisateur 'ccnet' pour la connexion interactive locale et le bureau distant. Le compte est uniquement utilisé pour exécuter un service, mais pas de véritables connexions. Ce n'est pas une étape obligatoire.

7) Configurez votre service pour qu'il fonctionne en tant que votre compte d'utilisateur ('ccnet').

8) Configurez le service en cours d'exécution (CruiseControl.NET dans mon cas) pour exécuter la commande 'runas' au lieu de 'appcmd.exe' directement, le même que précédemment:

remplacerons:

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

avec:

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

La chose Il est à noter que la commande doit être dans un ensemble de guillemets, avec toutes les guillemets internes échappés (slash-quote). 9) Testez, appelez-le un jour, rendez-vous au pub local.


Modifier: Je apparemment fait # 9 dans le mauvais ordre et avait un peu trop avant le test ...

Cette méthode ne fonctionne pas non plus complètement. Il tente de s'exécuter en tant que compte administratif, mais il s'exécute toujours comme un processus non escaladé sous l'utilisateur administratif, donc toujours pas d'autorisations d'administration. Au début, je n'ai pas détecté l'échec car la commande 'runas' génère une fenêtre cmd séparée puis se ferme immédiatement, donc je ne voyais pas la sortie de l'échec. Son début semble être la seule possibilité réelle d'écrire un service Windows qui s'exécutera en tant qu'administrateur, et son seul but est d'exécuter appcmd.exe, puis d'appeler en quelque sorte ce service pour démarrer/arrêter IIS.

N'est-ce pas génial de savoir comment UAC est là pour sécuriser les choses, mais en réalité ne sécurise pas plus de serveurs, parce que tout ce que vous voulez faire, vous devez faire comme administrateur, il est donc plus facile il?

+0

juste pour élaborer un peu plus loin, le «gentil» penser à utiliser 2 comptes ici est que mon service CruiseControl.net ne fonctionne pas en tant qu'administrateur, le processus de construction ne fonctionne pas en tant qu'administrateur, les tests unitaires n'exécutent pas en admin, etc. ... seul le démarrage/l'arrêt d'IIS est exécuté en tant qu'administrateur et vous ne pouvez pas vous connecter à la boîte localement ou via le bureau distant à partir de l'un ou l'autre compte. Je trouve cela assez sécurisé ... et bien mieux que de désactiver le contrôle de compte d'utilisateur ou d'exécuter tout le processus en tant qu'administrateur. – CodingWithSpike

7

Le msbuild community tasks comprend un AppPoolController qui semble faire ce que vous voulez (mais comme il est indiqué qu'il est daté et à l'heure actuelle ne supporte que IIS6. Un exemple:

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

Notez que vous pouvez également fournir un nom d'utilisateur et un mot de passe si nécessaire. Edit: J'ai juste remarqué que le MSBuild Extension Pack a une tâche Iis7AppPool probablement plus appropriée.

+0

Seulement supporté pour IIS6 PAS pour IIS7 – Adam

+0

@Adam - Ah ... N'a pas vu cela dans la documentation. On dirait que l'enum IISVersion a les versions supportées, qui inclut seulement 4-6 actuellement. – Pedro

+1

+1 pour MSBuild Extension Pack – ongle

3

Cette article décrit l'utilisation d'un fichier htm nommé App_offline.htm pour mettre un site hors connexion. Une fois que l'IIS detectes ce fichier à la racine d'un répertoire d'applications Web,

ASP.NET 2.0 d'arrêt de l'application, décharger l'application domaine du serveur, et arrêter le traitement des nouvelles demandes entrantes pour cette application.

Dans App_offline-htm, vous pouvez mettre un message convivial indiquant que le site est actuellement en maintenance.

Jason Lee montre les appels MSDeploy que vous devez utiliser (plus beaucoup plus sur l'intégration de ces étapes dans vos scripts de construction!).

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 

Après le déploiement, vous pouvez supprimer le fichier App_offline.htm en utilisant l'appel suivant:

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