windows-nt/Source/XPSP1/NT/inetsrv/iis/img/scripts/iisschlp.wsc
2020-09-26 16:20:57 +08:00

1233 lines
39 KiB
XML

<?xml version="1.0"?>
<package>
<component id="IIS Script Helper">
<?component error="true" debug="true" ?>
<registration progid="Microsoft.IIsScriptHelper" classid="{BC47120F-1612-4CA5-A89F-FDFF76C28AB6}" description="IIS Script Helper" version="1.0">
</registration>
<public>
<property internalname="WScript" name="ScriptHost">
</property>
<property name="ProviderObj">
<get/>
</property>
<property name="Switches">
<get/>
</property>
<property internalname="aNamedArguments" name="NamedArguments">
<get/>
</property>
<property name="GlobalHelpRequested">
<get/>
</property>
<property name="FSObj">
<get/>
</property>
<property name="ERROR_UNKNOWN_SWITCH">
<get/>
</property>
<property name="ERROR_NOT_ENOUGH_ARGS">
<get/>
</property>
<method name="BuildNameSpace">
<parameter name="strPath"/>
</method>
<method name="CheckScriptEngine">
</method>
<method name="CreateFSDir">
<parameter name="strRoot"/>
</method>
<method name="DumpCmdLineOptions">
</method>
<method name="FindSite">
<parameter name="strType"/>
<parameter name="aArgs"/>
</method>
<method name="GetAbsolutePath">
<parameter name="strPath"/>
</method>
<method name="GetEnvironmentVar">
<parameter name="strVar"/>
</method>
<method name="GetSwitch">
<parameter name="strSwitchName"/>
</method>
<method name="InitAuthentication">
<parameter name="Server"/>
<parameter name="User"/>
<parameter name="Password"/>
</method>
<method name="IsHelpRequested">
<parameter name="strSwitch"/>
</method>
<method name="IsHelpSwitch">
<parameter name="strSwitch"/>
</method>
<method name="IsValidIPAddress">
<parameter name="strIPAddress"/>
</method>
<method name="IsValidPortNumber">
<parameter name="intPort"/>
</method>
<method name="NormalizeFilePath">
<parameter name="strPath"/>
</method>
<method name="ParseBindings">
<parameter name="bindings"/>
</method>
<method name="ParseCmdLineOptions">
<parameter name="ArgObj"/>
<parameter name="strCmdLine"/>
</method>
<method name="WMIConnect">
<parameter name="strServer"/>
<parameter name="strUser"/>
<parameter name="strPassword"/>
</method>
</public>
<object id="FSObj" progid="Scripting.FileSystemObject" events="false"/>
<object id="ShellObj" progid="WScript.Shell" events="false"/>
<object id="NetObj" progid="WScript.Network" events="false"/>
<object id="DictObj" progid="Scripting.Dictionary" events="false"/>
<resource id="ProductInfoRegValue">ProductSuite</resource>
<resource id="ProductInfoRegKey">System\CurrentControlSet\Control\ProductOptions</resource>
<resource id="L_RegProc_ErrorMessage">Error querying the WMI Registry provider.</resource>
<resource id="L_OnlyIIS6Supported_ErrorMessage">The IIS Admin scripts only support IIS 6.0.</resource>
<resource id="L_CredentialsIgnored_Message">Using local machine will cause supplied credentials to be ignored.</resource>
<resource id="L_Warning_Text">WARNING</resource>
<resource id="L_WriteReg_ErrorMessage">Error trying to write the registry settings!</resource>
<resource id="L_MetabasePath_Message">Metabase Path</resource>
<resource id="L_SiteName_Text">Site Name</resource>
<resource id="L_NotUnique2_Message">identify these sites:</resource>
<resource id="L_NotUnique1_Message">The following site names are not unique. Please use the Metabase Paths to</resource>
<resource id="L_Done_Message">Done.</resource>
<resource id="L_ConnectObject_ErrorMessage">Error trying to get WMI SWbemService object</resource>
<resource id="L_Error_ErrorMessage">Error</resource>
<resource id="L_Locator_ErrorMessage">Error trying to get WMI SWbemLocator object</resource>
<resource id="L_Connecting_Message">Connecting to server ... </resource>
<resource id="L_OkWriteReg_Message">Successfully registered CScript</resource>
<resource id="L_UseCScript_Message">To run this script type: "CScript.Exe IIsCnfg.vbs [params]"</resource>
<resource id="CIMv2_NAMESPACE">root/CIMv2</resource>
<resource id="WMI_NAMESPACE">root/MicrosoftIISv2</resource>
<resource id="LOCATOR_OBJ">WbemScripting.SWbemLocator</resource>
<resource id="WBemImpersonationLevelImpersonate">3</resource>
<resource id="WQL">WQL</resource>
<resource id="L_RegisterCScript_Message">Register CScript</resource>
<resource id="L_AskChangeScriptProcessor_Message">Would you like to register CScript as your default host for VBscript?</resource>
<resource id="L_WrongScriptProcessor_Message">This script does not work with WScript.</resource>
<resource id="CONST_NO_MATCHES_FOUND">0</resource>
<resource id="PATTERN_VBPRINTF">%\d</resource>
<script id="IIs Script Helper" language="VBScript">
<![CDATA[
'
' Copyright (c) Microsoft Corporation. All rights reserved.
'
' VBScript Source File
'
' Script Component Name: IIsScHlp.wsc
'
Option Explicit
On Error Resume Next
Dim LocatorObj, ProviderObj
Dim dictSwitches, dictHelpRequested
Dim aNamedArguments
Dim fGlobalHelpRequested
Dim strServer, strUser, strPassword
' Parser errors
Const ERROR_NOT_ENOUGH_ARGS = 1
Const ERROR_UNKNOWN_SWITCH = 2
' Object initialization
fGlobalHelpRequested = False
Set LocatorObj = Nothing
Set ProviderObj = Nothing
Set dictSwitches = Nothing
Set dictHelpRequested = Nothing
aNamedArguments = Array()
' Property get methods
Function get_ProviderObj()
Set get_ProviderObj = ProviderObj
End Function
Function get_Switches()
Set get_Switches = dictSwitches
End Function
Function get_aNamedArguments()
get_aNamedArguments = aNamedArguments
End Function
Function get_GlobalHelpRequested()
get_GlobalHelpRequested = fGlobalHelpRequested
End Function
Function get_FSObj()
Set get_FSObj = FSObj
End Function
Function get_ERROR_UNKNOWN_SWITCH()
get_ERROR_UNKNOWN_SWITCH = ERROR_UNKOWN_SWITCH
End Function
Function get_ERROR_NOT_ENOUGH_ARGS()
get_ERROR_NOT_ENOUGH_ARGS = ERROR_NOT_ENOUGH_ARGS
End Function
'''''''''''''''''''''''''''''''''
' Class Definitions
''''''''''''''''''''''
Class OptionItem
Public Name
Public ShortName
Public RequiredArgs
Public GroupID
Public fSearchChildren
Public aChildOptions
Public Sub SetInfo(strName, strShortName, strReqArg, intGroupID)
If Left(strName, 1) = "[" Then
Name = Mid(strName, 2)
Else
Name = CStr(strName)
End If
ShortName = CStr(strShortName)
If Right(strReqArg, 1) = "]" Then
RequiredArgs = Mid(strReqArg, 1, Len(strReqArg) - 1)
Else
RequiredArgs = CStr(strReqArg)
End If
GroupID = CInt(intGroupID)
fSearchChildren = False
aChildOptions = Empty
End Sub
Public Sub AddChild(element)
If IsEmpty(aChildOptions) Then
aChildOptions = Array(element)
Else
ReDim Preserve aChildOptions(Ubound(aChildOptions) + 1)
Set aChildOptions(Ubound(aChildOptions)) = element
End If
End Sub
Public Sub Visit()
' This options was recognized. If it has child options, make them available
If Not IsEmpty(aChildOptions) Then
fSearchChildren = True
End If
End Sub
End Class
Class Options
Private intOptionIndex
Public aOptions
Public Sub SetOptions(strCmdLineKeys)
Dim aCmdLineOptions, aOption
Dim intCount, i
aCmdLineOptions = Split(strCmdLineKeys, ";")
ReDim aOptions(UBound(aCmdLineOptions))
intOptionIndex = LBound(aCmdLineOptions)
InsertOptionsInArray aOptions, aCmdLineOptions, Empty
End Sub
Public Function GetInfo(strName)
Set GetInfo = Lookup(aOptions, strName)
End Function
'
' Private functions/subrotines
'
Private Function Lookup(aArray, strName)
Dim oOption
Dim oResult
Dim i
Set oResult = Nothing
For i = LBound(aArray) to UBound(aArray)
Set oOption = aArray(i)
If UCase(oOption.Name) = UCase(strName) Or UCase(oOption.ShortName) = UCase(strName) Then
Set oResult = oOption
Exit For
End If
If oOption.fSearchChildren Then
Set oResult = Lookup(oOption.aChildOptions, strName)
If Not oResult Is Nothing Then
Exit For
End If
End If
Next
Set Lookup = oResult
End Function
' InsertOptionsInArray(
' array to receive the options,
' options array to be parser,
' start index of the options array above,
' current scope (-1 to root)
')
Private Sub InsertOptionsInArray(aArray, aCmdLineOptions, intScope)
Dim intCount, i
Dim aOption, oOption
intCount = 0
Do While intOptionIndex <= UBound(aCmdLineOptions)
aOption = Split(aCmdLineOptions(intOptionIndex), ":")
Set oOption = New OptionItem
oOption.SetInfo aOption(0), aOption(1), aOption(2), intScope
' First, do we see a start of a block ('[')?
If Left(aOption(0), 1) = "[" Then
intOptionIndex = intOptionIndex + 1
InsertOptionsInArray oOption, aCmdLineOptions, intScope + 1
End If
If IsArray(aArray) Then
Set aArray(intCount) = oOption
Else
' aArray is actually an object
aArray.AddChild oOption
End If
' Now, do we see an end of a block (']')?
If Right(aOption(UBound(aOption)), 1) = "]" Then
Exit Sub
End If
intCount = intCount + 1
intOptionIndex = intOptionIndex + 1
Loop
ReDim Preserve aArray(intCount - 1)
End Sub
End Class
Class ParserError
Public SwitchName
Public ErrorCode
End Class
''''''''''''''''''''''''''''''''''''
' Methods
'''''''''''''''''''''''''
' Initialization
Function InitAuthentication(Server, User, Password)
Dim DefaultNamespaceObj, RegistryObj
Dim IISNameSpaceObj, ComputerObj
Dim iMajorVersion, iResult
Dim aResult
On Error Resume Next
iResult = 0
strServer = Server
strUser = User
strPassword = Password
If Server = "." Or UCase(Server) = UCase(GetEnvironmentVar("%COMPUTERNAME%")) Then
If User <> "" Or Password <> "" Then
WScript.Echo getResource("L_Warning_Text") & ": " & getResource("L_CredentialsIgnored_Message")
strUser = ""
strPassword = ""
End If
End If
' Initializes the WMI Locator object
Set LocatorObj = CreateObject(getResource("LOCATOR_OBJ"))
If Err.Number Then
WScript.Echo getResource("L_Locator_ErrorMessage")
WScript.Echo getResource("L_Error_ErrorMessage") & " &H" & Hex(Err.Number) & ": " & Err.Description
InitAuthentication = Err.Number
Exit Function
End If
LocatorObj.Security_.ImpersonationLevel = getResource("WBemImpersonationLevelImpersonate")
' Check if target machine has IIS6 installed (server and above)
Set IISNameSpaceObj = LocatorObj.ConnectServer(strServer, getResource("WMI_NAMESPACE"), strUser, strPassword)
If Err.Number Then
' Error connecting to the IIS namespace. If NOT_FOUND, this is probably not a Win2002 box
If Err.Number = &H8004100E Then ' INVALID_NAMESPACE
WScript.Echo getResource("L_OnlyIIS6Supported_ErrorMessage")
Else
WScript.Echo getResource("L_ConnectObject_ErrorMessage")
WScript.Echo getResource("L_Error_ErrorMessage") & " &H" & Hex(Err.Number) & ": " & Err.Description
End If
InitAuthentication = Err.Number
Exit Function
End If
Set ComputerObj = IISNameSpaceObj.get("IIsWebInfo='W3SVC/Info'")
If Err.Number Then
WScript.Echo getResource("L_OnlyIIS6Supported_ErrorMessage")
InitAuthentication = Err.Number
Exit Function
End If
iMajorVersion = ComputerObj.MD_SERVER_VERSION_MAJOR
If Err.Number Or iMajorVersion <> 6 Then
WScript.Echo getResource("L_OnlyIIS6Supported_ErrorMessage")
InitAuthentication = 1
Exit Function
End If
' Set DefaultNamespaceObj = LocatorObj.ConnectServer(strServer, "root\default", strUser, strPassword)
' If Err.Number Then
' WScript.Echo getResource("L_ConnectObject_ErrorMessage")
' WScript.Echo getResource("L_Error_ErrorMessage") & " &H" & Hex(Err.Number) & ": " & Err.Description
' InitAuthentication = Err.Number
' Exit Function
' End If
'
' Set RegistryObj = DefaultNamespaceObj.get("StdRegProv")
' iResult = RegistryObj.GetMultiStringValue(, getResource("ProductInfoRegKey"), _
' getResource("ProductInfoRegValue"), _
' aResult)
' If iResult <> 0 Or Err Then
' WScript.Echo getResource("L_RegProc_ErrorMessage")
' If iResult Then
' InitAuthentication = iResult
' Else
' InitAuthentication = Err.Number
' End If
' Exit Function
' Else
' If UBound(aResult) < 0 Then
' ' Target machine is PRO
' WScript.Echo getResource("L_OnlyIIS6Supported_ErrorMessage")
' InitAuthentication = &H80070032
' Exit Function
' ElseIf aResult(0) = "Personal" Then
' ' Target machine is PER
' WScript.Echo getResource("L_OnlyIIS6Supported_ErrorMessage")
' InitAuthentication = &H80070032
' Exit Function
' Else
' ' Target machine is SRV or above
' End If
' End If
' If we get here, everything went fine.
InitAuthentication = 0
End Function
''''''''''''''''''''''''''''''
' ParseCmdLineOptions
''''''''''''''''''''''''''
Function ParseCmdLineOptions(strCmdLine)
Dim oOptions, oOption, oError
Dim strItem, strValue
Dim intCount, intIndex, i
Dim ArgObj
Dim aValues
Set ArgObj = WScript.Arguments
If ArgObj.Count = 0 Then Exit Function
Set dictSwitches = CreateObject("Scripting.Dictionary")
Set dictHelpRequested = CreateObject("Scripting.Dictionary")
ReDim aNamedArguments(ArgObj.Count - 1)
Set oOptions = New Options
oOptions.SetOptions strCmdLine
' intCount has the number of named arguments in the command line
intCount = 0
' Parse command line options
For intIndex = 0 to ArgObj.Count - 1
strItem = ArgObj.Item(intIndex)
' Is this a help switch?
If IsHelpSwitch(strItem) Then
fGlobalHelpRequested = True
Exit For
End If
' Is this item a switch?
If (Left(strItem, 1) = "/" Or Left(strItem, 1) = "-") And Len(strItem) > 1 Then
' Check for required argument
strItem = Mid(strItem, 2)
' Do we have a switch with syntax '-switch:value'?
If InStr(strItem, ":") <> 0 Then
Dim aSwitch
aSwitch = Split(strItem, ":")
strItem = aSwitch(0)
strValue = aSwitch(1)
Else
strValue = Null
End If
Set oOption = oOptions.GetInfo(strItem)
If Not oOption Is Nothing And fGlobalHelpRequested = False Then
' Check if we already processed this switch before
If dictSwitches.Exists(oOption.Name) Then
dictSwitches.Remove(oOption.Name)
End If
' Option exists. Mark as visited
oOption.Visit
' Check for argument requirement
If IsNumeric(oOption.RequiredArgs) Then
' Is there an argument in the -switch:value,value,... format?
If oOption.RequiredArgs = 0 Then
' First, look for help switch
If intIndex + 1 < ArgObj.Count Then
If IsHelpSwitch(ArgObj(intIndex + 1)) Then
intIndex = intIndex + 1
dictHelpRequested.Add oOption.Name, True
End If
End If
' Option does not require an argument
dictSwitches.Add oOption.Name, ""
Else
If Not IsNull(strValue) Then
' Check how many arguments we get
aValues = Split(strValue, ",")
If CInt(oOption.RequiredArgs) <> (UBound(aValues) + 1) Then
Set oError = New ParserError
oError.SwitchName = oOption.Name
oError.ErrorCode = ERROR_NOT_ENOUGH_ARGS
Set ParseCmdLineOptions = oError
Exit Function
' WScript.Echo "ERROR: Switch /" & oOption.Name & " expects " & _
' oOption.RequiredArgs & " arguments. Got only " & UBound(aValues)
' WScript.Quit(0)
End If
If InStr(strValue, ",") <> 0 Then
dictSwitches.Add oOption.Name, aValues
Else
dictSwitches.Add oOption.Name, strValue
End If
Else
' We don't have '-switch:value1,value2,...'.
' Loop to get all RequiredArgs arguments asked for
If oOption.RequiredArgs > 1 Then
ReDim aValues(oOption.RequiredArgs - 1)
For i = 0 to oOption.RequiredArgs - 1
If intIndex + 1 < ArgObj.Count Then
' Get it. Add option to dictionary
intIndex = intIndex + 1
aValues(i) = ArgObj(intIndex)
' Is this option a help switch?
If IsHelpSwitch(ArgObj(intIndex)) Then
dictHelpRequested.Add oOption.Name, True
ReDim Preserve aValues(UBound(aValues) - i -1)
Exit For
End If
Else
Set oError = New ParserError
oError.SwitchName = oOption.Name
oError.ErrorCode = ERROR_NOT_ENOUGH_ARGS
Set ParseCmdLineOptions = oError
Exit Function
' Wscript.Echo "ERROR: Switch /" & oOption.Name & " requires " & _
' oOption.RequiredArgs & " argument(s)"
' WScript.Quit(-1)
End If
Next
dictSwitches.Add oOption.Name, aValues
Else
' Just one argument (most common scenario)
If intIndex + 1 < ArgObj.Count Then
' Get it. Add option to dictionary
intIndex = intIndex + 1
If IsHelpSwitch(ArgObj(intIndex)) Then
dictHelpRequested.Add oOption.Name, True
End If
dictSwitches.Add oOption.Name, ArgObj(intIndex)
Else
Set oError = New ParserError
oError.SwitchName = oOption.Name
oError.ErrorCode = ERROR_NOT_ENOUGH_ARGS
Set ParseCmdLineOptions = oError
Exit Function
' Wscript.Echo "ERROR: Switch /" & oOption.Name & " requires " & _
' oOption.RequiredArgs & " argument(s)"
' WScript.Quit(-1)
End If
End If
End If
End If
Else
' RequiredArgs not numeric
' We should read parameters until we find another switch
If Not IsNull(strValue) Then
' Check how many arguments we get
If InStr(strValue, ",") <> 0 Then
aValues = Split(strValue, ",")
dictSwitches.Add oOption.Name, aValues
Else
If IsHelpSwitch(strValue) Then
dictHelpRequested.Add oOption.Name, True
Else
dictSwitches.Add oOption.Name, strValue
End If
End If
Else
' We don't have '-switch:value1,value2,...'.
' Loop to get all RequiredArgs until the end of the command line arguments
' or until we find another switch
i = 0
intIndex = intIndex + 1
ReDim aValues(ArgObj.Count - intIndex - 1)
Do While intIndex < ArgObj.Count
If IsHelpSwitch(ArgObj(intIndex)) Then
dictHelpRequested.Add oOption.Name, True
Else
' Exit if we find another switch
If Left(ArgObj(intIndex), 1) = "/" Or Left(ArgObj(intIndex), 1) = "-" Then
intIndex = intIndex - 1
Exit Do
Else
aValues(i) = ArgObj(intIndex)
End If
End If
intIndex = intIndex + 1
i = i + 1
Loop
ReDim Preserve aValues(i - 1)
dictSwitches.Add oOption.Name, aValues
End If
End If
Else
' Item not present in the list of options
Set oError = New ParserError
oError.SwitchName = strItem
oError.ErrorCode = ERROR_UNKNOWN_SWITCH
Set ParseCmdLineOptions = oError
Exit Function
' WScript.Echo "ERROR: Unknown switch: /" & strItem
' WScript.Quit(-1)
End If
Else
' This is not a switch (named argument)
' Add argument to the array of named arguments
aNamedArguments(intCount) = strItem
intCount = intCount + 1
End If
Next
ReDim Preserve aNamedArguments(intCount - 1)
' Release Options object
Set oOptions = Nothing
Set ParseCmdLineOptions = Nothing
End Function
''''''''''''''''''''''''''''''''''''''''''''''
' GetSwitch(switchName)
' Return the value associated with a switch
' passed in the command line
'''''''''''''''''''''''''''''''''''''''''''''
Function GetSwitch(strSwitchName)
If IsObject(dictSwitches(strSwitchName)) Then
Set GetSwitch = dictSwitches(strSwitchName)
Else
GetSwitch = dictSwitches(strSwitchName)
End If
End Function
''''''''''''''''''''''''''''''''''''''''''''''
' IsHelpRequested(switchName)
' Return if the help switch was activated for
' a certain switch
'''''''''''''''''''''''''''''''''''''''''''''
Function IsHelpRequested(strSwitch)
Dim fHelpRequested
Dim fResult
fResult = False
If dictHelpRequested.Exists(strSwitch) Then
fResult = dictHelpRequested(strSwitch)
End If
IsHelpRequested = fResult
End Function
'''''''''''''''''''''''''''''''
' DumpCmdLineOptions()
' Show all command line options
' Used for debugging
''''''''''''''''''''''''''''''
Sub DumpCmdLineOptions()
Dim k
Dim value
If IsNull(dictSwitches) Or dictSwitches Is Nothing Then Exit Sub
WScript.Echo "Switches:"
For Each k in dictSwitches.Keys
If IsArray(dictSwitches(k)) Then
value = Join(dictSwitches(k), " and ")
Else
value = dictSwitches(k)
End If
If IsHelpRequested(k) Then
WScript.Echo k & " = " & value & " (HELP switch set)"
Else
WScript.Echo k & " = " & value
End If
Next
WScript.Echo
WScript.Echo "Named arguments:"
For k = LBound(aNamedArguments) to UBound(aNamedArguments)
WScript.Echo k & ". " & aNamedArguments(k)
Next
End Sub
'''''''''''''''''''''''''''
' CheckScriptEngine
'
' This can detect the type of exe the
' script is running under and warns the
' user of the popups.
'''''''''''''''''''''''''''
Sub CheckScriptEngine()
Dim ScriptHost
Dim CurrentPathExt
Dim EnvObject
Dim RegCScript
Dim RegPopupType ' This is used to set the pop-up box flags.
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 getResource("L_WrongScriptProcessor_Message")
' Create a pop-up box and ask if they want to register cscript as the default host.
' -1 is the time to wait. 0 means wait forever.
RegCScript = ShellObj.PopUp(getResource("L_AskChangeScriptProcessor_Message"), 0, _
getResource("L_RegisterCScript_Message"), RegPopupType)
If (Err.Number <> 0) Then
WScript.Echo getResource("L_UseCScript_Message")
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
ShellObj.RegWrite "HKEY_CLASSES_ROOT\VBSFile\Shell\Open\Command\", "%WINDIR%\System32\CScript.exe //nologo ""%1"" %*", "REG_EXPAND_SZ"
ShellObj.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 = ShellObj.RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\PATHEXT")
If Err.Number = &H80070002 Then
Err.Clear
Set EnvObject = ShellObj.Environment("PROCESS")
CurrentPathExt = EnvObject.Item("PATHEXT")
End If
ShellObj.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\PATHEXT", CurrentPathExt & ";.VBS", "REG_SZ"
If (Err.Number <> 0) Then
WScript.Echo getResource("L_WriteReg_ErrorMessage")
WScript.Quit (Err.Number)
Else
WScript.Echo getResource("L_OkWriteReg_Message")
End If
Else
WScript.Echo getResource("L_UseCScript_Message")
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 = ShellObj.Run(ProcString, 0, True)
WScript.Quit (Result)
End If
End Sub
''''''''''''''''''''''''''''''''''''''''
' FindSite
'
' Return a web/ftp site paths given
' site names or site comments
''''''''''''''''''''''''''''''''''''''
Function FindSite(strType, aArgs)
Dim Server, Servers
Dim strQuery, strSvcName, line
Dim aSites, aResult, aComments
Dim bFoundDuplicate, bCheckForDuplicates
Dim i, j, iCount
On Error Resume Next
bCheckForDuplicates = False
If UCase(strType) = "WEB" Then
strQuery = "select Name, ServerComment from IIsWebServerSetting where "
strSvcName = "W3SVC"
Else
strQuery = "select Name, ServerComment from IIsFtpServerSetting where "
strSvcName = "MSFTPSVC"
End If
For i = LBound(aArgs) to UBound(aArgs)
strQuery = strQuery & "(Name=""" & aArgs(i) & """ or ServerComment=""" & aArgs(i) & """)"
If (i <> UBound(aArgs)) Then
strQuery = strQuery & " or "
End If
' Verify if we need to check for duplicate (occurs only when the user supply a site
' name instead of metabase path)
' Is this a site name?
If (InStr(UCase(aArgs(i)), strSvcName) = 0) Then
bCheckForDuplicates = True
End If
Next
' Semi-sync query. (flags = ForwardOnly Or ReturnImediately = &H30)
Set Servers = ProviderObj.ExecQuery(strQuery, , &H30)
If (Err.Number <> 0) Then
WScript.Echo L_Query_ErrorMessage
WScript.Echo getResource("L_Error_ErrorMessage") & " &H" & Hex(Err.Number) & ": " & Err.Description
WScript.Quit(Err.Number)
End If
ReDim aResult(0)
ReDim aComments(0)
bFoundDuplicate = False
i = 0
For Each Server in Servers
If Err Then
Exit For
End If
' Check for duplicates
If bCheckForDuplicates Then
For j = 0 to i - 1
If (UCase(Server.ServerComment) = UCase(aComments(j))) Then
If Not bFoundDuplicate Then
WScript.Echo getResource("L_NotUnique1_Message")
WScript.Echo getResource("L_NotUnique2_Message")
WScript.Echo
WScript.Echo getResource("L_SiteName_Text") & Space(20) & getResource("L_MetabasePath_Message")
WScript.Echo "================================================================="
WScript.Echo Server.ServerComment & Space(29 - Len(Server.ServerComment)) & aResult(j)
bFoundDuplicate = True
End If
WScript.Echo Server.ServerComment & Space(29 - Len(Server.ServerComment)) & Server.Name
Exit For
End If
Next
End If
aComments(i) = Server.ServerComment
aResult(i) = Server.Name
i = i + 1
ReDim Preserve aComments(i)
ReDim Preserve aResult(i)
Next
ReDim Preserve aComments(i - 1)
ReDim Preserve aResult(i - 1)
If bFoundDuplicate Then
FindSite = ""
Else
FindSite = aResult
End If
End Function
'''''''''''''''''''''''''''
' IsHelpSwitch
''''''''''''''''''''
Function IsHelpSwitch(strSwitch)
Dim fResult
fResult = False
If Left(strSwitch, 1) = "/" or Left(strSwitch, 1) = "-" Then
Select Case UCase(Right(strSwitch, Len(strSwitch) - 1))
Case "?"
fResult = True
Case "H"
fResult = True
Case "HELP"
fResult = True
Case Else
fResult = False
End Select
End If
IsHelpSwitch = fResult
End Function
'''''''''''''''''''''''''''
' CreateFSDir
'
''''''''''''''''''''''''''
Function CreateFSDir(strRoot)
Dim FolderObj
Dim intResult, iIndex
Dim strRemotePath, strFSPath
Dim strDrive, strDrvLetter
'On Error Resume Next
intResult = 0
If Mid(strRoot, 2, 2) <> ":\" Then
' Invalid Path - using Win32Error ERROR_INVALID_ACCESS
Err.Raise &H8007000C
Exit Function
End If
If strServer <> "." Then
' Server is remote. Find out first drive letter is available for mapping
strDrive = "NO DRIVE"
For strDrvLetter = Asc("C") to Asc("Z")
If Not FSObj.DriveExists(Chr(strDrvLetter)) Then
strDrive = Chr(strDrvLetter)
Exit For
End If
Next
If strDrive = "NO DRIVE" Then
' No drive letter available
' &H8007000F is Win32 error ERROR_INVALID_DRIVE
Err.Raise &H8007000F
Exit Function
End If
' Look for drive specification
strRemotePath = "\\" & strServer & "\" & Mid(strRoot, 1, 1) & "$"
' Map network drive
strDrive = strDrive & ":"
NetObj.MapNetworkDrive strDrive, strRemotePath, False, strUser, strPassword
strFSPath = strDrive & Mid(strRoot, 3)
Else
strFSPath = strRoot
End If
If Not FSObj.FolderExists(strFSPath) Then
'WScript.Echo L_CreatingRootDir_Message
' Have to create path, piece by piece
Dim aPathParts, strPathPart
aPathParts = Split(strFSPath, "\", -1)
strPathPart = aPathParts(0)
iIndex = 1
Do While iIndex <= UBound(aPathParts)
strPathPart = strPathPart & "\" & aPathParts(iIndex)
If Not FSObj.FolderExists(strPathPart) Then
Set FolderObj = FSObj.CreateFolder(strPathPart)
End If
iIndex = iIndex + 1
Loop
End If
If strServer <> "." Then
NetObj.RemoveNetworkDrive strDrive, True
End If
CreateFSDir = intResult
End Function
'''''''''''''''''''''''''''
' ParseBindings
'
' Try to get IP address, port number
' and host name from the
' ServerBindings property
'''''''''''''''''''''''''''
Function ParseBindings(bindings)
Dim firstColon, secondColon
Dim strIP, strPort, strHost
firstColon = Instr(bindings, ":")
secondColon = Instr(firstColon + 1, bindings, ":")
strIP = Mid(bindings, 1, firstColon - 1)
strPort = Mid(bindings, firstColon + 1, secondColon - firstColon - 1)
strHost = Mid(bindings, secondColon + 1)
ParseBindings = Array(strIP, strPort, strHost)
End Function
''''''''''''''''''''''''''''''
' WMIConnect()
'''''''''''''''''''''
Function WMIConnect()
'On Error Resume Next
If Not IsObject(LocatorObj) Then
Exit Function
End If
WScript.StdOut.Write getResource("L_Connecting_Message")
Set ProviderObj = LocatorObj.ConnectServer(strServer, getResource("WMI_NAMESPACE"), strUser, strPassword)
' If (Err.Number <> 0) Then
' 'WScript.Echo getResource("L_ConnectObject_ErrorMessage")
' 'WScript.Echo getResource("L_Error_ErrorMessage") & " &H" & Hex(Err.Number) & ": " & Err.Description
' WMIConnect = Err.Number
' 'WScript.Quit(Err.Number)
' Else
' WMIConnect = 0
' End If
WScript.StdOut.WriteLine getResource("L_Done_Message")
End Function
'''''''''''''''''''''''''
' ValidateIPAddress
' Returns TRUE if IP Address is associated with one of the network adapters
'''''''''''''''''''
Function IsValidIPAddress(strIPAddress)
Dim CIMv2ProviderObj, IPConfig, IPConfigSet
Dim strQuery, iCounter
Dim regExpObj, Matches, Match
Dim bResult
On Error Resume Next
bResult = False
' First test the IP address against a mask
Set regExpObj = New RegExp
regExpObj.Pattern = "(\d+)\.(\d+)\.(\d+)\.(\d+)"
regExpObj.Global = True
Set Matches = regExpObj.Execute(strIPAddress)
If Matches.Count <> 1 Then
IsValidIPAddress = bResult
Exit Function
End If
For Each Match in Matches(0).SubMatches
If Match < 0 Or Match > 255 Then
IsValidIPAddress = bResult
Exit Function
End If
Next
' Check if IP address belongs to the target machine
If Not IsObject(LocatorObj) Then
IsValidIPAddress = bResult
Exit Function
End If
Set CIMv2ProviderObj = LocatorObj.ConnectServer(strServer, "root/CIMv2", strUser, strPassword)
If Err.Number Then
WScript.Echo getResource("L_ConnectObject_ErrorMessage")
WScript.Echo getResource("L_Error_ErrorMessage") & " &H" & Hex(Err.Number) & ": " & Err.Description
'WScript.Quit(Err.Number)
End If
strQuery = "SELECT IPAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = TRUE"
' Semi-sync query. (flags = ForwardOnly Or ReturnImediately = &H30)
Set IPConfigSet = CIMv2ProviderObj.ExecQuery(strQuery, , &H30)
For Each IPConfig in IPConfigSet
If Not IsNull(IPConfig.IPAddress) Then
iCounter = LBound(IPConfig.IPAddress)
Do While iCounter <= UBound(IPConfig.IPAddress)
If IPConfig.IPAddress(iCounter) = strIPAddress Then
bResult = True
Exit For
End If
iCounter = iCounter + 1
Loop
End If
Next
IsValidIPAddress = bResult
End Function
Function IsValidPortNumber(intPort)
Dim bResult
bResult = False
If IsNumeric(intPort) And intPort > 0 And intPort < 65535 Then
bResult = True
End If
IsValidPortNumber = bResult
End Function
Function GetEnvironmentVar(strVar)
GetEnvironmentVar = ShellObj.ExpandEnvironmentStrings(strVar)
End Function
Sub BuildNameSpace(strPath)
Dim aPath
Dim strNewPath, strFSPath, strVDirPath
Dim strQuery
Dim VDirObj, Dir, NewWebDir
Dim iStart, i, iErrNumber
' Skip the *SVC/n/ROOT part
iStart = InStr(InStr(strPath, "ROOT"), strPath, "/")
' If strPath is equal to *SVC/n/ROOT, there's nothing left to do.
If iStart = 0 Or iStart = Len(strPath) Then
Exit Sub
End If
' strPath now start from the first node after ROOT in the metabase path
strNewPath = Mid(strPath, iStart + 1)
strVDirPath = Mid(strPath, 1, iStart - 1)
' Grab root directory for *SVC/n/ROOT
Set VDirObj = ProviderObj.Get("IIsWebVirtualDirSetting='" & strVDirPath & "'")
strFSPath = VDirObj.Path
Set VDirObj = Nothing
aPath = Split(strNewPath, "/", -1)
For i = LBound(aPath) to UBound(aPath)
strFSPath = strFSPath & "\" & aPath(i)
Next
' First, make sure the file system path exists
If Not FSObj.FolderExists(strFSPath) Then
' FS Path not found
Err.Raise &H80070003 ' The system cannot find the path specified
Exit Sub
End If
' FS Path exists. Now let's build the web directories for each path component
If strServer = "." Then
strVDirPath = "IIS://" & GetEnvironmentVar("%COMPUTERNAME%") & "/" & strVDirPath
Else
strVDirPath = "IIS://" & strServer & "/" & strVDirPath
End If
On Error Resume Next
' Search for the first path component that doesn't exist.
For i = LBound(aPath) to UBound(aPath)
' For each path component, check if the component exists in the metabase
Set Dirs = GetObject(strVDirPath & "/" & aPath(i))
If Err = &H80070003 Then
Err.Clear
Exit For
End If
strVDirPath = strVDirPath & "/" & aPath(i)
Next
On Error Goto 0
' Create all path components that doesn't exist
For i = i to UBound(aPath)
Set Dir = GetObject(strVDirPath)
Set NewWebDir = Dir.Create("IIsWebDirectory", aPath(i))
If Err Then
iErrNumber = Err.Number
On Error Goto 0
Err.Raise iErrNumber
End If
NewWebDir.SetInfo
If Err Then
iErrNumber = Err.Number
On Error Goto 0
Err.Raise iErrNumber
End If
strVDirPath = strVDirPath & "/" & aPath(i)
Next
End Sub
Function GetAbsolutePath(strPath)
GetAbsolutePath = FSObj.GetAbsolutePathName(strPath)
End Function
Function NormalizeFilePath(strPath)
Dim strPathName
strPathName = GetAbsolutePath(strPath)
If FSObj.FolderExists(strPathName) Then
' Should not be a folder path
Err.Raise &H80070002 ' Could not find FILE specified
End If
' Parent folder should exist
If Not FSObj.FolderExists(FSObj.GetParentFolderName(strPathName)) Then
Err.Raise &H80070003 ' Could not find PATH specified
End If
NormalizeFilePath = strPathName
End Function
]]>
</script>
</component>
</package>