2009-09-08 11 views
10

Wie kann ich einen IIS 7-Anwendungspool stoppen und anschließend neu starten, indem ich ein MSBuild-Skript in TeamCity starte. Ich möchte unsere nächtlichen Builds auf einem IIS-Server bereitstellen, damit sie von Austestern angezeigt werden können.Beenden Sie den IIS 7-Anwendungspool aus dem Buildskript

Ich habe mit appcmd versucht, wie so:

appcmd stop apppool /apppool.name:MYAPP-POOL 

... aber ich habe in Windows 2008, die bisher hinderte mich daran, in der Lage zu laufen diesen Befehl von meinem Teamcity Build-Prozess in Höhe Probleme laufen weil Windows 2008 eine Erhöhung erfordert, um appcmd auszuführen.

Wenn ich den Anwendungspool nicht beendet habe, bevor ich meine Dateien auf den Webserver kopiert habe, kann mein MSBuild-Skript die Dateien nicht auf den Server kopieren.

Hat jemand anderes dieses Problem bei der Bereitstellung von IIS-Websites von TeamCity gesehen und gelöst?

+0

ich das gleiche Problem mit CruiseControl.NET haben. Ich habe ein Projekt, das IIS stoppen/starten muss, aber nicht den gesamten CruiseControl-Dienst als erhöhtes Konto ausführen. – CodingWithSpike

Antwort

0

Sie können versuchen, die Build Agent Service-Einstellungen so zu ändern, dass sie sich als normales Benutzerkonto anstelle von SYSTEM (Standard) anmelden. Dies kann über das Dienststeuerungsfeld (Start | Ausführen | services.msc) erfolgen.

Wenn es nicht hilft, können Sie auch versuchen, die appcmd so zu konfigurieren, dass sie immer erhöht ausgeführt wird. Weitere Informationen finden Sie unter this document.

Falls diese Option nicht für appcmd verfügbar ist oder immer noch nicht funktioniert, können Sie die Benutzerkontensteuerung für diesen Benutzer vollständig deaktivieren.

+0

Danke für die Vorschläge. appCmd ​​ist eine Systemdatei, daher sieht es so aus, als ob sie nicht so konfiguriert werden kann, dass sie immer auf erhöht ausgeführt wird. Ich bin unter einem dedizierten Benutzerkonto, aber es kontaktiert immer noch nicht den WAS-Dienst beim Versuch, appcmd von meinem Build-Server –

+0

ausführen Versuchen Sie, die Benutzerkontensteuerung für den Benutzer deaktivieren, der den Build-Agent ausführt. Versuchen Sie, den Agenten mithilfe der BAT-Datei anstelle des Dienstes auszuführen. – CrazyCoder

1

dies ist die ziemlich hackey Abhilfe, die ich am Ende mit:

1) ein limitierte Zugriffskonto für Ihren Dienst einrichten, wie zu laufen. Da ich einen CruiseControl.NET-Dienst betreibe, rufe ich meinen Benutzer 'ccnet' an. Er hat keine Administratorrechte.

2) Erstellen Sie ein neues lokales Benutzerkonto und weisen Sie es der Gruppe Administratoren zu (ich nenne ihn 'iis_helper' für dieses Beispiel). Gib ihm ein Passwort und setze es so, dass es niemals abläuft.

3) Ändern Sie die Zugriffsberechtigungen von iis_helper so, dass die lokale Anmeldung oder die Anmeldung am Remote-Desktop NICHT erlaubt wird und alles, was Sie sonst noch tun möchten, um dieses Konto zu sperren.

4) Melden Sie sich (entweder lokal oder über den Remote-Desktop) als Ihr Nicht-Admin-Benutzer an, in diesem Beispiel "ccnet".

5) Öffnen Sie ein Befehls-Terminal, und verwenden Sie den Befehl 'runas', um alles auszuführen, was ausgeführt werden muss. Verwenden Sie die Option/savecred. Geben Sie Ihren neuen administrativen Benutzer an.

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

Beim ersten Mal werden Sie zur Eingabe des Passworts 'iis_helper aufgefordert. Danach wird es dank der Option/savecred gespeichert (deshalb führen wir es einmal von einer echten Eingabeaufforderung aus, so dass wir das Passwort einmal eingeben können).

