Freigeben über


Verwalten von Arbeitsprozessen und AppDomains in IIS 7 mit WMI

von Tim Ammann

Mit WMI-Skripting können Sie Arbeitsprozesse und Anwendungsdomänen (AppDomains) in IIS relativ einfach verwalten. IIS-Arbeitsprozesse werden vom Windows Process Activation Service (WAS) und von W3wp.exeausgeführt. Arbeitsprozesse können AppDomains enthalten, die in der Regel als Reaktion auf eine Anforderung für eine .aspx Seite erstellt werden.

In diesem Artikel wird beschrieben, wie Sie mit nur wenigen Zeilen VBScript die folgenden Aufgaben ausführen:

  • Anzeigen der aktuell ausgeführten Anforderungen für einen Arbeitsprozess
  • Abrufen des Status aller Arbeitsprozesse
  • Entladen einer bestimmten AppDomain oder aller AppDomains
  • Alle AppDomains und deren Eigenschaften anzeigen

Erste Schritte

  1. Stellen Sie sicher, dass IIS und Skripts aktiviert sind.

    a) Wenn Sie Windows Vista verwenden, öffnen Sie die Systemsteuerung, Programme und Features und dann Windows-Features. Wählen Sie unter "Webverwaltungstools" die Option "IIS-Verwaltungsskripts und -tools" aus, um skripting zu aktivieren. b. Wenn Sie Windows Server® 2008 verwenden, öffnen Sie den Server-Manager. Verwenden Sie den Assistenten zum Hinzufügen von Rollen, um den IIS-Webserver zu installieren. Wählen Sie auf der Seite "Rollendienste auswählen" im Abschnitt "Verwaltungstools" die Option "IIS-Verwaltungsskripts und -tools" aus.

  2. Führen Sie Befehle als Administrator aus. Um ein Eingabeaufforderungsfenster mit erhöhten Rechten zu öffnen, klicken Sie auf "Start", zeigen Sie auf "Alle Programme", klicken Sie auf "Zubehör", klicken Sie mit der rechten Maustaste auf "Eingabeaufforderung", und klicken Sie dann auf "Als Administrator ausführen". Wenn Sie eine Befehlsshell als Administrator öffnen, werden alle Anwendungen, die Sie über diese Befehlsshell ausführen, als Administrator ausgeführt.

  3. Speichern Sie die Skriptdateien im Textformat mit der Erweiterung .vbs. Sie können an der Eingabeaufforderung mithilfe der Syntax "cscript.exe <scriptname.vbs>" ausgeführt werden.

  4. Bevor Sie beginnen, erstellen Sie eine Sicherung der System32-\inetsrv\config\applicationhost.config Datei mit dem AppCmd-Tool. Mit der Sicherungskopie können Sie IIS in seinen ursprünglichen Zustand wiederherstellen, indem Sie einfach die Originalversion über die neuere Version kopieren. Führen Sie die folgenden Schritte aus, um eine Sicherung zu erstellen:

    a) Öffnen Sie ein Eingabeaufforderungsfenster mit erhöhten Rechten.
    b. Geben Sie cd %Windir%\system32\inetsrv\ "c.Type appcmd" ein, um backupName zur Sicherung der ApplicationHost.config Datei hinzuzufügen, wobei "backupName " der Name ist, den Sie für die Sicherung angeben. Ein Verzeichnis mit dem von Ihnen angegebenen Sicherungsnamen wird unter dem %Windir%\system32\inetsrv\backup Verzeichnis erstellt. Wenn Sie keinen Namen angeben, generiert appcmd automatisch einen Verzeichnisnamen mithilfe des aktuellen Datums und der aktuellen Uhrzeit.

Arbeitsprozesse

In diesem Abschnitt wird gezeigt, wie Sie die derzeit ausgeführten Anforderungen für jeden Arbeitsprozess auf einem Webserver abrufen. Anschließend erfahren Sie, wie Sie die einzelnen Arbeitsprozesse PID, Status und den Anwendungspool anzeigen, zu dem er gehört.

