You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
296 lines
9.0 KiB
296 lines
9.0 KiB
'
|
|
' Copyright (c) Microsoft Corporation. All rights reserved.
|
|
'
|
|
' VBScript Source File
|
|
'
|
|
' Script Name: IIsApp.vbs
|
|
'
|
|
|
|
Option Explicit
|
|
On Error Resume Next
|
|
|
|
' Error codes
|
|
Const ERR_OK = 0
|
|
Const ERR_GENERAL_FAILURE = 1
|
|
|
|
'''''''''''''''''''''
|
|
' Messages
|
|
Const L_Gen_ErrorMessage = "%1 : %2"
|
|
Const L_CmdLib_ErrorMessage = "Could not create an instance of the CmdLib object."
|
|
Const L_ChkCmdLibReg_ErrorMessage = "Please register the Microsoft.CmdLib component."
|
|
Const L_ScriptHelper_ErrorMessage = "Could not create an instance of the IIsScriptHelper object."
|
|
Const L_ChkScpHelperReg_ErrorMessage = "Please, check if the Microsoft.IIsScriptHelper is registered."
|
|
Const L_InvalidSwitch_ErrorMessage = "Invalid switch: %1"
|
|
Const L_NotEnoughParams_ErrorMessage = "Not enough parameters."
|
|
Const L_Query_ErrorMessage = "Error executing query"
|
|
Const L_Serving_Message = "The following W3WP.exe processes are serving AppPool: %1"
|
|
Const L_NoW3_ErrorMessage = "Error - no w3wp.exe processes are running at this time"
|
|
Const L_PID_Message = "W3WP.exe PID: %1"
|
|
Const L_NoResults_ErrorMessage = "Error - no results"
|
|
Const L_APID_Message = "W3WP.exe PID: %1 AppPoolId: %2"
|
|
Const L_NotW3_ErrorMessage = "ERROR: ProcessId specified is NOT an instance of W3WP.exe - EXITING"
|
|
Const L_PIDNotValid_ErrorMessage = "ERROR: PID is not valid"
|
|
|
|
'''''''''''''''''''''
|
|
' Help
|
|
Const L_Empty_Text = ""
|
|
|
|
' General help messages
|
|
Const L_SeeHelp_Message = "Type IIsApp /? for help."
|
|
|
|
Const L_Help_HELP_General01_Text = "Description: list IIS worker processes."
|
|
Const L_Help_HELP_General02_Text = "Syntax: IIsApp.vbs [/a <app_pool_id> | /p <pid>]"
|
|
Const L_Help_HELP_General04_Text = "Parameters:"
|
|
Const L_Help_HELP_General05_Text = ""
|
|
Const L_Help_HELP_General06_Text = "Value Description"
|
|
Const L_Help_HELP_General07_Text = "/a <app_pool_id> report PIDs of currently running"
|
|
Const L_Help_HELP_General08_Text = " w3wp.exe processes serving pool"
|
|
Const L_Help_HELP_General09_Text = " <app_pool_id>. Surround <app_pool_id>"
|
|
Const L_Help_HELP_General10_Text = " with quotes if it contains spaces."
|
|
Const L_Help_HELP_General11_Text = " not specified by default and exclusive"
|
|
Const L_Help_HELP_General12_Text = " to /p switch."
|
|
Const L_Help_HELP_General13_Text = "/p <pid> report AppPoolId of w3wp specified by <pid>"
|
|
Const L_Help_HELP_General14_Text = "DEFAULT: no switches will print out the PID and AppPoolId"
|
|
Const L_Help_HELP_General15_Text = " for each w3wp.exe"
|
|
|
|
''''''''''''''''''''''''
|
|
' Operation codes
|
|
Const OPER_BY_NAME = 1
|
|
Const OPER_BY_PID = 2
|
|
Const OPER_ALL = 3
|
|
|
|
'
|
|
' Main block
|
|
'
|
|
Dim oScriptHelper, oCmdLib
|
|
Dim intOperation, intResult
|
|
Dim strCmdLineOptions
|
|
Dim oError
|
|
Dim aArgs
|
|
Dim apoolID, PID
|
|
Dim oProviderObj
|
|
|
|
' Default
|
|
intOperation = OPER_ALL
|
|
Const wmiConnect = "winmgmts:{(debug)}:/root/cimv2"
|
|
Const queryString = "select * from Win32_Process where Name='w3wp.exe'"
|
|
Const pidQuery = "select * from Win32_Process where ProcessId="
|
|
|
|
' get NT WMI provider
|
|
Set oProviderObj = GetObject(wmiConnect)
|
|
|
|
' Instantiate the CmdLib for output string formatting
|
|
Set oCmdLib = CreateObject("Microsoft.CmdLib")
|
|
If Err.Number <> 0 Then
|
|
WScript.Echo L_CmdLib_ErrorMessage
|
|
WScript.Echo L_ChkCmdLibReg_ErrorMessage
|
|
WScript.Quit(ERR_GENERAL_FAILURE)
|
|
End If
|
|
Set oCmdLib.ScriptingHost = WScript.Application
|
|
|
|
' Instantiate script helper object
|
|
Set oScriptHelper = CreateObject("Microsoft.IIsScriptHelper")
|
|
If Err.Number <> 0 Then
|
|
WScript.Echo L_ScriptHelper_ErrorMessage
|
|
WScript.Echo L_ChkScpHelperReg_ErrorMessage
|
|
WScript.Quit(ERR_GENERAL_FAILURE)
|
|
End If
|
|
|
|
Set oScriptHelper.ScriptHost = WScript
|
|
|
|
' Check if we are being run with cscript.exe instead of wscript.exe
|
|
oScriptHelper.CheckScriptEngine
|
|
|
|
' Command Line parsing
|
|
Dim argObj, arg
|
|
Set argObj = WScript.Arguments
|
|
|
|
strCmdLineOptions = "a:a:1;p:p:1"
|
|
|
|
If argObj.Named.Count > 0 Then
|
|
Set oError = oScriptHelper.ParseCmdLineOptions(strCmdLineOptions)
|
|
|
|
If Not oError Is Nothing Then
|
|
If oError.ErrorCode = oScriptHelper.ERROR_NOT_ENOUGH_ARGS Then
|
|
' Not enough arguments for a specified switch
|
|
WScript.Echo L_NotEnoughParams_ErrorMessage
|
|
WScript.Echo L_SeeHelp_Message
|
|
Else
|
|
' Invalid switch
|
|
oCmdLib.vbPrintf L_InvalidSwitch_ErrorMessage, Array(oError.SwitchName)
|
|
WScript.Echo L_SeeHelp_Message
|
|
End If
|
|
|
|
WScript.Quit(ERR_GENERAL_FAILURE)
|
|
End If
|
|
|
|
If oScriptHelper.GlobalHelpRequested Then
|
|
DisplayHelpMessage
|
|
WScript.Quit(ERR_OK)
|
|
End If
|
|
|
|
For Each arg In oScriptHelper.Switches
|
|
Select Case arg
|
|
Case "a"
|
|
apoolID = oScriptHelper.GetSwitch(arg)
|
|
intOperation = OPER_BY_NAME
|
|
Case "p"
|
|
PID = oScriptHelper.GetSwitch(arg)
|
|
intOperation = OPER_BY_PID
|
|
End Select
|
|
Next
|
|
|
|
End If
|
|
|
|
' Choose operation
|
|
Select Case intOperation
|
|
Case OPER_BY_NAME
|
|
intResult = GetByPool(apoolID)
|
|
|
|
Case OPER_BY_PID
|
|
intResult = GetByPid(PID)
|
|
|
|
Case OPER_ALL
|
|
intResult = GetAllW3WP()
|
|
End Select
|
|
|
|
' Return value to command processor
|
|
WScript.Quit(intResult)
|
|
|
|
'''''''''''''''''''''''''
|
|
' End Of Main Block
|
|
'''''''''''''''''''''
|
|
|
|
'''''''''''''''''''''''''''
|
|
' DisplayHelpMessage
|
|
'''''''''''''''''''''''''''
|
|
Sub DisplayHelpMessage()
|
|
WScript.Echo L_Help_HELP_General01_Text
|
|
WScript.Echo L_Empty_Text
|
|
WScript.Echo L_Help_HELP_General02_Text
|
|
WScript.Echo L_Empty_Text
|
|
WScript.Echo L_Help_HELP_General04_Text
|
|
WScript.Echo L_Help_HELP_General05_Text
|
|
WScript.Echo L_Help_HELP_General06_Text
|
|
WScript.Echo L_Help_HELP_General07_Text
|
|
WScript.Echo L_Help_HELP_General08_Text
|
|
WScript.Echo L_Help_HELP_General09_Text
|
|
WScript.Echo L_Help_HELP_General10_Text
|
|
WScript.Echo L_Help_HELP_General11_Text
|
|
WScript.Echo L_Help_HELP_General12_Text
|
|
WScript.Echo L_Help_HELP_General13_Text
|
|
WScript.Echo L_Empty_Text
|
|
WScript.Echo L_Help_HELP_General14_Text
|
|
WScript.Echo L_Help_HELP_General15_Text
|
|
End Sub
|
|
|
|
Function GetAppPoolId(strArg)
|
|
Dim Submatches
|
|
Dim strPoolId
|
|
Dim re
|
|
Dim Matches
|
|
|
|
On Error Resume Next
|
|
|
|
Set re = New RegExp
|
|
re.Pattern = "-ap ""(.+)"""
|
|
re.IgnoreCase = True
|
|
Set Matches = re.Execute(strArg)
|
|
Set SubMatches = Matches(0).Submatches
|
|
strPoolId = Submatches(0)
|
|
|
|
GetAppPoolId = strPoolId
|
|
End Function
|
|
|
|
|
|
Function GetByPool(strPoolName)
|
|
Dim W3WPList
|
|
Dim strQuery
|
|
Dim W3WP
|
|
|
|
On Error Resume Next
|
|
|
|
strQuery = queryString
|
|
Set W3WPList = oProviderObj.ExecQuery(strQuery)
|
|
If (Err.Number <> 0) Then
|
|
WScript.Echo L_Query_ErrorMessage
|
|
oCmdLib.vbPrintf L_Gen_ErrorMessage, Array(Hex(Err.Number), Err.Description)
|
|
GetByPid = 2
|
|
Else
|
|
oCmdLib.vbPrintf L_Serving_Message, Array(strPoolName)
|
|
If (W3WPList.Count < 1) Then
|
|
WScript.Echo L_NoW3_ErrorMessage
|
|
GetByPool = 1
|
|
Else
|
|
For Each W3WP In W3WPList
|
|
If (UCase(GetAppPoolId(W3WP.CommandLine)) = UCase(strPoolName)) Then
|
|
oCmdLib.vbPrintf L_PID_Message, Array(W3WP.ProcessId)
|
|
End If
|
|
Next
|
|
GetByPool = 0
|
|
End If
|
|
End If
|
|
End Function
|
|
|
|
Function GetByPid(pid)
|
|
Dim W3WPList
|
|
Dim strQuery
|
|
Dim W3WP
|
|
|
|
On Error Resume Next
|
|
|
|
If (IsNumeric(pid)) Then
|
|
strQuery = pidQuery & pid
|
|
|
|
Set W3WPList = oProviderObj.ExecQuery(strQuery)
|
|
If (Err.Number <> 0) Then
|
|
WScript.Echo L_Query_ErrorMessage
|
|
oCmdLib.vbPrintf L_Gen_ErrorMessage, Array(Hex(Err.Number), Err.Description)
|
|
GetByPid = 2
|
|
Else
|
|
If (W3WPList.Count < 1) Then
|
|
WScript.Echo L_NoResults_ErrorMessage
|
|
GetByPid = 2
|
|
Else
|
|
For Each W3WP In W3WPList
|
|
If (W3WP.Name = "w3wp.exe") Then
|
|
oCmdLib.vbPrintf L_APID_Message, Array(pid, GetAppPoolId(W3WP.CommandLine))
|
|
GetByPid = 0
|
|
Else
|
|
WScript.Echo(L_NotW3_ErrorMessage)
|
|
GetByPid = 2
|
|
End If
|
|
Next
|
|
End If
|
|
End If
|
|
Else
|
|
WScript.Echo(L_PIDNotValid_ErrorMessage)
|
|
GetByPid = 2
|
|
End If
|
|
End Function
|
|
|
|
Function GetAllW3WP()
|
|
Dim W3WPList
|
|
Dim strQuery
|
|
Dim W3WP
|
|
|
|
On Error Resume Next
|
|
|
|
strQuery = queryString
|
|
Set W3WPList = oProviderObj.ExecQuery(strQuery)
|
|
If (Err.Number <> 0) Then
|
|
WScript.Echo L_Query_ErrorMessage
|
|
oCmdLib.vbPrintf L_Gen_ErrorMessage, Array(Hex(Err.Number), Err.Description)
|
|
GetByPid = 2
|
|
Else
|
|
If (W3WPList.Count < 1) Then
|
|
WScript.Echo L_NoResults_ErrorMessage
|
|
GetAllW3WP = 2
|
|
Else
|
|
For Each W3WP In W3WPList
|
|
oCmdLib.vbPrintf L_APID_Message, Array(W3WP.ProcessId, GetAppPoolId(W3WP.CommandLine))
|
|
Next
|
|
GetAllW3WP = 0
|
|
End If
|
|
End If
|
|
End Function
|