'''''''''''''''''''''''''''''''''''''''''''''
'
'  FTP Virtual Directory Creation Utility  
'
'''''''''''''''''''''''''''''''''''''''''''''

'  Description:
'  ------------
'  This sample admin script allows you to create an FTP virtual directory.
'
'  To Run:  
'  -------
'  This is the format for this script:
'  
'      cscript mkftpdir.vbs <rootdir> [-n <instancenum>][-c <comment>][-p <portnum>][-X (don't start)]
'  
'  NOTE:  If you want to execute this script directly from Windows, use 
'  'wscript' instead of 'cscript'. 
'  
'  Call this script with "-?" for usage instructions
'
'''''''''''''''''''''''''''''''''''''''''''''
   

   ' Force explicit declaration of all variables.
   Option Explicit

   On Error Resume Next

   Dim oArgs, ArgNum

   Dim ArgComputer, ArgFtpSites, ArgVirtualDirs, ArgDirNames(), ArgDirPaths(), DirIndex
   Dim ArgComputers

   Set oArgs = WScript.Arguments
   ArgComputers = Array("LocalHost")

   ArgNum = 0
   While ArgNum < oArgs.Count

     If (ArgNum + 1) >= oArgs.Count Then
       Call DisplayUsage
     End If

     Select Case LCase(oArgs(ArgNum))
       Case "--computer", "-c":
         ArgNum = ArgNum + 1
         ArgComputers = Split(oArgs(ArgNum), ",", -1)
       Case "--ftpsite", "-f":
         ArgNum = ArgNum + 1
         ArgFtpSites = oArgs(ArgNum)
       Case "--virtualdir", "-v":
         ArgNum = ArgNum + 1
         ArgVirtualDirs = Split(oArgs(ArgNum), ",", -1)
       Case "--help", "-?"
         Call DisplayUsage
     End Select

     ArgNum = ArgNum + 1
   Wend

   ArgNum = 0
   DirIndex = 0

   ReDim ArgDirNames((UBound(ArgVirtualDirs) + 1) \ 2)
   ReDim ArgDirPaths((UBound(ArgVirtualDirs) + 1) \ 2)

   If IsArray(ArgVirtualDirs) Then
     While ArgNum <= UBound(ArgVirtualDirs)
       ArgDirNames(DirIndex) = ArgVirtualDirs(ArgNum)
       If (ArgNum + 1) > UBound(ArgVirtualDirs) Then
         WScript.Echo "Error understanding virtual directories"
         Call DisplayUsage
       End If
       ArgNum = ArgNum + 1
       ArgDirPaths(DirIndex) = ArgVirtualDirs(ArgNum)
       ArgNum = ArgNum + 1
       DirIndex = DirIndex + 1
     Wend
   End If

   If (ArgFtpSites = "") Or (IsArray(ArgDirNames) = False Or IsArray(ArgDirPaths) = False) Then
     Call DisplayUsage
   Else
     Dim compIndex
     For compIndex = 0 To UBound(ArgComputers)
       Call ASTCreateVirtualFtpDir(ArgComputers(compIndex), ArgFtpSites, ArgDirNames, ArgDirPaths)
     Next
   End If

   '------------------------------------------------------------

   Sub Display(Msg)
     WScript.Echo Now & ". Error Code: " & Hex(Err) & " - " & Msg
   End Sub

   Sub Trace(Msg)
     WScript.Echo Now & " : " & Msg
   End Sub

   Sub DisplayUsage()
     WScript.Echo "Usage: mkftpdir [--computer|-c COMPUTER1,COMPUTER2]"
     WScript.Echo "                <--ftpsite|-f FTPSITE1>"
     WScript.Echo "                <--virtualdir|-v NAME1,PATH1,NAME2,PATH2,...>"
     WScript.Echo "                [--help|-?]"

     WScript.Echo ""
     WScript.Echo "Note, FTPSITE is the Ftp Site on which the directory will be created."
     WScript.Echo "The name can be specified as one of the following, in the priority specified:"
     WScript.Echo " Server Number (i.e. 1, 2, 10, etc.)"
     WScript.Echo " Server Description (i.e ""My Server"")"
     WScript.Echo " Server Host name (i.e. ""ftp.domain.com"")"
     WScript.Echo " IP Address (i.e., 127.0.0.1)"
     WScript.Echo ""
     WScript.Echo ""
     WScript.Echo "Example : mkftpdir -c MyComputer -f ""Default Ftp Site"""
     WScript.Echo "           -v ""dir1"",""c:\inetpub\ftproot\dir1"",""dir2"",""c:\inetpub\ftproot\dir2"""

     WScript.Quit
   End Sub

   '------------------------------------------------------------

   Sub ASTCreateVirtualFtpDir(ComputerName, FtpSiteName, DirNames, DirPaths)
     Dim computer, ftpSite, FtpSiteID, vRoot, vDir, DirNum
     On Error Resume Next
     
     Set ftpSite = findFtp(ComputerName, FtpSiteName)
     If IsObject(ftpSite) Then
       Set vRoot = ftpSite.GetObject("IIsFtpVirtualDir", "Root")
       Trace "Accessing root for " & ftpSite.ADsPath
       If (Err <> 0) Then
         Display "Unable to access root for " & ftpSite.ADsPath
       Else
         DirNum = 0
         If (IsArray(DirNames) = True) And (IsArray(DirPaths) = True) And (UBound(DirNames) = UBound(DirPaths)) Then
           While DirNum < UBound(DirNames)
             'Create the new virtual directory
             Set vDir = vRoot.Create("IIsFtpVirtualDir", DirNames(DirNum))
             If (Err <> 0) Then
               Display "Unable to create " & vRoot.ADsPath & "/" & DirNames(DirNum) & "."
             Else
               'Set the new virtual directory path
               vDir.AccessRead = True
               vDir.Path = DirPaths(DirNum)
               If (Err <> 0) Then
                 Display "Unable to bind path " & DirPaths(DirNum) & " to " & vRootName & "/" & DirNames(DirNum) & ". Path may be invalid."
               Else
                 'Save the changes
                 vDir.SetInfo
                 If (Err <> 0) Then
                   Display "Unable to save configuration for " & vRootName & "/" & DirNames(DirNum) & "."
                 Else
                   Trace "Ftp virtual directory " & vRootName & "/" & DirNames(DirNum) & " created successfully."
                 End If
               End If
             End If
             Err = 0
             DirNum = DirNum + 1
           Wend
         End If
       End If
     Else
       Display "Unable to find " & FtpSiteName & " on " & ComputerName
     End If
     Trace "Done."
   End Sub

   Function getBinding(bindstr)

     Dim one, two, ia, ip, hn
     
     one = InStr(bindstr, ":")
     two = InStr((one + 1), bindstr, ":")
     
     ia = Mid(bindstr, 1, (one - 1))
     ip = Mid(bindstr, (one + 1), ((two - one) - 1))
     hn = Mid(bindstr, (two + 1))
     
     getBinding = Array(ia, ip, hn)
   End Function

   Function findFtp(computer, ftpname)
     On Error Resume Next

     Dim ftpsvc, site
     Dim ftpinfo
     Dim aBinding, binding

     Set ftpsvc = GetObject("IIS://" & computer & "/MsFtpSvc")
     If (Err <> 0) Then
       Exit Function
     End If
     ' First try to open the ftpname.
     Set site = ftpsvc.GetObject("IIsFtpServer", ftpname)
     If (Err = 0) And (Not IsNull(site)) Then
       If (site.Class = "IIsFtpServer") Then
         ' Here we found a site that is a ftp server.
         Set findFtp = site
         Exit Function
       End If
     End If
     Err.Clear
     For Each site In ftpsvc
       If site.Class = "IIsFtpServer" Then
         ' First, check to see if the ServerComment matches
         If site.ServerComment = ftpname Then
           Set findFtp = site
           Exit Function
         End If
         aBinding = site.ServerBindings
         If (IsArray(aBinding)) Then
           If aBinding(0) = "" Then
             binding = Null
           Else
             binding = getBinding(aBinding(0))
           End If
         Else
           If aBinding = "" Then
             binding = Null
           Else
             binding = getBinding(aBinding)
           End If
         End If
         If IsArray(binding) Then
           If (binding(2) = ftpname) Or (binding(0) = ftpname) Then
             Set findFtp = site
             Exit Function
           End If
         End If
       End If
     Next
   End Function