Abrufen von Ausführungsanforderungen

Ein spannendes neues Feature von IIS ist die Möglichkeit, die Anforderungen anzuzeigen, die derzeit in einem Arbeitsprozess ausgeführt werden. Dazu können Sie die WorkerProcess.GetExecutingRequests-Methode verwenden.

Die WorkerProcess.GetExecutingRequests-Methode liefert eine Momentaufnahme der Anfragen, die während der Ausführung der Methode bearbeitet wurden. Da die meisten Anforderungen sehr schnell ausgeführt werden, ist es möglicherweise nicht einfach, die Methode manuell mit einem Webbrowser zu testen. Aus diesem Grund erstellen Sie nur für diesen Zweck eine Webseite.

Verwenden Sie Notepad, um den folgenden Text in eine Textdatei zu schreiben. Speichern Sie die Datei dann mit dem Namen Sleep.aspx.

<%  System.Threading.Thread.Sleep(30000)
Response.Write ("I'm finally finished...") %>

Legen Sie die Sleep.aspx Datei in das Inhaltsverzeichnis der Standardwebsite ein: %systemdrive%\inetpub\wwwroot.

Die Datei Sleep.aspx, die Sie erstellt haben, erzwingt, dass die Anforderung für die Webseite 30 Sekunden dauert. Dadurch erhalten Sie Zeit zum Ausführen eines Skripts, das GetExecutingRequests in Aktion anzeigt.

Die GetExecutingRequests-Methode verwendet eine leere Arrayvariable als OUT-Parameter, die dann mit HttpRequest-Objekten gefüllt wird. Sie können diese Anfragen durchlaufen, um die Attribute jeder Anfrage anzuzeigen. Das folgende Skript verwendet die HttpRequest-Objektausgabe und zeigt das aktuelle Modul, das Verb, den Hostnamen und die URL für jede Anforderung an.

Kopieren Sie das folgende Skript in den Editor und speichern Sie es mit dem Dateinamen "GetRequests.vbs".

Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
Set oWorkerProcesses = oWebAdmin.InstancesOf("WorkerProcess")
     
For Each oWorkerProcess In oWorkerProcesses
    ' Place the requests queued for a process into an array variable.
    oWorkerProcess.GetExecutingRequests arrReqs
    
    ' Show the number of requests queued.
    If IsNull(arrReqs) Then
        WScript.Echo "No currently executing requests."

    Else
        ' Display the number of requests.
        WScript.Echo "Number of currently executing requests: " & _
            UBound(arrReqs) + 1
        WScript.Echo
  
        ' List the properties of each request.
        For Each oRequest In arrReqs
            WScript.Echo "Module: " & "[" & oRequest.CurrentModule & "]"
            WScript.Echo "Verb:" & "[" & oRequest.Verb & "]"
            WScript.Echo "HostName: " & "[" & oRequest.HostName & "]"
            WScript.Echo "Url: " & "[" & oRequest.Url & "]"
            WScript.Echo
        Next
    End If
Next

Öffnen Sie ein Eingabeaufforderungsfenster mit erhöhten Rechten, und navigieren Sie zu dem Verzeichnis, in dem Sie die Datei "GetRequests.vbs" gespeichert haben.

Bevor Sie das Skript ausführen, geben Sie http://localhost/sleep.aspx in die Adressleiste eines Webbrowsers ein. Dadurch wird die Ausführung der Anforderung gestartet, und der Browser wartet 30 Sekunden lang, während die Sleep.aspx-Seite gerendert wird.

Während der Browser noch auf das Rendern der Seite wartet, führen Sie das Skript aus, indem Sie Folgendes in das soeben geöffnete Eingabeaufforderungsfenster eingeben:

Cscript.exe GetRequests.vbs

Beispielausgabe

