Windows-Server-2003/inetsrv/iis/img/admsamp/adsutil.vbs

2603 lines
91 KiB
Plaintext

''''''''''''''''''''''''''''''''''''
'
' ADSUTIL.VBS
'
' Date: 7/24/97
' Revision History:
' Date Comment
' 7/24/97 Initial version started
' 5/8/98 Bug fixes and ENUM_ALL
' 12/1/98 Fixed display error on list data.
' 7/27/99 AppCreate2 fix
' 8/5/99 Dont display encrypted data
''''''''''''''''''''''''''''''''''''
Option Explicit
On Error Resume Next
''''''''''''''''''
' Main Script Code
''''''''''''''''''
Dim ArgObj ' Object which contains the command line argument
Dim Result ' Result of the command function call
Dim Args(10) ' Array that contains all of the non-global arguments
Dim ArgCount ' Tracks the size of the Args array
' Used for string formatting
Dim Spacer
Dim SpacerSize
Const IIS_DATA_NO_INHERIT = 0
Const IIS_DATA_INHERIT = 1
Const GENERAL_FAILURE = 2
Const GENERAL_WARNING = 1
Const AppCreate_InProc = 0
Const AppCreate_OutOfProc = 1
Const AppCreate_PooledOutOfProc = 2
Const APPSTATUS_NOTDEFINED = 2
Const APPSTATUS_RUNNING = 1
Const APPSTATUS_STOPPED = 0
Spacer = " " ' Used to format the strings
SpacerSize = Len(Spacer)
' Note: The default execution mode may be under WScript.exe.
' That would be very annoying since WScript has popups for Echo.
' So, I want to detect that, and warn the user that it may cause
' problems.
DetectExeType
' Get the Arguments object
Set ArgObj = WScript.Arguments
' Test to make sure there is at least one command line arg - the command
If ArgObj.Count < 1 Then
DisplayHelpMessage
WScript.Quit (GENERAL_FAILURE)
End If
'*****************************************************
Dim TargetServer 'The server to be examined/modified
Dim I
For I = 0 To ArgObj.Count - 1
If LCase(Left(ArgObj.Item(I), 3)) = "-s:" Then
TargetServer = Right(ArgObj.Item(I), Len(ArgObj.Item(I)) - 3)
Else
Args(ArgCount) = ArgObj.Item(I)
ArgCount = ArgCount + 1
End If
Next
If Len(TargetServer) = 0 Then
TargetServer = "localhost"
End If
'*****************************************************
' Call the function associated with the given command
Select Case UCase(Args(0))
Case "SET"
Result = SetCommand()
Case "CREATE"
Result = CreateCommand("")
Case "DELETE"
Result = DeleteCommand()
Case "GET"
Result = GetCommand()
Case "ENUM"
' Result = EnumCommand()
Result = EnumCommand(False, "")
Case "ENUM_ALL"
' Result = EnumAllCommand()
Result = EnumCommand(True, "")
Case "ENUMALL"
' Result = EnumAllCommand()
Result = EnumCommand(True, "")
Case "COPY"
Result = CopyMoveCommand(True) ' The TRUE means COPY, not MOVE
Case "MOVE"
Result = CopyMoveCommand(False) ' The FALSE means MOVE, not COPY
Case "CREATE_VDIR"
Result = CreateCommand("IIsWebVirtualDir")
Case "CREATE_VSERV"
Result = CreateCommand("IIsWebServer")
Case "START_SERVER"
Result = StartServerCommand()
Case "STOP_SERVER"
Result = StopServerCommand()
Case "PAUSE_SERVER"
Result = PauseServerCommand()
Case "CONTINUE_SERVER"
Result = ContinueServerCommand()
' New Stuff being added
Case "FIND"
Result = FindData()
Case "COPY"
WScript.Echo "COPY is not yet supported. It will be soon."
Case "APPCREATEINPROC"
Result = AppCreateCommand(AppCreate_InProc)
Case "APPCREATEOUTPROC"
Result = AppCreateCommand(AppCreate_OutOfProc)
Case "APPCREATEPOOLPROC"
Result = AppCreateCommand(AppCreate_PooledOutOfProc)
Case "APPDELETE"
Result = AppDeleteCommand()
Case "APPUNLOAD"
Result = AppUnloadCommand()
Case "APPDISABLE"
Result = AppDisableCommand()
Case "APPENABLE"
Result = AppEnableCommand()
Case "APPGETSTATUS"
Result = AppGetStatusCommand()
Case "HELP"
DisplayHelpMessageEx
' End New Stuff
Case Else
WScript.Echo "Command not recognized: " & Args(0)
WScript.Echo "For help, just type ""Cscript.exe adsutil.vbs""."
Result = GENERAL_FAILURE
End Select
WScript.Quit (Result)
''''''''''
' End Main
''''''''''
''''''''''''''''''''''''''''
'
' Display Help Message
'
''''''''''''''''''''''''''''
Sub DisplayHelpMessage()
WScript.Echo
WScript.Echo "Usage:"
WScript.Echo " ADSUTIL.VBS <cmd> [<path> [<value>]]"
WScript.Echo
'WScript.Echo "Note: ADSUTIL only supports the ""no switch"" option of MDUTIL"
'WScript.Echo
WScript.Echo "Description:"
WScript.Echo "IIS administration utility that enables the configuration of metabase properties."
WScript.Echo
'WScript.Echo "Supported MDUTIL Commands:"
WScript.Echo "Supported Commands:"
WScript.Echo " GET, SET, ENUM, DELETE, CREATE, COPY, "
WScript.Echo " APPCREATEINPROC, APPCREATEOUTPROC, APPCREATEPOOLPROC, APPDELETE, APPUNLOAD, APPGETSTATUS "
WScript.Echo
WScript.Echo "Samples:"
WScript.Echo " adsutil.vbs GET W3SVC/1/ServerBindings"
WScript.Echo " adsutil.vbs SET W3SVC/1/ServerBindings "":81:"""
WScript.Echo " adsutil.vbs CREATE W3SVC/1/Root/MyVdir ""IIsWebVirtualDir"""
WScript.Echo " adsutil.vbs START_SERVER W3SVC/1"
WScript.Echo " adsutil.vbs ENUM /P W3SVC"
WScript.Echo
WScript.Echo "For Extended Help type:"
WScript.Echo " adsutil.vbs HELP"
End Sub
''''''''''''''''''''''''''''
'
' Display Help Message
'
''''''''''''''''''''''''''''
Sub DisplayHelpMessageEx()
WScript.Echo
WScript.Echo "Usage:"
WScript.Echo " ADSUTIL.VBS CMD [param param]"
WScript.Echo
'WScript.Echo "Note: ADSUTIL only supports the ""no switch"" option of MDUTIL"
'WScript.Echo
WScript.Echo "Description:"
WScript.Echo "IIS K2 administration utility that enables the manipulation with ADSI parameters"
WScript.Echo
'WScript.Echo "Standard MDUTIL Commands:"
WScript.Echo "Standard Commands:"
WScript.Echo " adsutil.vbs GET path - display chosen parameter"
WScript.Echo " adsutil.vbs SET path value ... - assign the new value"
WScript.Echo " adsutil.vbs ENUM path [""/P"" ] - enumerate all parameters for given path"
WScript.Echo " adsutil.vbs DELETE path - delete given path or parameter"
WScript.Echo " adsutil.vbs CREATE path [KeyType] - create given path and assigns it the given KeyType"
WScript.Echo
WScript.Echo " adsutil.vbs APPCREATEINPROC w3svc/1/root - Create an in-proc application"
WScript.Echo " adsutil.vbs APPCREATEOUTPROC w3svc/1/root - Create an out-proc application"
WScript.Echo " adsutil.vbs APPCREATEPOOLPROC w3svc/1/root- Create a pooled-proc application"
WScript.Echo " adsutil.vbs APPDELETE w3svc/1/root - Delete the application if there is one"
WScript.Echo " adsutil.vbs APPUNLOAD w3svc/1/root - Unload an application from w3svc runtime lookup table."
WScript.Echo " adsutil.vbs APPDISABLE w3svc/1/root - Disable an application - appropriate for porting to another machine."
WScript.Echo " adsutil.vbs APPENABLE w3svc/1/root - Enable an application - appropriate for importing from another machine."
WScript.Echo " adsutil.vbs APPGETSTATUS w3svc/1/root - Get status of the application"
WScript.Echo
WScript.Echo "New ADSI Options:"
WScript.Echo " /P - Valid for ENUM only. Enumerates the paths only (no data)"
WScript.Echo " KeyType - Valide for CREATE only. Assigns the valid KeyType to the path"
WScript.Echo
WScript.Echo "Extended ADSUTIL Commands:"
WScript.Echo " adsutil.vbs FIND path - find the paths where a given parameter is set"
WScript.Echo " adsutil.vbs CREATE_VDIR path - create given path as a Virtual Directory"
WScript.Echo " adsutil.vbs CREATE_VSERV path - create given path as a Virtual Server"
WScript.Echo " adsutil.vbs START_SERVER path - starts the given web site"
WScript.Echo " adsutil.vbs STOP_SERVER path - stops the given web site"
WScript.Echo " adsutil.vbs PAUSE_SERVER path - pauses the given web site"
WScript.Echo " adsutil.vbs CONTINUE_SERVER path - continues the given web site"
WScript.Echo
WScript.Echo
WScript.Echo "Samples:"
WScript.Echo " adsutil.vbs GET W3SVC/1/ServerBindings"
WScript.Echo " adsutil.vbs SET W3SVC/1/ServerBindings "":81:"""
WScript.Echo " adsutil.vbs CREATE W3SVC/1/Root/MyVdir ""IIsWebVirtualDir"""
WScript.Echo " adsutil.vbs START_SERVER W3SVC/1"
WScript.Echo " adsutil.vbs ENUM /P W3SVC"
WScript.Echo "Extended ADSUTIL Commands:"
WScript.Echo " adsutil.vbs FIND path - find the paths where a given parameter is set"
WScript.Echo " adsutil.vbs CREATE_VDIR path - create given path as a Virtual Directory"
WScript.Echo " adsutil.vbs CREATE_VSERV path - create given path as a Virtual Server"
WScript.Echo " adsutil.vbs START_SERVER path - starts the given web site"
WScript.Echo " adsutil.vbs STOP_SERVER path - stops the given web site"
WScript.Echo " adsutil.vbs PAUSE_SERVER path - pauses the given web site"
WScript.Echo " adsutil.vbs CONTINUE_SERVER path - continues the given web site"
WScript.Echo
WScript.Echo
WScript.Echo "Samples:"
WScript.Echo " adsutil.vbs GET W3SVC/1/ServerBindings"
WScript.Echo " adsutil.vbs SET W3SVC/1/ServerBindings "":81:"""
WScript.Echo " adsutil.vbs CREATE W3SVC/1/Root/MyVdir ""IIsWebVirtualDir"""
WScript.Echo " adsutil.vbs START_SERVER W3SVC/1"
WScript.Echo " adsutil.vbs ENUM /P W3SVC"
' adsutil.vbs ENUM_ALL path - recursively enumerate all parameters
' adsutil.vbs COPY pathsrc pathdst - copy all from pathsrc to pathdst (will create pathdst)
' adsutil.vbs SCRIPT scriptname - runs the script
' -path has format: {computer}/{service}/{instance}/{URL}/{Parameter}
End Sub
'''''''''''''''''''''''''''
'
' DetectExeType
'
' This can detect the type of exe the
' script is running under and warns the
' user of the popups.
'
'''''''''''''''''''''''''''
Sub DetectExeType()
Dim ScriptHost
Dim ShellObject
Dim CurrentPathExt
Dim EnvObject
Dim RegCScript
Dim RegPopupType ' This is used to set the pop-up box flags.
' I couldn't find the pre-defined names
RegPopupType = 32 + 4
On Error Resume Next
ScriptHost = WScript.FullName
ScriptHost = Right(ScriptHost, Len(ScriptHost) - InStrRev(ScriptHost, "\"))
If (UCase(ScriptHost) = "WSCRIPT.EXE") Then
WScript.Echo ("This script does not work with WScript.")
' Create a pop-up box and ask if they want to register cscript as the default host.
Set ShellObject = WScript.CreateObject("WScript.Shell")
' -1 is the time to wait. 0 means wait forever.
RegCScript = ShellObject.PopUp("Would you like to register CScript as your default host for VBscript?", 0, "Register CScript", RegPopupType)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "To run this script using CScript, type: ""CScript.exe " & WScript.ScriptName & """"
WScript.Quit (GENERAL_FAILURE)
WScript.Quit (Err.Number)
End If
' Check to see if the user pressed yes or no. Yes is 6, no is 7
If (RegCScript = 6) Then
ShellObject.RegWrite "HKEY_CLASSES_ROOT\VBSFile\Shell\Open\Command\", "%WINDIR%\System32\CScript.exe //nologo ""%1"" %*", "REG_EXPAND_SZ"
ShellObject.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\VBSFile\Shell\Open\Command\", "%WINDIR%\System32\CScript.exe //nologo ""%1"" %*", "REG_EXPAND_SZ"
' Check if PathExt already existed
CurrentPathExt = ShellObject.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\PATHEXT")
If Err.Number = &H80070002 Then
Err.Clear
Set EnvObject = ShellObject.Environment("PROCESS")
CurrentPathExt = EnvObject.Item("PATHEXT")
End If
ShellObject.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\PATHEXT", CurrentPathExt & ";.VBS", "REG_SZ"
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying to write the registry settings!"
WScript.Quit (Err.Number)
Else
WScript.Echo "Successfully registered CScript"
End If
Else
WScript.Echo "To run this script type: ""CScript.Exe adsutil.vbs <cmd> <params>"""
End If
Dim ProcString
Dim ArgIndex
Dim ArgObj
Dim Result
ProcString = "Cscript //nologo " & WScript.ScriptFullName
Set ArgObj = WScript.Arguments
For ArgIndex = 0 To ArgCount - 1
ProcString = ProcString & " " & Args(ArgIndex)
Next
'Now, run the original executable under CScript.exe
Result = ShellObject.Run(ProcString, 0, True)
WScript.Quit (Result)
End If
End Sub
''''''''''''''''''''''''''
'
' SetCommand Function
'
' Sets the value of a property in the metabase.
'
''''''''''''''''''''''''''
Function SetCommand()
Dim IIsObject
Dim IIsObjectPath
Dim IIsSchemaObject
Dim IIsSchemaPath
Dim ObjectPath
Dim ObjectParameter
Dim MachineName
Dim ValueIndex
Dim ValueList
Dim ValueDisplay
Dim ValueDisplayLen
Dim ValueDataType
Dim ValueData
Dim ObjectDataType
On Error Resume Next
SetCommand = 0 ' Assume Success
If ArgCount < 3 Then
WScript.Echo "Error: Wrong number of Args for the SET command"
WScript.Quit (GENERAL_FAILURE)
End If
ObjectPath = Args(1)
SanitizePath ObjectPath
MachineName = SeparateMachineName(ObjectPath)
ObjectParameter = SplitParam(ObjectPath)
' Some Property Types have special needs - like ServerCommand.
' Check to see if this is a special command. If it is, then process it special.
If (IsSpecialSetProperty(ObjectParameter)) Then
SetCommand = DoSpecialSetProp(ObjectPath, ObjectParameter, MachineName)
Exit Function
End If
If ObjectPath = "" Then
IIsObjectPath = "IIS://" & MachineName
Else
IIsObjectPath = "IIS://" & MachineName & "/" & ObjectPath
End If
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Get the Object: " & ObjectPath
WScript.Quit (Err.Number)
End If
' Get the Schema of the property and determine if it's multivalued
IIsSchemaPath = "IIS://" & MachineName & "/Schema/" & ObjectParameter
Set IIsSchemaObject = GetObject(IIsSchemaPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To GET the Schema of the property: " & IIsSchemaPath
WScript.Quit (Err.Number)
End If
ObjectDataType = UCase(IIsSchemaObject.Syntax)
SanitizePath ObjectDataType
Select Case (ObjectDataType)
Case "STRING"
ValueList = Args(2)
IIsObject.Put ObjectParameter, (ValueList)
Case "EXPANDSZ"
ValueList = Args(2)
IIsObject.Put ObjectParameter, (ValueList)
Case "INTEGER"
' Added to convert hex values to integers
ValueData = Args(2)
If (UCase(Left(ValueData, 2))) = "0X" Then
ValueData = "&h" & Right(ValueData, Len(ValueData) - 2)
End If
ValueList = CLng(ValueData)
IIsObject.Put ObjectParameter, (ValueList)
Case "BOOLEAN"
ValueList = CBool(Args(2))
IIsObject.Put ObjectParameter, (ValueList)
Case "LIST"
ReDim ValueList(ArgCount - 3)
For ValueIndex = 2 To ArgCount - 1
ValueList(ValueIndex - 2) = Args(ValueIndex)
Next
IIsObject.Put ObjectParameter, (ValueList)
Case Else
WScript.Echo "Error: Unknown data type in schema: " & IIsSchemaObject.Syntax
End Select
IIsObject.Setinfo
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To SET the Property: " & ObjectParameter
WScript.Quit (Err.Number)
End If
' The function call succeeded, so display the output
' Set up the initial part of the display - the property name and data type
ValueDisplay = ObjectParameter
ValueDisplayLen = Len(ValueDisplay)
If (ValueDisplayLen < SpacerSize) Then
'ValueDisplay = ValueDisplay & (Right (Spacer, SpacerSize - ValueDisplayLen)) & ": " & "(" & TypeName (ValueList) & ") "
ValueDisplay = ValueDisplay & (Right(Spacer, SpacerSize - ValueDisplayLen)) & ": " & "(" & ObjectDataType & ") "
Else
ValueDisplay = ValueDisplay & ": " & "(" & TypeName(ValueList) & ") "
End If
' Create the rest of the display - The actual data
If (IIsSchemaObject.MultiValued) Then
For ValueIndex = 0 To UBound(ValueList)
'WScript.Echo """" & ValueList(ValueIndex) & """"
ValueDisplay = ValueDisplay & """" & ValueList(ValueIndex) & """ "
Next
Else
If (UCase(IIsSchemaObject.Syntax) = "STRING") Then
'WScript.Echo """" & ValueList & """"
If (IsSecureProperty(ObjectParameter,MachineName) = True) Then
ValueDisplay = ValueDisplay & """" & "**********" & """"
Else
ValueDisplay = ValueDisplay & """" & ValueList & """"
End If
Else
'WScript.Echo ValueList
ValueDisplay = ValueDisplay & ValueList
End If
End If
' Display the output
WScript.Echo ValueDisplay
SetCommand = 0 ' Success
End Function
''''''''''''''''''''''''''
'
' GetCommand Function
'
' Gets the value of a property in the metabase.
'
''''''''''''''''''''''''''
Function GetCommand()
Dim IIsObject
Dim IIsObjectPath
Dim IIsSchemaObject
Dim IIsSchemaPath
Dim ObjectPath
Dim ObjectParameter
Dim MachineName
Dim ValueIndex
Dim ValueList
Dim ValueListArray
Dim ValueDisplay
Dim ValueDisplayLen
Dim NewObjectparameter
Dim DataPathList
Dim DataPath
On Error Resume Next
GetCommand = 0 ' Assume Success
If ArgCount <> 2 Then
WScript.Echo "Error: Wrong number of Args for the GET command"
WScript.Quit (GENERAL_FAILURE)
End If
ObjectPath = Args(1)
SanitizePath ObjectPath
MachineName = SeparateMachineName(ObjectPath)
ObjectParameter = SplitParam(ObjectPath)
NewObjectparameter = MapSpecGetParamName(ObjectParameter)
ObjectParameter = NewObjectparameter
If (IsSpecialGetProperty(ObjectParameter)) Then
GetCommand = DoSpecialGetProp(ObjectPath, ObjectParameter, MachineName)
Exit Function
End If
If ObjectPath = "" Then
IIsObjectPath = "IIS://" & MachineName
Else
IIsObjectPath = "IIS://" & MachineName & "/" & ObjectPath
End If
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To GET the Object (GetObject Failed): " & ObjectPath
WScript.Quit (Err.Number)
End If
' Get the Schema of the property and determine if it's multivalued
IIsSchemaPath = "IIS://" & MachineName & "/Schema/" & ObjectParameter
Set IIsSchemaObject = GetObject(IIsSchemaPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To GET the Schema of the property: " & IIsSchemaPath
WScript.Quit (Err.Number)
End If
' First, attempt to retrieve the property - this will tell us
' if you are even allowed to set the property at this node.
' Retrieve the property
ValueList = IIsObject.Get(ObjectParameter)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To GET the property: (Get Method Failed) " & ObjectParameter
WScript.Echo " (This property is probably not allowed at this node)"
WScript.Quit (Err.Number)
End If
' Test to see if the property is ACTUALLY set at this node
DataPathList = IIsObject.GetDataPaths(ObjectParameter, IIS_DATA_INHERIT)
If Err.Number <> 0 Then DataPathList = IIsObject.GetDataPaths(ObjectParameter, IIS_DATA_NO_INHERIT)
Err.Clear
' If the data is not set anywhere, then stop the madness
If (UBound(DataPathList) < 0) Then
WScript.Echo "The parameter """ & ObjectParameter & """ is not set at this node."
WScript.Quit (&H80005006) ' end with property not set error
End If
DataPath = DataPathList(0)
SanitizePath DataPath
' Test to see if the item is actually set HERE
If UCase(DataPath) <> UCase(IIsObjectPath) Then
WScript.Echo "The parameter """ & ObjectParameter & """ is not set at this node."
WScript.Quit (&H80005006) ' end with property not set error
End If
' Set up the initial part of the display - the property name and data type
ValueDisplay = ObjectParameter
ValueDisplayLen = Len(ValueDisplay)
If (ValueDisplayLen < SpacerSize) Then
'ValueDisplay = ValueDisplay & (Right (Spacer, SpacerSize - ValueDisplayLen)) & ": " & "(" & TypeName (ValueList) & ") "
ValueDisplay = ValueDisplay & (Right(Spacer, SpacerSize - ValueDisplayLen)) & ": " & "(" & UCase(IIsSchemaObject.Syntax) & ") "
Else
ValueDisplay = ValueDisplay & ": " & "(" & TypeName(ValueList) & ") "
End If
' Create the rest of the display - The actual data
If (IIsSchemaObject.MultiValued) Then
WScript.Echo ValueDisplay & " (" & UBound (ValueList) + 1 & " Items)"
For ValueIndex = 0 To UBound(ValueList)
WScript.Echo " """ & ValueList(ValueIndex) & """"
'ValueDisplay = ValueDisplay & """" & ValueList(ValueIndex) & """ "
Next
Else
If (UCase(IIsSchemaObject.Syntax) = "STRING") Then
If (IsSecureProperty(ObjectParameter,MachineName) = True) Then
ValueDisplay = ValueDisplay & """" & "**********" & """"
Else
ValueDisplay = ValueDisplay & """" & ValueList & """"
End If
Elseif (UCase(IIsSchemaObject.Syntax) = "BINARY") Then
ValueListArray = IIsObject.Get(ObjectParameter)
ValueList = "0x"
For ValueIndex = 0 To UBound(ValueListArray)
ValueList = ValueList & ValueListArray(ValueIndex) & " "
Next
ValueDisplay = ValueDisplay & ValueList
Else
'WScript.Echo ValueList
ValueDisplay = ValueDisplay & ValueList
End If
' Display the output
WScript.Echo ValueDisplay
End If
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To GET the Property: " & ObjectParameter
WScript.Quit (Err.Number)
End If
GetCommand = 0 ' Success
End Function
''''''''''''''''''''''''''
'
' EnumCommand Function
'
' Enumerates all properties at a path in the metabase.
'
''''''''''''''''''''''''''
Function EnumCommand(Recurse, StartPath)
On Error Resume Next
Dim IIsObject
Dim IIsObjectPath
Dim IIsSchemaObject
Dim IIsSchemaPath
Dim ObjectPath
Dim MachineName
Dim ValueIndex
Dim ValueList
Dim ValueListArray
Dim ValueString
Dim PropertyName
Dim PropertyAttribObj
Dim PropertyListSet
Dim PropertyList
Dim PropertyObjPath
Dim PropertyObject
Dim ChildObject
Dim ChildObjectName
Dim EnumPathsOnly
Dim EnumAllData
Dim ErrMask
Dim IsInherit
Dim PropertyDataType
Dim SpecialResult
Dim PathOnlyOption
PathOnlyOption = "/P"
EnumCommand = 0 ' Assume Success
EnumPathsOnly = False ' Assume that the user wants all of the data items
EnumAllData = False ' Assume that the user wants only the actual data items
If (ArgCount = 1) Then
ObjectPath = ""
EnumPathsOnly = False
ArgCount = 2
ElseIf (ArgCount = 2) Then
If UCase(Args(1)) = PathOnlyOption Then
ObjectPath = ""
EnumPathsOnly = True
Else
ObjectPath = Args(1)
EnumPathsOnly = False
End If
ElseIf (ArgCount = 3) Then
If UCase(Args(1)) = PathOnlyOption Then
ObjectPath = Args(2)
EnumPathsOnly = True
ElseIf UCase(Args(2)) = PathOnlyOption Then
ObjectPath = Args(1)
EnumPathsOnly = True
Else
WScript.Echo "Error: Invalid arguments for the ENUM command"
WScript.Quit (GENERAL_FAILURE)
End If
Else
WScript.Echo "Error: Wrong number of Args for the ENUM command"
WScript.Quit (GENERAL_FAILURE)
End If
If StartPath <> "" Then ObjectPath = StartPath
SanitizePath ObjectPath
MachineName = SeparateMachineName(ObjectPath)
IIsObjectPath = "IIS://" & MachineName
If (ObjectPath <> "") Then
IIsObjectPath = IIsObjectPath & "/" & ObjectPath
End If
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
WScript.Echo
ReportError ()
WScript.Echo "Error Trying To ENUM the Object (GetObject Failed): " & ObjectPath
WScript.Quit (Err.Number)
End If
' Get the Schema of the object and enumerate through all of the properties
IIsSchemaPath = IIsObject.Schema
Set IIsSchemaObject = GetObject(IIsSchemaPath)
If (Err.Number <> 0) Then
WScript.Echo
ReportError ()
WScript.Echo "Error Trying To GET the Schema of the class: " & IIsSchemaPath
WScript.Quit (Err.Number)
End If
ReDim PropertyListSet(1)
PropertyListSet(0) = IIsSchemaObject.MandatoryProperties
PropertyListSet(1) = IIsSchemaObject.OptionalProperties
If (Err.Number <> 0) Then
WScript.Echo
ReportError ()
WScript.Echo "Error trying to get the list of properties: " & IIsSchemaPath
WScript.Quit (Err.Number)
End If
' This now checks for an empty OptionalProperties list
If TypeName (PropertyListSet(1)) <> "Variant()" Then
WScript.Echo
WScript.Echo "Warning: The optionalproperties list is of an invalid type"
WScript.Echo
ElseIf (UBound (PropertyListSet(1)) = -1) Then
WScript.Echo
WScript.Echo "Warning: The OptionalProperties list for this node is empty."
WScript.Echo
End If
If (Not EnumPathsOnly) Then
For Each PropertyList In PropertyListSet
For Each PropertyName In PropertyList
If Err <> 0 Then
Exit For
End If
' Test to see if the property is even set at this node
IsInherit = False
Err.Clear
Set PropertyAttribObj = IIsObject.GetPropertyAttribObj(PropertyName)
If (Err.Number = 0) Then
If (PropertyAttribObj.IsInherit) Then
IsInherit = True
End If
Err.Clear
If (IsInherit = False) Or (EnumAllData) Then
' If the above statement is true, then the data exists here or the user wants it anyway.
PropertyObjPath = "IIS://" & MachineName & "/Schema/" & PropertyName
Set PropertyObject = GetObject(PropertyObjPath)
If (Err.Number <> 0) Then
WScript.Echo
ReportError ()
WScript.Echo "Error trying to enumerate the Optional properties (Couldn't Get Property Information): " & PropertyObjPath
WScript.Echo "Last Property Name: " & PropertyName
WScript.Echo "PropertyObjPath: " & PropertyObjPath
'WScript.Quit (Err.Number)
WScript.Echo
EnumCommand = Err.Number
Err.Clear
End If
ValueList = ""
ValueListArray = ""
PropertyDataType = UCase(PropertyObject.Syntax)
Select Case PropertyDataType
Case "STRING"
ValueList = IIsObject.Get(PropertyName)
If (IsSecureProperty(PropertyName,MachineName) = True) Then
WScript.Echo PropertyName & Left(Spacer, Len(Spacer) - Len(PropertyName)) & ": " & "(" & PropertyDataType & ") " & """" & "**********" & """"
Else
If (Len(PropertyName) < SpacerSize) Then
WScript.Echo PropertyName & Left(Spacer, Len(Spacer) - Len(PropertyName)) & ": " & "(" & PropertyDataType & ") """ & ValueList & """"
Else
WScript.Echo PropertyName & " : " & "(" & PropertyDataType & ")" & """" & ValueList & """"
End If
End If
Case "EXPANDSZ"
ValueList = IIsObject.Get(PropertyName)
If (Len(PropertyName) < SpacerSize) Then
WScript.Echo PropertyName & Left(Spacer, Len(Spacer) - Len(PropertyName)) & ": " & "(" & PropertyDataType & ") """ & ValueList & """"
Else
WScript.Echo PropertyName & " : " & "(" & PropertyDataType & ") """ & ValueList & """"
End If
Case "BINARY"
ValueListArray = IIsObject.Get(PropertyName)
ValueList = "0x"
For ValueIndex = 0 To UBound(ValueListArray)
ValueList = ValueList & ValueListArray(ValueIndex) & " "
Next
If (Len(PropertyName) < SpacerSize) Then
WScript.Echo PropertyName & Left(Spacer, Len(Spacer) - Len(PropertyName)) & ": " & "(" & PropertyDataType & ") " & ValueList
Else
WScript.Echo PropertyName & " : " & "(" & PropertyDataType & ") " & ValueList
End If
Case "INTEGER"
ValueList = IIsObject.Get(PropertyName)
If (Len(PropertyName) < SpacerSize) Then
WScript.Echo PropertyName & Left(Spacer, Len(Spacer) - Len(PropertyName)) & ": " & "(" & PropertyDataType & ") " & ValueList
Else
WScript.Echo PropertyName & " : " & "(" & PropertyDataType & ") " & ValueList
End If
Case "BOOLEAN"
ValueList = IIsObject.Get(PropertyName)
If (Len(PropertyName) < SpacerSize) Then
WScript.Echo PropertyName & Left(Spacer, Len(Spacer) - Len(PropertyName)) & ": " & "(" & PropertyDataType & ") " & ValueList
Else
WScript.Echo PropertyName & " : " & "(" & PropertyDataType & ") " & ValueList
End If
Case "LIST"
ValueList = IIsObject.Get(PropertyName)
If (Len(PropertyName) < SpacerSize) Then
WScript.Echo PropertyName & _
Left(Spacer, Len(Spacer) - Len(PropertyName)) & _
": " & "(" & PropertyDataType & ") (" & _
(UBound (ValueList) + 1) & " Items)"
Else
WScript.Echo PropertyName & " : " & "(" & PropertyDataType & ") (" & (UBound (ValueList) + 1) & " Items)"
End If
ValueString = ""
For ValueIndex = 0 To UBound(ValueList)
WScript.Echo " """ & ValueList(ValueIndex) & """"
Next
WScript.Echo
Case Else
If (IsSpecialGetProperty(PropertyName)) Then
SpecialResult = DoSpecialGetProp(ObjectPath, PropertyName, MachineName)
Err.Clear
Else
WScript.Echo
WScript.Echo "DataType: " & """" & PropertyObject.Syntax & """" & " Not Yet Supported on property: " & PropertyName
ReportError
WScript.Echo
End If
End Select
End If ' End if data exists at the current node
Else ' Error during GetPropertyAttribObj
Err.Clear 'ignore and go to the next property
End If
If (Err.Number <> 0) Then
WScript.Echo
ReportError ()
WScript.Echo "Error trying to enumerate the Optional properties (Error trying to get property value): " & PropertyObjPath
WScript.Echo "Last Property Name: " & PropertyName
WScript.Echo "PropertyObjPath: " & PropertyObjPath
' If there is an ADS error, just ignore it and move on
' otherwise, quit
If ((Err.Number) >= &H80005000) And ((Err.Number) < &H80006000) Then
Err.Clear
WScript.Echo "Continuing..."
Else
WScript.Quit (Err.Number)
End If
WScript.Echo
End If
Next
Next
If (Err.Number <> 0) Then
WScript.Echo "Error trying to enumerate the properties lists:"
ReportError ()
WScript.Echo
EnumCommand = Err.Number
Err.Clear
End If
End If ' End if (Not EnumPathsOnly)
'WScript.Echo "Last Error: " & Err & " (" & Hex (Err) & "): " & Err.Description
' Now, enumerate the data paths
For Each ChildObject In IIsObject
If (Err.Number <> 0) Then Exit For
ChildObjectName = Right(ChildObject.AdsPath, Len(ChildObject.AdsPath) - 6)
ChildObjectName = Right(ChildObjectName, Len(ChildObjectName) - InStr(ChildObjectName, "/") + 1)
WScript.Echo "[" & ChildObjectName & "]"
If (Recurse = True) And (ChildObjectName <> Args(1)) Then
EnumCommand = EnumCommand(True, ChildObjectName)
End If
Next
If (Err.Number <> 0) Then
WScript.Echo "Error trying to enumerate the child nodes"
ReportError ()
WScript.Echo
EnumCommand = Err.Number
Err.Clear
End If
WScript.Echo ""
End Function
''''''''''''''''''''''''''
'
' Create Function
'
' Creates a path in the metabase. An additional parameter that is
' not found in mdutil is optional. That is the Object Type (KeyType)
' If this is not specified, the object type will be assumed to be
' IIsObject (which, of course, is useless).
'
''''''''''''''''''''''''''
Function CreateCommand(ObjectTypeParam)
On Error Resume Next
Dim IIsObject
Dim IIsObjectPath
Dim IIsObjectRelativePath
Dim NewObject
Dim ObjectTypeName
Dim ParentObjPath
Dim ParentObjSize
Dim FullAdsParentPath
Dim MachineName
Dim OpenErr
' Set the return code - assume success
CreateCommand = 0
' Setup the parameters
If (ArgCount = 2) Then
If (ObjectTypeParam = "") Then
ObjectTypeName = "IIsObject"
Else
ObjectTypeName = ObjectTypeParam
End If
ElseIf (ArgCount = 3) Then
ObjectTypeName = Args(2)
Else
WScript.Echo "Error: Wrong number of Args for the CREATE command"
DisplayHelpMessage
WScript.Quit (GENERAL_FAILURE)
End If
IIsObjectPath = Args(1)
SanitizePath IIsObjectPath
MachineName = SeparateMachineName(IIsObjectPath)
' Parse the path and determine if the parent exists.
ParentObjSize = InStrRev(IIsObjectPath, "/")
ParentObjPath = ""
If ParentObjSize <> 0 Then
ParentObjPath = Left(IIsObjectPath, ParentObjSize - 1)
IIsObjectRelativePath = Right(IIsObjectPath, Len(IIsObjectPath) - ParentObjSize)
Else
IIsObjectRelativePath = IIsObjectPath
End If
If ParentObjPath <> "" Then
FullAdsParentPath = "IIS://" & MachineName & "/" & ParentObjPath
Else
FullAdsParentPath = "IIS://" & MachineName
End If
'debug
'WScript.Echo "Last Error: " & Err.Number
'WScript.Echo "MachineName: " & MachineName
'WScript.Echo "ParentObjPath: " & ParentObjPath
'WScript.Echo "FullAdsParentPath: " & FullAdsParentPath
'WScript.Echo "IIsObjectPath: " & IIsObjectPath
'WScript.Echo "IIsObjectRelativePath: " & IIsObjectRelativePath
'WScript.Echo "ObjectTypeName: " & ObjectTypeName
' First, attempt to open the parent path and add the new path.
Set IIsObject = GetObject(FullAdsParentPath)
If Err.Number <> 0 Then
OpenErr = Err.Number
OpenErrDesc = Err.Description
Err.Clear
' Attempt to get the Computer Object (IIS://LocalHost)
Set IIsObject = GetObject("IIS://" & MachineName)
If Err.Number <> 0 Then
WScript.Echo
ReportError ()
WScript.Echo "Error accessing the object: " & IIsObjectPath
WScript.Quit (Err.Number)
End If
End If
'Now, attempt to add the new object.
If (OpenErr <> 0) Then
Set NewObject = IIsObject.Create(ObjectTypeName, IIsObjectPath)
Else
Set NewObject = IIsObject.Create(ObjectTypeName, IIsObjectRelativePath)
End If
If Err.Number <> 0 Then
WScript.Echo
ReportError ()
WScript.Echo "Error creating the object: " & IIsObjectPath
WScript.Quit (Err.Number)
End If
NewObject.Setinfo
If Err.Number <> 0 Then
WScript.Echo
ReportError ()
WScript.Echo "Error creating the object: " & IIsObjectPath
WScript.Quit (Err.Number)
End If
' Now, if the parent object was not created, generate a warning.
If OpenErr <> 0 Then
WScript.Echo
WScript.Echo "WARNING: The parent path (" & ParentObjPath & ") was not already created."
WScript.Echo " This means that some of the intermediate objects will not have an accurate"
WScript.Echo " Object Type. You should fix this by setting the KeyType on the intermediate"
WScript.Echo " objects."
WScript.Echo
CreateCommand = GENERAL_WARNING
End If
If UCase(ObjectTypeName) = "IISOBJECT" Then
WScript.Echo
WScript.Echo "WARNING: The Object Type of this object was not specified or was specified as"
WScript.Echo " IIsObject. This means that you will not be able to set or get properties"
WScript.Echo " on the object until the KeyType property is set."
WScript.Echo
CreateCommand = GENERAL_WARNING
End If
WScript.Echo "created """ & IIsObjectPath & """"
End Function
''''''''''''''''''''''''''
'
' Delete Function
'
' Deletes a path in the metabase.
'
''''''''''''''''''''''''''
Function DeleteCommand()
On Error Resume Next
Dim IIsObject
Dim IIsObjectPath
Dim ObjectPath
Dim ObjectParam
Dim MachineName
Dim DummyVariant
Dim DeletePathOnly
ReDim DummyVariant(0)
DummyVariant(0) = "Crap"
' Set the return code - assume success
DeleteCommand = 0
' Setup the parameters
If (ArgCount <> 2) Then
WScript.Echo "Error: Wrong number of Args for the DELETE command"
WScript.Quit (GENERAL_FAILURE)
End If
ObjectPath = Args(1)
' Check and see if the user is specifically asking to delete the path
DeletePathOnly = False
If Right(ObjectPath, 1) = "/" Then
DeletePathOnly = True
End If
' Sanitize the path and split parameter and path
SanitizePath ObjectPath
MachineName = SeparateMachineName(ObjectPath)
ObjectParam = SplitParam(ObjectPath)
' Open the parent object
IIsObjectPath = "IIS://" & MachineName
If ObjectPath <> "" Then
IIsObjectPath = IIsObjectPath & "/" & ObjectPath
End If
Set IIsObject = GetObject(IIsObjectPath)
If Err.Number <> 0 Then
WScript.Echo
ReportError ()
WScript.Echo "Error deleting the object: " & ObjectPath & "/" & ObjectParam
WScript.Quit (Err.Number)
End If
' If they did not specifically ask to delete the path, then attempt to delete the property
If Not DeletePathOnly Then
' Try to delete the property
' ADS_PROPERTY_CLEAR used to be defined, but it isn't anymore.
'IIsObject.PutEx ADS_PROPERTY_CLEAR, ObjectParam, DummyVariant
IIsObject.PutEx "1", ObjectParam, DummyVariant
' If it succeeded, then just return, else continue and try to delete the path
If Err.Number = 0 Then
WScript.Echo "deleted property """ & ObjectParam & """"
Exit Function
End If
Err.Clear
End If
' Try to just delete the path
IIsObject.Delete "IIsObject", ObjectParam
If Err.Number <> 0 Then
WScript.Echo
ReportError ()
WScript.Echo "Error deleting the object: " & ObjectPath & "/" & ObjectParam
WScript.Quit (Err.Number)
End If
WScript.Echo "deleted path """ & ObjectPath & "/" & ObjectParam & """"
Exit Function
End Function
''''''''''''''''''''''''''
'
' EnumAllCommand
'
' Enumerates all data and all properties in the metabase under the current path.
'
''''''''''''''''''''''''''
Function EnumAllCommand()
On Error Resume Next
WScript.Echo "ENUM_ALL Command not yet supported"
End Function
''''''''''''''''''''''''''
'
' CopyMoveCommand
'
' Copies a path in the metabase to another path.
'
''''''''''''''''''''''''''
Function CopyMoveCommand(bCopyFlag)
On Error Resume Next
Dim SrcObjectPath
Dim DestObjectPath
Dim DestObject
Dim ParentObjectPath
Dim ParentRelativePath
Dim ParentObject
Dim MachineName
Dim TmpDestLeftPath
Dim TmpSrcLeftPath
CopyMoveCommand = 0 ' Assume Success
If ArgCount <> 3 Then
WScript.Echo "Error: Wrong number of Args for the Copy/Move command"
WScript.Quit (GENERAL_FAILURE)
End If
SrcObjectPath = Args(1)
DestObjectPath = Args(2)
SanitizePath SrcObjectPath
SanitizePath DestObjectPath
MachineName = SeparateMachineName(SrcObjectPath)
ParentObjectPath = "IIS://" & MachineName
' Extract the left part of the paths until there are no more left parts to extract
Do
TmpSrcLeftPath = SplitLeftPath(SrcObjectPath)
TmpDestLeftPath = SplitLeftPath(DestObjectPath)
If (SrcObjectPath = "") Or (DestObjectPath = "") Then
SrcObjectPath = TmpSrcLeftPath & "/" & SrcObjectPath
DestObjectPath = TmpDestLeftPath & "/" & DestObjectPath
Exit Do
End If
If (TmpSrcLeftPath <> TmpDestLeftPath) Then
SrcObjectPath = TmpSrcLeftPath & "/" & SrcObjectPath
DestObjectPath = TmpDestLeftPath & "/" & DestObjectPath
Exit Do
End If
ParentObjectPath = ParentObjectPath & "/" & TmpSrcLeftPath
ParentRelativePath = ParentRelativePath & "/" & TmpSrcLeftPath
Loop
SanitizePath SrcObjectPath
SanitizePath DestObjectPath
SanitizePath ParentObjectPath
' Now, open the parent object and Copy/Move the objects
Set ParentObject = GetObject(ParentObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to open the object: " & ParentObjectPath
WScript.Quit (Err.Number)
End If
If (bCopyFlag) Then
Set DestObject = ParentObject.CopyHere(SrcObjectPath, DestObjectPath)
Else
Set DestObject = ParentObject.MoveHere(SrcObjectPath, DestObjectPath)
End If
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to Copy/Move Source to Dest."
WScript.Quit (Err.Number)
End If
If (bCopyFlag) Then
WScript.Echo "copied from " & ParentRelativePath & "/" & SrcObjectPath & " to " & ParentRelativePath & "/" & DestObjectPath
Else
WScript.Echo "moved from " & ParentRelativePath & "/" & SrcObjectPath & " to " & ParentRelativePath & "/" & DestObjectPath
End If
End Function
''''''''''''''''''''''''''
'
' StartServerCommand
'
' Starts a server in the metabase.
'
''''''''''''''''''''''''''
Function StartServerCommand()
On Error Resume Next
Dim IIsObject
Dim IIsObjectPath
Dim ObjectPath
Dim MachineName
If ArgCount <> 2 Then
WScript.Echo "Error: Wrong number of Args for the START_SERVER command"
WScript.Quit (GENERAL_FAILURE)
End If
ObjectPath = Args(1)
SanitizePath ObjectPath
MachineName = SeparateMachineName(ObjectPath)
IIsObjectPath = "IIS://" & MachineName & "/" & ObjectPath
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to open the object: " & ObjectPath
WScript.Quit (Err.Number)
End If
'debug
'WScript.echo "About to start server. Last Error: " & Err.Number
IIsObject.Start
'WScript.echo "After starting server. Last Error: " & Err.Number
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to START the server: " & ObjectPath
WScript.Quit (Err.Number)
End If
WScript.Echo "Server " & ObjectPath & " Successfully STARTED"
End Function
''''''''''''''''''''''''''
'
' StopServerCommand
'
' Stops a server in the metabase.
'
''''''''''''''''''''''''''
Function StopServerCommand()
On Error Resume Next
Dim IIsObject
Dim IIsObjectPath
Dim ObjectPath
Dim MachineName
If ArgCount <> 2 Then
WScript.Echo "Error: Wrong number of Args for the STOP_SERVER command"
WScript.Quit (GENERAL_FAILURE)
End If
ObjectPath = Args(1)
SanitizePath ObjectPath
MachineName = SeparateMachineName(ObjectPath)
IIsObjectPath = "IIS://" & MachineName & "/" & ObjectPath
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to open the object: " & ObjectPath
WScript.Quit (Err.Number)
End If
IIsObject.Stop
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to STOP the server: " & ObjectPath
WScript.Quit (Err.Number)
End If
WScript.Echo "Server " & ObjectPath & " Successfully STOPPED"
End Function
''''''''''''''''''''''''''
'
' PauseServerCommand
'
' Pauses a server in the metabase.
'
''''''''''''''''''''''''''
Function PauseServerCommand()
On Error Resume Next
Dim IIsObject
Dim IIsObjectPath
Dim ObjectPath
Dim MachineName
If ArgCount <> 2 Then
WScript.Echo "Error: Wrong number of Args for the PAUSE_SERVER command"
WScript.Quit (GENERAL_FAILURE)
End If
ObjectPath = Args(1)
SanitizePath ObjectPath
MachineName = SeparateMachineName(ObjectPath)
IIsObjectPath = "IIS://" & MachineName & "/" & ObjectPath
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to open the object: " & ObjectPath
WScript.Quit (Err.Number)
End If
IIsObject.Pause
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to PAUSE the server: " & ObjectPath
WScript.Quit (Err.Number)
End If
WScript.Echo "Server " & ObjectPath & " Successfully PAUSED"
End Function
''''''''''''''''''''''''''
'
' ContinueServerCommand
'
' Continues a server in the metabase.
'
''''''''''''''''''''''''''
Function ContinueServerCommand()
On Error Resume Next
Dim IIsObject
Dim IIsObjectPath
Dim ObjectPath
Dim MachineName
If ArgCount <> 2 Then
WScript.Echo "Error: Wrong number of Args for the CONTINUE_SERVER command"
WScript.Quit (GENERAL_FAILURE)
End If
ObjectPath = Args(1)
SanitizePath ObjectPath
MachineName = SeparateMachineName(ObjectPath)
IIsObjectPath = "IIS://" & MachineName & "/" & ObjectPath
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to open the object: " & ObjectPath
WScript.Quit (Err.Number)
End If
IIsObject.Continue
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to CONTINUE the server: " & ObjectPath
WScript.Quit (Err.Number)
End If
WScript.Echo "Server " & ObjectPath & " Successfully CONTINUED"
End Function
Function FindData()
' FindData will accept 1 parameter from the command line - the node and
' property to search for (i.e. w3svc/1/ServerComment)
On Error Resume Next
Dim ObjectPath
Dim ObjectParameter
Dim NewObjectparameter
Dim MachineName
Dim IIsObjectPath
Dim IIsObject
Dim Path
Dim PathList
Dim I
FindData = 0 ' Assume Success
If ArgCount <> 2 Then
WScript.Echo "Error: Wrong number of Args for the FIND_DATA command"
WScript.Quit (GENERAL_FAILURE)
End If
ObjectPath = Args(1)
SanitizePath ObjectPath
MachineName = SeparateMachineName(ObjectPath)
ObjectParameter = SplitParam(ObjectPath)
' Since people may still want to use MDUTIL parameter names
' we should still do the GET translation of parameter names.
NewObjectparameter = MapSpecGetParamName(ObjectParameter)
ObjectParameter = NewObjectparameter
If ObjectPath = "" Then
IIsObjectPath = "IIS://" & MachineName
Else
IIsObjectPath = "IIS://" & MachineName & "/" & ObjectPath
End If
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to find data paths for the Object (GetObject Failed): " & ObjectPath
WScript.Quit (Err.Number)
End If
' Now, list out all the places where this property exists.
PathList = IIsObject.GetDataPaths(ObjectParameter, IIS_DATA_INHERIT)
If Err.Number <> 0 Then PathList = IIsObject.GetDataPaths(ObjectParameter, IIS_DATA_NO_INHERIT)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to get a path list (GetDataPaths Failed): " & ObjectPath
WScript.Quit (Err.Number)
End If
If UBound(PathList) < 0 Then
WScript.Echo "Property " & ObjectParameter & " was not found at any node beneath " & ObjectPath
Else
WScript.Echo "Property " & ObjectParameter & " found at:"
For Each Path In PathList
Path = Right(Path, Len(Path) - 6)
Path = Right(Path, Len(Path) - InStr(Path, "/"))
WScript.Echo " " & Path
Next
End If
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error listing the data paths (_newEnum Failed): " & ObjectPath
WScript.Quit (Err.Number)
End If
End Function
'''''''''''''''''''''
'
' MimeMapGet
'
' Special function for displaying a MimeMap property
'
'''''''''''''''''''''
Function MimeMapGet(ObjectPath, MachineName)
On Error Resume Next
Dim MimePath
Dim MimeMapList
Dim MimeMapObject
Dim MimeEntry
Dim MimeEntryIndex
Dim MimeStr
Dim MimeOutPutStr
Dim DataPathList
Dim DataPath
MimeMapGet = 0 ' Assume Success
MimePath = "IIS://" & MachineName
If ObjectPath <> "" Then MimePath = MimePath & "/" & ObjectPath
' Get the object that contains the mimemap
Set MimeMapObject = GetObject(MimePath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to get the Object: " & ObjectPath
WScript.Quit (Err.Number)
End If
' Test to see if the property is ACTUALLY set at this node
DataPathList = MimeMapObject.GetDataPaths("MimeMap", IIS_DATA_INHERIT)
If Err.Number <> 0 Then DataPathList = IIsObject.GetDataPaths(MimeMap, IIS_DATA_NO_INHERIT)
Err.Clear
' If the data is not set anywhere, then stop the madness
If (UBound(DataPathList) < 0) Then
MimeMapGet = &H80005006 ' end with property not set error
Exit Function
End If
DataPath = DataPathList(0)
SanitizePath DataPath
' Test to see if the item is actually set HERE
If UCase(DataPath) <> UCase(MimePath) Then
MimeMapGet = &H80005006 ' end with property not set error
Exit Function
End If
' Get the mime map list from the object
MimeMapList = MimeMapObject.Get("MimeMap")
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to get the Object: " & ObjectPath
WScript.Quit (Err.Number)
End If
MimeOutPutStr = "MimeMap : (MimeMapList) "
' Enumerate the Mime Entries
For MimeEntryIndex = 0 To UBound(MimeMapList)
Set MimeEntry = MimeMapList(MimeEntryIndex)
MimeOutPutStr = MimeOutPutStr & """" & MimeEntry.Extension & "," & MimeEntry.MimeType & """ "
Next
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to Create the Mime Map List."
WScript.Quit (Err.Number)
End If
WScript.Echo MimeOutPutStr
End Function
Function MimeMapSet(ObjectPath, ObjectParameter, MachineName)
On Error Resume Next
Dim MimePath
Dim MimeEntryIndex
Dim MimeMapList()
Dim MimeMapObject
Dim MimeEntry
Dim MimeStr
Dim MimeOutPutStr
MimeMapSet = 0 ' Assume Success
' First, check the number of args
If ArgCount < 3 Then
WScript.Echo "Error: Wrong number of Args for the Set MIMEMAP command"
WScript.Quit (GENERAL_FAILURE)
End If
MimePath = "IIS://" & MachineName
If ObjectPath <> "" Then MimePath = MimePath & "/" & ObjectPath
' Get the object that contains the mimemap
Set MimeMapObject = GetObject(MimePath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to get the Object: " & ObjectPath
WScript.Quit (Err.Number)
End If
' Create a new MimeMapList of Mime Entries
ReDim MimeMapList(ArgCount - 3)
MimeOutPutStr = "MimeMap : (MimeMapList) "
' Fill the list with mime entries
For MimeEntryIndex = 0 To UBound(MimeMapList)
MimeStr = Args(2 + MimeEntryIndex)
MimeOutPutStr = MimeOutPutStr & """" & MimeStr & """ "
Set MimeEntry = CreateObject("MimeMap")
MimeEntry.MimeType = Right (MimeStr, Len(MimeStr) - InStr(MimeStr, ","))
MimeEntry.Extension = Left(MimeStr, InStr(MimeStr, ",") - 1)
Set MimeMapList(MimeEntryIndex) = MimeEntry
Next
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to Create the Mime Map List."
WScript.Quit (Err.Number)
End If
MimeMapObject.MimeMap = MimeMapList
MimeMapObject.Setinfo
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying to set the Object's ""MimeMap"" property to the new mimemap list."
WScript.Quit (Err.Number)
End If
WScript.Echo MimeOutPutStr
End Function
''''''''''''''''''''''''''
'
' IsSpecialGetProperty
'
' Checks to see if the property requires special processing in order to
' display its contents.
'
''''''''''''''''''''''''''
Function IsSpecialGetProperty(ObjectParameter)
On Error Resume Next
Select Case UCase(ObjectParameter)
Case "MIMEMAP"
IsSpecialGetProperty = True
Case Else
IsSpecialGetProperty = False
End Select
End Function
''''''''''''''''''''''''''
'
' DoSpecialGetProp
'
' Checks to see if the property requires special processing in order to
' display its contents.
'
''''''''''''''''''''''''''
Function DoSpecialGetProp(ObjectPath, ObjectParameter, MachineName)
On Error Resume Next
Select Case UCase(ObjectParameter)
Case "MIMEMAP"
DoSpecialGetProp = MimeMapGet(ObjectPath, MachineName)
Case Else
DoSpecialGetProp = False
End Select
End Function
''''''''''''''''''''''''''
'
' IsSpecialSetProperty
'
' Checks to see if the property is a type that needs to be handled
' specially for compatibility with mdutil
'
''''''''''''''''''''''''''
Function IsSpecialSetProperty(ObjectParameter)
On Error Resume Next
Select Case UCase(ObjectParameter)
Case "APPPOOLCOMMAND"
IsSpecialSetProperty = True
Case "SERVERCOMMAND"
IsSpecialSetProperty = True
Case "ACCESSPERM"
IsSpecialSetProperty = True
Case "VRPATH"
IsSpecialSetProperty = True
Case "AUTHORIZATION"
IsSpecialSetProperty = True
Case "MIMEMAP"
IsSpecialSetProperty = True
Case Else
IsSpecialSetProperty = False
End Select
End Function
''''''''''''''''''''''''''
'
' DoSpecialSetProp
'
' Handles datatypes that need to be handled
' specially for compatibility with mdutil
'
''''''''''''''''''''''''''
Function DoSpecialSetProp(ObjectPath, ObjectParameter, MachineName)
Dim IIsObjectPath
Dim IIsObject
Dim ValueList
Dim ValueDisplay
Dim PermIndex
On Error Resume Next
DoSpecialSetProp = 0 ' Assume Success
Select Case UCase(ObjectParameter)
Case "SERVERCOMMAND"
IIsObjectPath = "IIS://" & MachineName & "/" & ObjectPath
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Get the Object: " & ObjectPath
WScript.Quit (Err.Number)
End If
If (IIsObject.KeyType <> "IIsWebServer") Then
ReportError ()
WScript.Echo "Can't set ServerCommand on a non-IIsWebServer object."
WScript.Quit (GENERAL_FAILURE)
End If
ValueList = CLng(Args(2))
Select Case ValueList
Case 1
IIsObject.Start
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Start the server: " & ObjectPath
WScript.Quit (Err.Number)
End If
WScript.Echo "Server " & ObjectPath & " Successfully STARTED"
Case 2
IIsObject.Stop
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Stop the server: " & ObjectPath
WScript.Quit (Err.Number)
End If
WScript.Echo "Server " & ObjectPath & " Successfully STOPPED"
Case 3
IIsObject.Pause
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Pause the server: " & ObjectPath
WScript.Quit (Err.Number)
End If
WScript.Echo "Server " & ObjectPath & " Successfully PAUSED"
Case 4
IIsObject.Continue
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Continue the server: " & ObjectPath
WScript.Quit (Err.Number)
End If
WScript.Echo "Server " & ObjectPath & " Successfully Continued"
Case Else
WScript.Echo "Invalid ServerCommand: " & ValueList
DoSpecialSetProp = GENERAL_FAILURE
End Select
Exit Function
Case "APPPOOLCOMMAND"
IIsObjectPath = "IIS://" & MachineName & "/" & ObjectPath
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Get the Object: " & ObjectPath
WScript.Quit (Err.Number)
End If
If (IIsObject.KeyType <> "IIsApplicationPool") Then
ReportError ()
WScript.Echo "Can't set AppPoolCommand on a non-IIsApplicationPool object."
WScript.Quit (GENERAL_FAILURE)
End If
ValueList = CLng(Args(2))
Select Case ValueList
Case 1
IIsObject.Start
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Start the application pool: " & ObjectPath
WScript.Quit (Err.Number)
End If
WScript.Echo "Application pool " & ObjectPath & " Successfully STARTED"
Case 2
IIsObject.Stop
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Stop the application pool: " & ObjectPath
WScript.Quit (Err.Number)
End If
WScript.Echo "Application pool " & ObjectPath & " Successfully STOPPED"
Case Else
WScript.Echo "Invalid AppPoolCommand: " & ValueList
DoSpecialSetProp = GENERAL_FAILURE
End Select
Exit Function
Case "ACCESSPERM"
IIsObjectPath = "IIS://" & MachineName & "/" & ObjectPath
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Get the Object: " & ObjectPath
WScript.Quit (Err.Number)
End If
' Set the access flags to None, first, and then add them back, as necessary
IIsObject.AccessFlags = 0
' Set up the display output
ValueDisplay = "AccessFlags (AccessPerm)" & (Right(Spacer, SpacerSize - Len("AccessFlags (AccessPerm)")) & ": " & "(" & TypeName(IIsObject.AccessFlags) & ") ")
' Attempt to convert parameter to number
Dim APValue
Dim TempValStr
TempValStr = Args(2)
' Check for Hex
If (UCase(Left(Args(2), 2)) = "0X") Then
TempValStr = "&H" & Right(TempValStr, Len(TempValStr) - 2)
End If
APValue = CLng(TempValStr)
If (Err.Number = 0) Then
IIsObject.AccessFlags = APValue
ValueDisplay = ValueDisplay & " " & APValue & " (0x" & Hex(APValue) & ")"
Else
Err.Clear
For PermIndex = 2 To ArgCount - 1
Select Case UCase(Args(PermIndex))
Case "READ"
IIsObject.AccessRead = True
ValueDisplay = ValueDisplay & " Read"
Case "WRITE"
IIsObject.AccessWrite = True
ValueDisplay = ValueDisplay & " Write"
Case "EXECUTE"
IIsObject.AccessExecute = True
ValueDisplay = ValueDisplay & " Execute"
Case "SCRIPT"
IIsObject.AccessScript = True
ValueDisplay = ValueDisplay & " Script"
Case Else
WScript.Echo "Error: Setting not supported: " & Args(PermIndex)
WScript.Quit (GENERAL_FAILURE)
End Select
Next
End If
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Set data on the Object: " & ObjectPath
WScript.Quit (Err.Number)
End If
IIsObject.Setinfo
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Set data on the Object: " & ObjectPath
WScript.Quit (Err.Number)
End If
' Send the current settings to the screen
WScript.Echo ValueDisplay
Case "VRPATH"
IIsObjectPath = "IIS://" & MachineName & "/" & ObjectPath
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Get the Object: " & ObjectPath
WScript.Quit (Err.Number)
End If
' Set the access flags to None, first, and then add them back, as necessary
IIsObject.Path = Args(2)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Set data on the Object: " & ObjectPath
WScript.Quit (Err.Number)
End If
' Set up the display output
ValueDisplay = "Path (VRPath)" & (Right(Spacer, SpacerSize - Len("Path (VRPath)")) & ": " & "(" & TypeName(IIsObject.Path) & ") " & IIsObject.Path)
IIsObject.Setinfo
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Set data on the Object: " & ObjectPath
WScript.Quit (Err.Number)
End If
' Send the current settings to the screen
WScript.Echo ValueDisplay
Case "AUTHORIZATION"
IIsObjectPath = "IIS://" & MachineName & "/" & ObjectPath
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Get the Object: " & ObjectPath
WScript.Quit (Err.Number)
End If
' Set the auth flags to None, first, and then add them back, as necessary
IIsObject.AuthFlags = 0
' Set up the display output
ValueDisplay = "Authorization" & (Right(Spacer, SpacerSize - Len("Authorization")) & ": " & "(" & TypeName(IIsObject.AuthFlags) & ") ")
For PermIndex = 2 To ArgCount - 1
Select Case UCase(Args(PermIndex))
Case "NT"
IIsObject.AuthNTLM = True
ValueDisplay = ValueDisplay & " NT"
Case "ANONYMOUS"
IIsObject.AuthAnonymous = True
ValueDisplay = ValueDisplay & " Anonymous"
Case "BASIC"
IIsObject.AuthBasic = True
ValueDisplay = ValueDisplay & " Basic"
Case Else
WScript.Echo "Error: Setting not supported: " & Args(PermIndex)
WScript.Quit (GENERAL_FAILURE)
End Select
Next
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Set data on the Object: " & ObjectPath
WScript.Quit (Err.Number)
End If
IIsObject.Setinfo
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Set data on the Object: " & ObjectPath
WScript.Quit (Err.Number)
End If
' Send the current settings to the screen
WScript.Echo ValueDisplay
Case "MIMEMAP"
DoSpecialSetProp = MimeMapSet(ObjectPath, ObjectParameter, MachineName)
' Case "FILTER"
' DoSpecialSetProp = FiltersSet()
Case Else
DoSpecialSetProp = GENERAL_FAILURE
End Select
End Function
''''''''''''''''''''''''''''''
'
' Function SeparateMachineName
'
' This function will get the machine name from the Path parameter
' that was passed into the script. It will also alter the passed in
' path so that it contains only the rest of the path - not the machine
' name. If there is no machine name in the path, then the script
' will assume LocalHost.
'
''''''''''''''''''''''''''''''
Function SeparateMachineName(Path)
On Error Resume Next
' Temporarily, just return LocalHost
' SeparateMachineName = "LocalHost"
SeparateMachineName = TargetServer
Exit Function
End Function
''''''''''''''''''''''''''''''
'
' Function MapSpecGetParamName
'
' Some parameters in MDUTIL are named differently in ADSI.
' This function maps the improtant parameter names to ADSI
' names.
'
''''''''''''''''''''''''''''''
Function MapSpecGetParamName(ObjectParameter)
On Error Resume Next
Select Case UCase(ObjectParameter)
Case "ACCESSPERM"
WScript.Echo "Note: Your parameter """ & ObjectParameter & """ is being mapped to AccessFlags"
WScript.Echo " Check individual perms using ""GET AccessRead"", ""GET AccessWrite"", etc."
MapSpecGetParamName = "AccessFlags"
Case "VRPATH"
'WScript.Echo "Note: Your parameter """ & ObjectParameter & """ is being mapped to PATH"
MapSpecGetParamName = "Path"
Case "AUTHORIZATION"
WScript.Echo "Note: Your parameter """ & ObjectParameter & """ is being mapped to AuthFlags"
WScript.Echo " Check individual auths using ""GET AuthNTLM"", ""GET AuthBasic"", etc."
MapSpecGetParamName = "AuthFlags"
Case Else
' Do nothing - the parameter doesn't map to anything special
MapSpecGetParamName = ObjectParameter
End Select
End Function
Sub ReportError()
' On Error Resume Next
Dim ErrorDescription
Select Case (Err.Number)
Case &H80070003
ErrorDescription = "The path requested could not be found."
Case &H80070005
ErrorDescription = "Access is denied for the requested path or property."
Case &H80070094
ErrorDescription = "The requested path is being used by another application."
Case Else
ErrorDescription = Err.Description
End Select
WScript.Echo ErrorDescription
WScript.Echo "ErrNumber: " & Err.Number & " (0x" & Hex(Err.Number) & ")"
End Sub
Function SplitParam(ObjectPath)
' Note: Assume the string has been sanitized (no leading or trailing slashes)
On Error Resume Next
Dim SlashIndex
Dim TempParam
Dim ObjectPathLen
SplitParam = "" ' Assume no parameter
ObjectPathLen = Len(ObjectPath)
' Separate the path of the node from the parameter
SlashIndex = InStrRev(ObjectPath, "/")
If (SlashIndex = 0) Or (SlashIndex = ObjectPathLen) Then
TempParam = ObjectPath
ObjectPath = "" ' ObjectParameter is more important
Else
TempParam = ObjectPath
ObjectPath = Left(ObjectPath, SlashIndex - 1)
TempParam = Right(TempParam, Len(TempParam) - SlashIndex)
End If
SplitParam = TempParam
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to Split the parameter from the object: " & ObjectPath
WScript.Quit (Err.Number)
End If
End Function
Function SplitLeftPath(ObjectPath)
' Note: Assume the string has been sanitized (no leading or trailing slashes)
On Error Resume Next
Dim SlashIndex
Dim TmpLeftPath
Dim ObjectPathLen
'WScript.Echo "SplitLeftPath: ObjectPath: " & ObjectPath
'WScript.Echo "LastError: " & Err.Number & " (" & Hex (Err.Number) & ")"
SplitLeftPath = "" ' Assume no LeftPath
ObjectPathLen = Len(ObjectPath)
' Separate the left part of the path from the remaining path
SlashIndex = InStr(ObjectPath, "/")
If (SlashIndex = 0) Or (SlashIndex = ObjectPathLen) Then
TmpLeftPath = ObjectPath
ObjectPath = ""
Else
TmpLeftPath = Left(ObjectPath, SlashIndex - 1)
ObjectPath = Right(ObjectPath, Len(ObjectPath) - SlashIndex)
End If
'WScript.Echo "SplitLeftPath: ObjectPath: " & ObjectPath
'WScript.Echo "SplitLeftPath: TmpLeftPath: " & TmpLeftPath
'WScript.Echo "LastError: " & Err.Number & " (" & Hex (Err.Number) & ")"
SplitLeftPath = TmpLeftPath
'WScript.Echo "SplitLeftPath: ObjectPath: " & ObjectPath
'WScript.Echo "LastError: " & Err.Number & " (" & Hex (Err.Number) & ")"
'WScript.Echo "SplitLeftPath: TmpLeftPath: " & TmpLeftPath
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to split the left part of the path: " & ObjectPath
WScript.Quit (Err.Number)
End If
End Function
Sub SanitizePath(ObjectPath)
On Error Resume Next
' Remove WhiteSpace
Do While (Left(ObjectPath, 1) = " ")
ObjectPath = Right(ObjectPath, Len(ObjectPath) - 1)
Loop
Do While (Right(ObjectPath, 1) = " ")
ObjectPath = Left(ObjectPath, Len(ObjectPath) - 1)
Loop
' Replace all occurrences of \ with /
ObjectPath = Replace(ObjectPath, "\", "/")
' Remove leading and trailing slashes
If Left(ObjectPath, 1) = "/" Then
ObjectPath = Right(ObjectPath, Len(ObjectPath) - 1)
End If
If Right(ObjectPath, 1) = "/" Then
ObjectPath = Left(ObjectPath, Len(ObjectPath) - 1)
End If
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error Trying To Sanitize the path: " & ObjectPath
WScript.Quit (Err.Number)
End If
End Sub
'''''''''''''''''''''''''''''
' AppCreateCommand
'''''''''''''''''''''''''''''
Function AppCreateCommand(InProcFlag)
On Error Resume Next
Dim IIsObject
Dim IIsObjectPath
Dim ObjectPath
Dim MachineName
AppCreateCommand = 0 ' Assume Success
If ArgCount <> 2 Then
WScript.Echo "Error: Wrong number of Args for the APPCREATE command"
WScript.Quit (GENERAL_FAILURE)
End If
ObjectPath = Args(1)
SanitizePath ObjectPath
MachineName = SeparateMachineName(ObjectPath)
IIsObjectPath = "IIS://" & MachineName
If ObjectPath <> "" Then
IIsObjectPath = IIsObjectPath & "/" & ObjectPath
End If
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to get the path of the application: " & ObjectPath
WScript.Quit (Err.Number)
End If
IIsObject.AppCreate2 (InProcFlag)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to create the application: " & ObjectPath
WScript.Quit (Err.Number)
End If
WScript.Echo "Application Created."
End Function
'''''''''''''''''''''''''''''
' AppDeleteCommand
'''''''''''''''''''''''''''''
Function AppDeleteCommand()
On Error Resume Next
Dim IIsObject
Dim IIsObjectPath
Dim ObjectPath
Dim MachineName
AppDeleteCommand = 0 ' Assume Success
If ArgCount <> 2 Then
WScript.Echo "Error: Wrong number of Args for the APPDELETE command"
WScript.Quit (GENERAL_FAILURE)
End If
ObjectPath = Args(1)
SanitizePath ObjectPath
MachineName = SeparateMachineName(ObjectPath)
IIsObjectPath = "IIS://" & MachineName
If ObjectPath <> "" Then
IIsObjectPath = IIsObjectPath & "/" & ObjectPath
End If
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to get the path of the application: " & ObjectPath
WScript.Quit (Err.Number)
End If
IIsObject.AppDelete
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to DELETE the application: " & ObjectPath
WScript.Quit (Err.Number)
End If
WScript.Echo "Application Deleted."
End Function
'''''''''''''''''''''''''''''
' AppUnloadCommand
'''''''''''''''''''''''''''''
Function AppUnloadCommand()
On Error Resume Next
Dim IIsObject
Dim IIsObjectPath
Dim ObjectPath
Dim MachineName
AppUnloadCommand = 0 ' Assume Success
If ArgCount <> 2 Then
WScript.Echo "Error: Wrong number of Args for the APPUNLOAD command"
WScript.Quit (GENERAL_FAILURE)
End If
ObjectPath = Args(1)
SanitizePath ObjectPath
MachineName = SeparateMachineName(ObjectPath)
IIsObjectPath = "IIS://" & MachineName
If ObjectPath <> "" Then
IIsObjectPath = IIsObjectPath & "/" & ObjectPath
End If
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to get the path of the application: " & ObjectPath
WScript.Quit (Err.Number)
End If
IIsObject.AppUnload
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to UNLOAD the application: " & ObjectPath
WScript.Quit (Err.Number)
End If
WScript.Echo "Application Unloaded."
End Function
Function AppDisableCommand()
On Error Resume Next
Dim IIsObject
Dim IIsObjectPath
Dim ObjectPath
Dim MachineName
AppDisableCommand = 0 ' Assume Success
If ArgCount <> 2 Then
WScript.Echo "Error: Wrong number of Args for the APPDISABLE command"
WScript.Quit (GENERAL_FAILURE)
End If
ObjectPath = Args(1)
SanitizePath ObjectPath
MachineName = SeparateMachineName(ObjectPath)
'debug
'WScript.Echo "Last Error: " & Err & " (" & Hex (Err) & "): " & Err.Description
IIsObjectPath = "IIS://" & MachineName
If ObjectPath <> "" Then
IIsObjectPath = IIsObjectPath & "/" & ObjectPath
End If
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to get the path of the application: " & ObjectPath
WScript.Quit (Err.Number)
End If
IIsObject.AppDisable
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to disable the application: " & ObjectPath
WScript.Quit (Err.Number)
End If
'debug
'WScript.Echo "Last Error: " & Err & " (" & Hex (Err) & "): " & Err.Description
WScript.Echo "Application Disabled."
End Function
Function AppEnableCommand()
On Error Resume Next
Dim IIsObject
Dim IIsObjectPath
Dim ObjectPath
Dim MachineName
AppEnableCommand = 0 ' Assume Success
If ArgCount <> 2 Then
WScript.Echo "Error: Wrong number of Args for the APPENABLE command"
WScript.Quit (GENERAL_FAILURE)
End If
ObjectPath = Args(1)
SanitizePath ObjectPath
MachineName = SeparateMachineName(ObjectPath)
'debug
'WScript.Echo "Last Error: " & Err & " (" & Hex (Err) & "): " & Err.Description
IIsObjectPath = "IIS://" & MachineName
If ObjectPath <> "" Then
IIsObjectPath = IIsObjectPath & "/" & ObjectPath
End If
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to get the path of the application: " & ObjectPath
WScript.Quit (Err.Number)
End If
IIsObject.AppEnable
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to Enable the application: " & ObjectPath
WScript.Quit (Err.Number)
End If
'debug
'WScript.Echo "Last Error: " & Err & " (" & Hex (Err) & "): " & Err.Description
WScript.Echo "Application Enabled."
End Function
'''''''''''''''''''''''''''''
' AppGetStatusCommand
'''''''''''''''''''''''''''''
Function AppGetStatusCommand()
On Error Resume Next
Dim IIsObject
Dim IIsObjectPath
Dim ObjectPath
Dim MachineName
Dim Status
AppGetStatusCommand = 0 ' Assume Success
If ArgCount <> 2 Then
WScript.Echo "Error: Wrong number of Args for the APPGETSTATUS command"
WScript.Quit (GENERAL_FAILURE)
End If
ObjectPath = Args(1)
SanitizePath ObjectPath
MachineName = SeparateMachineName(ObjectPath)
IIsObjectPath = "IIS://" & MachineName
If ObjectPath <> "" Then
IIsObjectPath = IIsObjectPath & "/" & ObjectPath
End If
Set IIsObject = GetObject(IIsObjectPath)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to get the path of the application: " & ObjectPath
WScript.Quit (Err.Number)
End If
Status = IIsObject.AppGetStatus2
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to retrieve the application STATUS: " & ObjectPath
WScript.Quit (Err.Number)
End If
WScript.Echo "Application Status: " & Status
End Function
''''''''''''''''''''''''''
'
' IsSecureProperty
'
' Checks to see if the property requires special processing in order to
' display its contents.
'
''''''''''''''''''''''''''
Function IsSecureProperty(ObjectParameter,MachineName)
On Error Resume Next
Dim PropObj,Attribute
Set PropObj = GetObject("IIS://" & MachineName & "/schema/" & ObjectParameter)
If (Err.Number <> 0) Then
ReportError ()
WScript.Echo "Error trying to get the property: " & err.number
WScript.Quit (Err.Number)
End If
Attribute = PropObj.Secure
If (Attribute = True) Then
IsSecureProperty = True
Else
IsSecureProperty = False
End If
End Function