6) Vorausgesetzt, dass der Befehl OK ausgeführt wurde, können Sie sich jetzt abmelden. Ich habe mich dann als lokaler Administrator angemeldet und den Benutzer 'ccnet' für die lokale interaktive Anmeldung und den Remote-Desktop deaktiviert. Das Konto wird nur zum Ausführen eines Dienstes verwendet, aber keine echten Anmeldungen. Dies ist kein obligatorischer Schritt.

7) Richten Sie Ihren Dienst so ein, dass er als Ihr Benutzerkonto ('ccnet') ausgeführt wird.

8) Konfigurieren Sie den laufenden Dienst (CruiseControl.NET in meinem Fall) den 'runas' Befehl anstelle von 'appcmd.exe' direkt auszuführen, die gleichen wie zuvor:

ersetzen:

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

mit:

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

Die Sache Zu bemerken ist, dass der Befehl in einer Menge von Anführungszeichen stehen sollte, wobei alle inneren Anführungszeichen maskiert sind (slash-quote).

9) Testen Sie, rufen Sie es einen Tag, schlagen Sie die lokale Kneipe.


bearbeiten: Ich habe anscheinend # 9 in der falschen Reihenfolge und hatte auch ein paar viele vor dem Test ...

Diese Methode funktioniert nicht vollständig auch. Es versucht , als das administrative Konto auszuführen, jedoch wird es weiterhin als ein nicht escalierter Prozess unter dem administrativen Benutzer ausgeführt, also noch keine Administrator-Berechtigungen. Ich habe den Fehler zunächst nicht abgefangen, weil der Befehl 'runas' ein separates cmd-Fenster erzeugt und sich dann sofort schließt, sodass ich die Ausgabe des Fehlers nicht sah.

Es scheint, als wäre die einzige echte Möglichkeit, einen Windows-Dienst zu schreiben, der als admin läuft, und sein einziger Zweck ist, appcmd.exe auszuführen und dann diesen Dienst irgendwie aufzurufen, um IIS zu starten/stoppen.

Ist es nicht großartig, wie UAC ist, um Dinge zu sichern, aber in Wirklichkeit nur mehr Server ungesichert, weil alles, was Sie tun möchten, müssen Sie als Admin tun, so ist es einfacher, einfach immer alles als Admin laufen und vergessen es?

+0

nur um einen Schritt weiter zu gehen, das 'nette' Denken über die Verwendung von 2 Konten hier ist, dass mein CruiseControl.net Dienst nicht als Admin ausgeführt wird, der Buildprozess läuft nicht als Admin, die Komponententests laufen nicht als Admin usw ... nur der Start/Stopp von IIS wird als admin ausgeführt, und Sie können sich nicht von jedem Konto lokal oder über den Remote-Desktop bei der Box anmelden. Ich finde das ziemlich sicher ... und viel besser, als UAC zu deaktivieren oder den gesamten Prozess als Admin auszuführen. – CodingWithSpike

7

Die msbuild community tasks enthält einen AppPoolController dass das, was Sie tun möchten, erscheint (obwohl wie erwähnt es datiert ist und derzeit unterstützt nur IIS6. ein Beispiel):

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

Beachten Sie, dass Sie auch einen Benutzernamen und Passwort bei Bedarf zur Verfügung stellen kann.

Edit: Gerade bemerkt, dass die MSBuild Extension Pack eine Iis7AppPool Aufgabe hat, die wahrscheinlich besser geeignet ist.

+0

Nur unterstützt für IIS6 NICHT für IIS7 – Adam

+0

@Adam - Ah ... Hatte nicht in der Dokumentation gesehen. Sieht so aus, als hätte das IISVersion-Enum die unterstützten Versionen, die momentan nur 4-6 enthalten. – Pedro

+1

+1 für MSBuild Extension Pack – ongle

3

Diese article beschreibt die Verwendung einer HTM-Datei namens App_offline.htm, um eine Site offline zu nehmen. Sobald die IIS diese Datei in der Wurzel eines Webapplikationsverzeichnis detectes,

ASP.NET 2.0 wird die Anwendung Abfahren, entladen die Anwendung Domäne von dem Server, und stoppt die Verarbeitung keine neue eingehenden Anfragen für diese Anwendung.

In App_offline-htm können Sie eine benutzerfreundliche Nachricht eingeben, die angibt, dass die Site derzeit gewartet wird.

Jason Lee zeigt die MSDeploy-Aufrufe, die Sie verwenden müssen (plus viel mehr über die Integration dieser Schritte in Ihre Build-Skripts!).

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 

Nach der Bereitstellung können Sie die app_offline.htm Datei mit dem folgenden Aufruf entfernen:

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