Question

I have a batch file that uses the following script to recycle MyAppPool.

cscript.exe %windir%\system32\iisapp.vbs /a MyAppPool /r

However when MyAppPool is Stopped, then I am not able to recycle it. What I want is to check weather MyAppPool is Stopped, if stopped , then Start it, recycle it and then Stop again.

Well I am a complete newbie in this IIS thing and have never worked in it. I am using Window Server 2003 and IIS6.

Was it helpful?

Solution

You can write your own .vbs script, to lookup the .State of the AppPool, and start it when it's stopped. Something like:

//EDIT:

Option Explicit

If WScript.Arguments.Count <> 1 Then
    Wscript.Echo "No AppPoolName provided. Iterate through all AppPools"
    iterate_and_start_all_apps()
Else
    Dim AppPoolName
    AppPoolName = Wscript.Arguments(0)
    '
    ' Choose what to do here and uncomment that Sub
    '
    ' start_given_app(AppPoolName)
    ' start_one_app_if_stopped(AppPoolName)
    ' start_recycle_stop_app(AppPoolName)
End If

' This Sub is runs if no argument is passed to the script
Sub iterate_and_start_all_apps()
        Dim objAppPools, objAppPool
        Set objAppPools = GetObject("IIS://Localhost/W3SVC/AppPools")
        For Each objAppPool in objAppPools
          Set objAppPool = GetObject("IIS://Localhost/W3SVC/AppPools/" & objAppPool.Name )
            If objAppPool.AppPoolState <> 2 Then
              Wscript.Echo objAppPool.Name & " is not running."
                  WScript.Echo objAppPool.Name & ", AppPoolState: " & objAppPool.AppPoolState & _
                        ", Win32Error: " & objAppPool.Win32Error & " ("& hex(objAppPool.Win32Error)&")"
                  Wscript.Echo State2Desc(objAppPool.AppPoolState)
                  objAppPool.Start
                  If Err.Number = 0 Then
                    Wscript.Echo objAppPool.Name & " started."
                  End If
                End If
        Next
        Set objAppPool = Nothing
        Set objAppPools = Nothing
End Sub

'
' start an application pool if the .State is stopped
'
Sub start_one_app_if_stopped(applicationpool)
        Dim iisObjectPath : iisObjectPath = ("IIS://Localhost/W3SVC/AppPools/" & applicationpool)
        Dim iisObject : Set iisObject = GetObject(iisObjectPath)
                If iisObject.AppPoolState <> 2 Then
                  iisObject.Start
                  If (Err.Number <> 0) Then
                    WScript.Echo "Error starting: " & ObjectPath
                    WScript.Quit (Err.Number)
                  Else
                    WScript.Echo applicationpool & " started."
                  End If
                End If
        Set iisObject = nothing
        Set iisObjectPath = nothing
End Sub

'
' if an application pool is stopped, start + recycle + stop it
'
Sub start_recycle_stop_app(applicationpool)
        Dim iisObjectPath : iisObjectPath = ("IIS://Localhost/W3SVC/AppPools/" & applicationpool)
        Dim iisObject : Set iisObject = GetObject(iisObjectPath)
                If iisObject.AppPoolState <> 2 Then
                  iisObject.Start
                  If (Err.Number <> 0) Then
                    WScript.Echo "Error starting: " & ObjectPath
                    WScript.Quit (Err.Number)
                  Else
                    WScript.Echo applicationpool & " started."
                 End If

                  iisObject.recycle
                  ' we need to sleep for some time because recyle takes some time
                  wscript.sleep(3000)

                  iisObject.Stop
                End If
        Set iisObject = nothing
        Set iisObjectPath = nothing
End Sub

'
' just issue a start command to start an application pool
'
Sub start_given_app(applicationpool)
        Dim iisObjectPath : iisObjectPath = ("IIS://Localhost/W3SVC/AppPools/" & applicationpool)
        Dim iisObject : Set iisObject = GetObject(iisObjectPath)
                IIsObject.Start
                If (Err.Number <> 0) Then
                        WScript.Echo "Error starting: " & ObjectPath
                        WScript.Quit (Err.Number)
                Else
                        WScript.Echo applicationpool & " started."
                End If
        Set iisObject = nothing
        Set iisObjectPath = nothing
End Sub

'
' support function
'
Function State2Desc(nState)
    Select Case nState
    Case 1
        State2Desc = "Starting"
    Case 2
        State2Desc = "Started"
    Case 3
        State2Desc = "Stopping"
    Case 4
        State2Desc = "Stopped"
    Case Else
        State2Desc = "Unknown state"
    End Select
End Function

(part taken from http://www.saotn.org/iis-60-start-gestopte-application-pools/, which is a script to start all application pools).

Save as 'startapp.vbs' and run with:

cscript.exe /nologo startapp.vbs name_of_appPool

if you start it without an argument, then the script will iterate through all applications pools in the the metabase and start them if they're not running.

I think you'll need the "start_one_app_if_stopped" Sub, so uncoment that line (line 13) and run the .vbs script with an command line argument:

cscript.exe /nologo startapp.vbs name_of_appPool

HTH

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top