2603 lines
91 KiB
Plaintext
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
|