Die angezeigte Ausgabe sollte wie folgt aussehen.

Number of currently executing requests: 2
Module: [ManagedPipelineHandler]
Verb:[GET]
HostName: [localhost]
Url: [/MyApp/]
Module: [ManagedPipelineHandler]
Verb:[GET]
HostName: [localhost]
Url: [/MyApp/default.aspx]

Abrufen des Status eines Arbeitsprozesses

Das WorkerProcess-Objekt im IIS-WMI-Anbieter verfügt über eine GetState-Methode, die anzeigt, ob ein Arbeitsprozess gestartet, ausgeführt oder beendet wird. WorkerProcess hat auch zwei Eigenschaften, die uns hier interessieren: ApplicationPool und PID. Die Eigenschaft ApplicationPool stellt den Anwendungspool dar, dem der Arbeitsprozess angehört. Die PID-Eigenschaft enthält die Prozess-ID, die den Arbeitsprozess eindeutig identifiziert.

Sie können den folgenden Code verwenden, um jede PiD und jeden Zustand des Arbeitsprozesses und dessen Anwendungspool auflisten. Wenn keine Arbeitsprozesse ausgeführt werden, wird das Skript stillschweigend beendet. Kopieren Sie den Code in den Editor "Notepad" und speichern Sie ihn mit dem Dateinamen "GetState.vbs".

' Connect to the WMI WebAdministration namespace. 
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration") 
       
' Get the worker process instances. 
Set oWorkerProcesses = oWebAdmin.InstancesOf("WorkerProcess") 
       
' Get the ID of each worker process in the application pool and report its status. 
For Each oWorkerProcess In oWorkerProcesses 
       
    ' Report the worker process state via the GetStateDescription helper function. 
    WScript.Echo "WorkerProcess " & oWorkerProcess.ProcessID & ": " & _ 
        GetStateDescription(oWorkerProcess.GetState) 
    WScript.Echo "Application Pool: " & oWorkerProcess.AppPoolName
    WScript.Echo 
Next 

' The helper function translates the return value into text. 
Function GetStateDescription(StateCode) 
    Select Case StateCode 
        Case 0 
            GetStateDescription = "Starting" 
        Case 1 
            GetStateDescription = "Running" 
        Case 2 
            GetStateDescription = "Stopping" 
        Case 3 
            GetStateDescription = "Unknown" 
       
        Case Else 
            GetStateDescription = "Undefined value." 
    End Select 
End Function

Öffnen Sie ein Eingabeaufforderungsfenster mit erhöhten Rechten, und navigieren Sie zu dem Verzeichnis, in dem Sie die Datei "GetState.vbs" gespeichert haben. Führen Sie das Skript aus, indem Sie Folgendes in das soeben geöffnete Eingabeaufforderungsfenster eingeben:

Cscript.exe GetState.vbs

Beispielausgabe

Ihre Ausgabe sollte wie folgt aussehen:

WorkerProcess 1336: Running 
Application Pool: DefaultAppPool 
       
WorkerProcess 3680: Running 
Application Pool: Classic .NET AppPool 
       
WorkerProcess 1960: Running 
Application Pool: NewAppPool

Nachdem Sie nun gelernt haben, WMI-Skripting zu verwenden, um die Geheimnisse von Arbeitsprozessen aufzudecken, führen Sie die gleichen Schritte für Anwendungsdomänen aus.

AppDomains

Wenn eine Anforderung für eine ASP.NET-Seite erstmals empfangen wird, erstellt das IIS-Verwaltungsmodul eine Anwendungsdomäne (AppDomain) im Arbeitsspeicher. Die AppDomain verarbeitet Anforderungen für ASPX-Seiten oder eine beliebige Seite, die verwalteten Code verwendet. Das Entladen und Aufzählen von AppDomains mithilfe von WMI ist einfach, und in diesem Abschnitt wird gezeigt, wie Sie beides tun.

Entladen einer bestimmten AppDomain

