KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q247364: IIS Sample ADSI Script to Create FTP Virtual Servers

Article: Q247364
Product(s): Internet Information Server
Version(s): winnt:5.0
Operating System(s): 
Keyword(s): 
Last Modified: 13-MAY-2002

-------------------------------------------------------------------------------
The information in this article applies to:

- Microsoft Internet Information Services version 5.0 
-------------------------------------------------------------------------------

SUMMARY
=======

Microsoft Internet Information Services (IIS) version 5.0 includes several
sample Windows Scripting Host (WSH) administration scripts in the
%SystemDrive%\InetPub\AdminScripts folder. These sample scripts perform various
administrative functions. The purpose of this article is to define a sample
script to complement the existing set of scripts that create FTP virtual
servers.

MORE INFORMATION
================

Microsoft provides programming examples for illustration only, without warranty
either expressed or implied, including, but not limited to, the implied
warranties of merchantability and/or fitness for a particular purpose. This
article assumes that you are familiar with the programming language being
demonstrated and the tools used to create and debug procedures. Microsoft
support professionals can help explain the functionality of a particular
procedure, but they will not modify these examples to provide added
functionality or construct procedures to meet your specific needs. If you have
limited programming experience, you may want to contact a Microsoft Certified
Partner or the Microsoft fee-based consulting line at (800) 936-5200. For more
information about Microsoft Certified Partners, please visit the following
Microsoft Web site:

  http://www.microsoft.com/partner/referral/

For more information about the support options that are available and about how
to contact Microsoft, visit the following Microsoft Web site:

  http://support.microsoft.com/default.aspx?scid=fh;EN-US;CNTACTMS

WSH Sample ADSI Script:

1. Save the following code as Mkftpsite.vbs in your
  %SystemDrive%\InetPub\AdminScripts folder:

  '------------------------------------------------------------
  '
  ' This is a simple script to create a new virtual FTP server.
  '
  ' Call this script with "-?" for usage instructions
  '
  '------------------------------------------------------------

  ' Force explicit declaration of all variables
  Option Explicit

  On Error Resume Next

  Dim bArgStart
  Dim bVerbose
  Dim iArgPort
  Dim iArgSiteNumber
  Dim iArgNum
  Dim oArgs
  Dim szArgComputers
  Dim szArgIPAddress
  Dim szArgRootDirectory
  Dim szArgServerComment

  bArgStart = True
  bVerbose = False
  iArgPort = 21
  iArgSiteNumber = 0
  szArgIPAddress = ""
  szArgComputers = Array(1)
  szArgComputers(0) = "LocalHost"

  Set oArgs = WScript.Arguments
  iArgNum = 0

  While iArgNum < oArgs.Count

    Select Case LCase(oArgs(iArgNum))
      Case "-o","--port":
        iArgNum = iArgNum + 1
        iArgPort = oArgs(iArgNum)  
      Case "-i","--ipaddress":
        iArgNum = iArgNum + 1
        szArgIPAddress = oArgs(iArgNum)
      Case "-r","--rootdirectory":
        iArgNum = iArgNum + 1
        szArgRootDirectory = oArgs(iArgNum)
      Case "-t","--comment":
        iArgNum = iArgNum + 1
        szArgServerComment = oArgs(iArgNum)
      Case "-c","--computer":
        iArgNum = iArgNum + 1
        szArgComputers = Split(oArgs(iArgNum),",",-1)
      Case "-n","--sitenumber":
        iArgNum = iArgNum + 1
        iArgSiteNumber = CLng(oArgs(iArgNum))
      Case "-d","--dontstart":
        bArgStart = False
      Case "-?","--help":
        Call DisplayUsage
      Case "-v","--verbose":
        bVerbose = True
      Case Else:
        WScript.Echo "Unknown argument " & oArgs(iArgNum)
        Call DisplayUsage
    End Select  

    iArgNum = iArgNum + 1
  Wend

  If (szArgRootDirectory = "") Or (szArgServerComment = "") Then
    If (szArgRootDirectory = "") Then
      WScript.Echo "Missing Root Directory"
    Else
      WScript.Echo "Missing Server Comment"
    End If
    Call DisplayUsage
    WScript.Quit(1)
  End If

  Call ASTCreateFtpSite(szArgIPAddress, szArgRootDirectory, szArgServerComment, iArgPort, szArgComputers, iArgSiteNumber, bArgStart)

  Sub ASTCreateFtpSite(szIPAddress, szRootDirectory, szServerComment, iPortNum, szComputers, iSiteNumber, bStart)
    Dim bDone
    Dim iComputerIndex
    Dim iIndex
    Dim oFtpServer
    Dim oFtpSite
    Dim oMsFtpSvc
    Dim oNewFtpServer
    Dim oNewDir
    Dim szBindings
    Dim szBindingString
    Dim szComp
    Dim szNewBindings

    On Error Resume Next

    For iComputerIndex = 0 To UBound(szComputers)
      szComp = szComputers(iComputerIndex)
      If iComputerIndex <> UBound(szComputers) Then
        Trace "Creating FTP site on " & szComp & "."
      End If

      ' Grab the ftp service object
      Err.Clear
      Set oMsFtpSvc = GetObject("IIS://" & szComp & "/MSFTPSVC")
      If Err.Number <> 0 Then
        Display "Unable to open: " & "IIS://" & szComp & "/MSFTPSVC"
      End If

      szBindingString = szIPAddress & ":" & iPortNum & ":"
      Trace "Making sure this FTP server doesn't conflict with another..."
      For Each oFtpServer in oMsFtpSvc
        If oFtpServer.Class = "IIsFtpServer" Then
          szBindings = oFtpServer.ServerBindings
          If szBindingString = szBindings(0) Then
            Display "The server bindings you specified are duplicated in another virtual FTP server."
            WScript.Quit (1)
          End If
        End If
      Next

      iIndex = 1
      bDone = False
      Trace "Creating new FTP server..."

      ' If the user specified a SiteNumber, then use that.  Otherwise,
      ' test successive numbers under MSFTPSVC until an unoccupied slot is found
      If iSiteNumber <> 0 Then
        Set oNewFtpServer = oMsFtpSvc.Create("IIsFtpServer", iSiteNumber)
        oNewFtpServer.SetInfo
        If (Err.Number <> 0) Then
          WScript.Echo "Couldn't create a FTP site with the specified number: " & iSiteNumber
          WScript.Quit (1)
        Else
          Err.Clear
          ' Verify that the newly created site can be retrieved
          Set oFtpSite = GetObject("IIS://" & szComp & "/MSFTPSVC/" & iSiteNumber)
          If (Err.Number = 0) Then
            bDone = True
            Trace "FTP server created. Path is - " & "IIS://" & szComp & "/MSFTPSVC/" & iSiteNumber
          Else
            WScript.Echo "Couldn't create a FTP site with the specified number: " & iSiteNumber
            WScript.Quit (1)
          End If
        End If
      Else
        While (Not bDone)
          Err.Clear
          Set oFtpSite = GetObject("IIS://" & szComp & "/MSFTPSVC/" & iIndex)

          If (Err.Number = 0) Then
            ' A ftp server is already defined at this position so increment
            iIndex = iIndex + 1
          Else
            Err.Clear
            Set oNewFtpServer = oMsFtpSvc.Create("IIsFtpServer", iIndex)
            oNewFtpServer.SetInfo
            If (Err.Number <> 0) Then
              ' If call to Create failed then try the next number
              iIndex = iIndex + 1
            Else
              Err.Clear
              ' Verify that the newly created site can be retrieved
              Set oFtpSite = GetObject("IIS://" & szComp & "/MSFTPSVC/" & iIndex)
              If (Err.Number = 0) Then
                bDone = True
                Trace "FTP server created. Path is - " & "IIS://" & szComp & "/MSFTPSVC/" & iIndex
              Else
                iIndex = iIndex + 1
              End If
            End If
          End If

          ' sanity check at 10K sites
          If (iIndex > 10000) Then
            Display "Seem to be unable to create new FTP server.  Server number is " & iIndex & "."
            WScript.Quit (1)
          End If
        Wend
      End If

      szNewBindings = Array(0)
      szNewBindings(0) = szBindingString
      oNewFtpServer.ServerBindings = szNewBindings
      oNewFtpServer.ServerComment = szServerComment
      oNewFtpServer.SetInfo

      ' Now create the root directory object.
      Trace "Setting the home directory..."
      Set oNewDir = oNewFtpServer.Create("IIsFtpVirtualDir", "ROOT")
      oNewDir.Path = szRootDirectory
      oNewDir.AccessRead = True
      Err.Clear
      oNewDir.SetInfo

      If (Err.Number = 0) Then
        Trace "Home directory set."
      Else
        Display "Error setting home directory."
      End If

      Trace "FTP site created!"

      If bStart = True Then
        Trace "Attempting to start new FTP server..."
        Err.Clear
        Set oNewFtpServer = GetObject("IIS://" & szComp & "/MSFTPSVC/" & iIndex)
        oNewFtpServer.Start
        ' the next line "debounces" some startup errors
        WScript.Sleep 5000
        If (Err.Number <> 0) Or (oNewFtpServer.ServerState <> 2) Then
          Display "Error starting FTP server!"
          Err.Clear
        Else
          Trace "FTP server started succesfully!"
        End If
      End If
    Next
  End Sub

  ' Display the usage message
  Sub DisplayUsage
    WScript.Echo "Usage: mkftpsite <-r|--RootDirectory ""ROOT DIRECTORY"">"
    WScript.Echo "                 <-t|--Comment       ""SERVER COMMENT"">"
    WScript.Echo "                 [-c|--Computer      COMPUTER1[,COMPUTER2...]]"
    WScript.Echo "                 [-o|--Port          PORT NUM]"
    WScript.Echo "                 [-i|--IPAddress     IP ADDRESS]"
    WScript.Echo "                 [-n|--SiteNumber    SITENUMBER]"
    WScript.Echo "                 [-d|--DontStart]"
    WScript.Echo "                 [-v|--Verbose]"
    WScript.Echo "                 [-?|--Help]"
    WScript.Echo ""
    WScript.Echo "IP ADDRESS       Optional - The IP Address to assign to the new server"
    WScript.Echo "PORT NUM         Optional - The port to which the server should bind"
    WScript.Echo "ROOT DIRECTORY   Required - Full path to the root directory for the new server"
    WScript.Echo "SERVER COMMENT   Required - The server comment (this is the name that appears"
    WScript.Echo "                            in the MMC)"
    WScript.Echo "SITENUMBER       Optional - The site number is the number in the ADSI path that"
    WScript.Echo "                            the FTP server will be created at (i.e. MSFTPSVC/3)"
    WScript.Echo ""
    WScript.Echo "Example 1: mkftpsite -r D:\Roots\MyCompany --DontStart -t ""My Company Site"""
    WScript.Echo "Example 2: mkftpsite -r C:\Inetpub\ftproot -t Test -o 1021"
    WScript.Quit (1)
  End Sub

  Sub Display(Msg)
    WScript.Echo Now & " : ERROR: " & Msg
    WScript.Echo Now & " : ERROR: 0x" & Hex(Err.Number) & " - " & Err.Description
  End Sub

  Sub Trace(Msg)
    If bVerbose = True then
      WScript.Echo Now & " : " & Msg  
    End If
  End Sub

2. Call this script with the following syntax for full usage instructions:

  
  C:\>CSCRIPT %SystemDrive%\InetPub\AdminScripts\MKFTPSITE.VBS -?

For more information on Microsoft scripting technologies, see the following Web
site:

  http://msdn.microsoft.com/scripting/

Additional query words:

======================================================================
Keywords          :  
Technology        : kbiisSearch kbiis500
Version           : winnt:5.0
Issue type        : kbhowto

=============================================================================

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.