Das Entladen von AppDomain in IIS 7 und höher funktioniert etwas anders als in IIS 6.0. Während der IIS 6.0 AppUnload-Befehl out-of-process ASP-Anwendungen entladen hat, entlädt IIS 7 und höher mit der Methode "AppDomain.Unload" nur ASP.NET Anwendungsdomänen. Die AppUnload-Funktion ist verschwunden, da der unterstützte IIS 5.0-Kompatibilitätsmodus in IIS 7 und höher nicht mehr vorhanden ist.

Zum Entladen einer bestimmten AppDomain müssen Sie in der Lage sein, sie eindeutig zu identifizieren. AppDomain-Objekte verfügen über drei Schlüsseleigenschaften: ApplicationPath, ID und SiteName. Eine davon reicht jedoch möglicherweise für Ihre Zwecke aus.

Übrigens ist die Eigenschaft "AppDomain-ID" keine Zahl, sondern ein Pfad, der wie folgt aussieht:

/LM/W3SVC/1/ROOT

Die "1" im aufgelisteten Pfad ist die Website-ID (standardmäßig entspricht 1 der Standardwebsite.) Wenn Sie zuerst eine Liste der AppDomains ihres Servers und deren Eigenschaften generieren müssen, lesen Sie den Abschnitt "Aufzählen von AppDomains" weiter unten in diesem Artikel.

Das nächste Skript entlädt die AppDomain mit dem Namen "Northwind". Das Skript durchläuft die verfügbaren AppDomains, bis es das Skript mit dem entsprechenden ApplicationPath findet. Kopieren Sie den Code in den Editor, ersetzen Sie "Northwind" durch den AppDomain-Anwendungspfad Ihrer Wahl, und speichern Sie die Datei mit dem Namen "AppDomainUnload.vbs".

Öffnen Sie ein Eingabeaufforderungsfenster mit erhöhten Rechten, und navigieren Sie zu dem Verzeichnis, in dem Sie die Datei "AppDomainUnload.vbs" gespeichert haben. Führen Sie das Skript aus, indem Sie Folgendes in das soeben geöffnete Eingabeaufforderungsfenster eingeben:

Cscript.exe AppDomainUnload.vbs
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
Set oAppDomains = oWebAdmin.ExecQuery("SELECT * FROM AppDomain")

' Unload only the Northwind application domain.
For Each oAppDomain In oAppDomains
    If oAppDomain.ApplicationPath = "/Northwind/" Then 
        oAppDomain.Unload
        Exit For 
    End If 
Next

Entladen aller AppDomains

Das Entladen aller AppDomains auf einem Server ist noch einfacher: Sie rufen sie einfach ab, durchlaufen sie und entladen sie wiederum.

Im folgenden Beispiel werden alle Anwendungsdomänen auf einem IIS-Webserver entladen. Beachten Sie, wie eine einfache WQL-Abfrage (WQL ist die WMI-Version von SQL) verwendet wird, um die AppDomains abzurufen.

Kopieren Sie den Code in den Editor, und speichern Sie die Datei mit dem Namen "AppDomainUnloadAll.vbs". Öffnen Sie ein Eingabeaufforderungsfenster mit erhöhten Rechten, und navigieren Sie zu dem Verzeichnis, in dem Sie die Datei "AppDomainUnloadAll.vbs" gespeichert haben. Führen Sie das Skript aus, indem Sie Folgendes in das soeben geöffnete Eingabeaufforderungsfenster eingeben:

Cscript.exe AppDomainUnloadAll.vbs
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")

' Get all the application domains on the Web server.
Set oAppDomains = oWebAdmin.ExecQuery("SELECT * FROM AppDomain")

' Unload all the application domains.
For Each oAppDomain In oAppDomains
    oAppDomain.Unload
Next

Als Alternative zur WQL-Abfragesyntax können Sie die WMI InstancesOf-Methode wie zuvor mit WorkerProcess verwenden:

Set oAppDomains = oWebAdmin.InstancesOf("AppDomain")

Auflistung von AppDomains

Sie können alle derzeit ausgeführten AppDomains und deren Eigenschaften anzeigen, indem Sie einen Ansatz verwenden, der dem der vorherigen Skripts ähnelt. Hier ist eine Liste der AppDomain-Eigenschaften:

  • ApplicationPath
  • ID
  • IsIdle
  • Physischer Pfad
  • Prozess-ID
  • SiteName

Das folgende Skript zeigt alle Eigenschaften für jede AppDomain mit Ausnahme der Eigenschaft "Physischer Pfad", aber Sie können dies einfach genug hinzufügen. Aus Gründen der Einfachheit zeigt das Skript die Schlüssel- und Laufzeiteigenschaften separat an.

Kopieren Sie den Code in den Editor und speichern Sie die Datei mit dem Namen "AppDomainProps.vbs". Öffnen Sie ein Eingabeaufforderungsfenster mit erhöhten Rechten, und navigieren Sie zu dem Verzeichnis, in dem Sie die Datei "AppDomainProps.vbs" gespeichert haben. Führen Sie das Skript aus, indem Sie Folgendes in das soeben geöffnete Eingabeaufforderungsfenster eingeben:

Cscript.exe AppDomainProps.vbs
'Connect to the WMI WebAdministration namespace
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
Set oAppDomains = oWebAdmin.InstancesOf("AppDomain")
WScript.Echo "AppDomain Count: " & oAppDomains.Count
WScript.Echo 
ADCounter = 0
For Each oAppDomain In oAppDomains
    ADCounter = ADCounter + 1
    WScript.Echo "---- AppDomain " & ADCounter & " of " & _
                oAppDomains.Count & " ----" & vbCrLf
    WScript.Echo "[ Key properties ]"
    WScript.Echo "ID: " & oAppDomain.ID
    WScript.Echo "Site Name: " & oAppDomain.SiteName
    WScript.Echo "Application Path: " & oAppDomain.ApplicationPath
    WScript.Echo
    WScript.Echo "[ Run-time properties ]"
    WScript.Echo "Process ID: " & oAppDomain.ProcessID
    WScript.Echo "Is idle: " & oAppDomain.IsIdle
    WScript.Echo vbCrLf
Next

Beispielausgabe

Ihre Ausgabe sollte wie folgt aussehen:

AppDomain Count: 3
---- AppDomain 1 of 3 ----
[ Key properties ]
ID: /LM/W3SVC/1/ROOT
Site Name: Default Web Site
Application Path: /

[ Run-time properties ]
Process ID: 3608
Is idle: False

---- AppDomain 2 of 3 ----
[ Key properties ]
ID: /LM/W3SVC/2/ROOT/ContosoApp
Site Name: ContosoSite
Application Path: /ContosoApp/

[ Run-time properties ]
Process ID: 3608
Is idle: True

---- AppDomain 3 of 3 ----
[ Key properties ]
ID: /LM/W3SVC/1/ROOT/Fabrikam
Site Name: Default Web Site
Application Path: /Fabrikam/

[ Run-time properties ]
Process ID: 2552
Is idle: False

Fazit

In diesem Artikel wurden einige grundlegende WMI-Skripttechniken zum Abrufen von Informationen zu IIS-Arbeitsprozessen und AppDomains gezeigt. Die WMI InstanceOf-Methode und WQL-Abfragen wurden verwendet, um sie abzurufen. Hier ist eine kurze Übersicht über die vorgestellten Aufgaben und die verwendeten Methoden:

  • Anzeigen der derzeit ausgeführten Anforderungen für einen Arbeitsprozess: WorkerProcess.GetExecutingRequests
  • Abrufen des Status aller Arbeitsprozesse: WorkerProcess.GetState
  • Entladen einer bestimmten AppDomain oder aller AppDomains: AppDomain.Unload