'--------------------------------------------------------------------------------------------------- 
' 創建虛擬目錄  POWER BY JARON , 江都資訊網 , 1999-2002.  
' 如果您需要設置權限,請修改40-56 的代碼。 ** 根據 Microsoft Corp. 的 AdminScripts 改寫 
' 
' 用法: mkw3site <--RootDirectory|-r ROOT DIRECTORY> 
'                         <--Comment|-t SERVER COMMENT> 
'                         [--computer|-c COMPUTER1[,COMPUTER2...]] 
'                         [--HostName|-h HOST NAME] 
'                         [--port|-o PORT NUM] 
'                         [--IPAddress|-i IP ADDRESS] 
'                         [--SiteNumber|-n SITENUMBER] 
'                         [--DontStart] 
'                         [--verbose|-v] 
'                         [--help|-?] 
' 
' IP ADDRESS            The IP Address to assign to the new server.  Optional. 
' HOST NAME             The host name of the web site for host headers. 
'WARNING: Only use Host Name if DNS is set up find the server. 
' PORT NUM              The port to which the server should bind 
' ROOT DIRECTORY        Full path to the root directory for the new server. 
' SERVER COMMENT        The server comment -- this is the name that appers in the MMC. 
' SITENUMBERThe Site Number is the number in the path that the web server 
'will be created at.  i.e. w3svc/3 
' 
' Example 1: mkw3site -r D:/Roots/Company11 --DontStart -t "My Company Site" 
' Example 2: mkw3site -r C:/Inetpub/wwwroot -t Test -o 8080 
'------------------------------------------------------------------------------------------------  
' Force explicit declaration of all variables 
Option Explicit  
On Error Resume Next  
Dim ArgIPAddress, ArgRootDirectory, ArgServerComment, ArgSkeletalDir, ArgHostName, ArgPort 
Dim ArgComputers, ArgStart 
Dim ArgSiteNumber 
Dim oArgs, ArgNum 
Dim verbose 
' 設置可寫、腳本執行權限 
Dim prop(15,2) 
Dim propNum 
prop(propNum,0) = "AccessRead" 
prop(propNum,1) = true' 可讀設為TRUE,不可讀設為FALSE 
propNum = propNum + 1 
prop(propNum, 0) = "AccessWrite" 
prop(propNum, 1) = true ' 可寫設為TRUE,不可寫設為FALSE 
propNum = propNum + 1 
prop(propNum, 0) = "AccessScript" 
prop(propNum, 1) = true ' 可運行腳本文件設為TRUE,不可運行腳本文件設為FALSE 
propNum = propNum + 1 
prop(propNum, 0) = "AccessExecute" 
prop(propNum, 1) = false ' 可運行執行文件設為TRUE,不可運行執行文件設為FALSE 
propNum = propNum + 1 
prop(propNum, 0) = "EnableDirBrowsing" 
prop(propNum, 1) = true ' 允許列出目錄設為TRUE,不允許列出目錄設為FALSE 
propNum = propNum + 1  
ArgIPAddress = "" 
ArgHostName = "" 
ArgPort = 80 
ArgStart = True 
ArgComputers = Array(1) 
ArgComputers(0) = "LocalHost" 
ArgSiteNumber = 0 
verbose = false  
Set oArgs = WScript.Arguments 
ArgNum = 0  
While ArgNum < oArgs.Count  
Select Case LCase(oArgs(ArgNum)) 
Case "--port","-o": 
ArgNum = ArgNum + 1 
ArgPort = oArgs(ArgNum) 
Case "--ipaddress","-i": 
ArgNum = ArgNum + 1 
ArgIPAddress = oArgs(ArgNum) 
Case "--rootdirectory","-r":  
ArgNum = ArgNum + 1 
ArgRootDirectory = oArgs(ArgNum) 
Case "--comment","-t": 
ArgNum = ArgNum + 1 
ArgServerComment = oArgs(ArgNum) 
Case "--hostname","-h": 
ArgNum = ArgNum + 1 
ArgHostName = oArgs(ArgNum) 
Case "--computer","-c": 
ArgNum = ArgNum + 1 
ArgComputers = Split(oArgs(ArgNum), ",", -1) 
Case "--sitenumber","-n": 
ArgNum = ArgNum + 1 
ArgSiteNumber = CLng(oArgs(ArgNum)) 
Case "--dontstart": 
ArgStart = False 
Case "--help","-?": 
Call DisplayUsage 
Case "--verbose", "-v": 
verbose = true 
Case Else: 
WScript.Echo "Unknown argument "& oArgs(ArgNum) 
Call DisplayUsage 
End Select  
ArgNum = ArgNum + 1 
Wend  
If (ArgRootDirectory = "") Or (ArgServerComment = "") Then 
if (ArgRootDirectory = "") then 
WScript.Echo "Missing Root Directory" 
else 
WScript.Echo "Missing Server Comment" 
end if 
Call DisplayUsage 
WScript.Quit(1) 
End If  
Call ASTCreateWebSite(ArgIPAddress, ArgRootDirectory, ArgServerComment, ArgHostName, ArgPort, ArgComputers, ArgStart)  
Sub ASTCreateWebSite(IPAddress, RootDirectory, ServerComment, HostName, PortNum, Computers, Start) 
Dim w3svc, WebServer, NewWebServer, NewDir, Bindings, BindingString, NewBindings, ComputerIndex, Index, SiteObj, bDone 
Dim comp 
On Error Resume Next 
For ComputerIndex = 0 To UBound(Computers) 
comp = Computers(ComputerIndex) 
If ComputerIndex <> UBound(Computers) Then 
Trace "Creating web site on " & comp & "." 
End If  
' Grab the web service object 
Err.Clear 
Set w3svc = GetObject("IIS://" & comp & "/w3svc") 
If Err.Number <> 0 Then 
Display "Unable to open: "&"IIS://" & comp & "/w3svc" 
End If 
BindingString = IpAddress & ":" & PortNum & ":" & HostName 
Trace "Making sure this web server doesn't conflict with another..." 
For Each WebServer in w3svc 
If WebServer.Class = "IIsWebServer" Then 
Bindings = WebServer.ServerBindings 
If BindingString = Bindings(0) Then 
Trace "The server bindings you specified are duplicated in another virtual web server." 
WScript.Quit (1) 
End If 
End If 
Next  
Index = 1 
bDone = False 
Trace "Creating new web server..."  
' If the user specified a SiteNumber, then use that.  Otherwise, 
' test successive numbers under w3svc until an unoccupied slot is found 
If ArgSiteNumber <> 0 Then 
Set NewWebServer = w3svc.Create("IIsWebServer", ArgSiteNumber) 
NewWebServer.SetInfo 
If (Err.Number <> 0) Then 
WScript.Echo "Couldn't create a web site with the specified number: " & ArgSiteNumber 
WScript.Quit (1) 
Else 
Err.Clear 
' Verify that the newly created site can be retrieved 
Set SiteObj = GetObject("IIS://"&comp&"/w3svc/" & ArgSiteNumber) 
If (Err.Number = 0) Then 
bDone = True 
Trace "Web server created. Path is - "&"IIS://"&comp&"/w3svc/" & ArgSiteNumber 
Else 
WScript.Echo "Couldn't create a web site with the specified number: " & ArgSiteNumber 
WScript.Quit (1) 
End If 
End If 
Else 
While (Not bDone) 
Err.Clear 
Set SiteObj = GetObject("IIS://"&comp&"/w3svc/" & Index)  
If (Err.Number = 0) Then 
' A web server is already defined at this position so increment 
Index = Index + 1 
Else 
Err.Clear 
Set NewWebServer = w3svc.Create("IIsWebServer", Index) 
NewWebServer.SetInfo 
If (Err.Number <> 0) Then 
' If call to Create failed then try the next number 
Index = Index + 1 
Else 
Err.Clear 
' Verify that the newly created site can be retrieved 
Set SiteObj = GetObject("IIS://"&comp&"/w3svc/" & Index) 
If (Err.Number = 0) Then 
bDone = True 
Trace "Web server created. Path is - "&"IIS://"&comp&"/w3svc/" & Index 
Else 
Index = Index + 1 
End If 
End If 
End If  
' sanity check 
If (Index > 10000) Then 
Trace "Seem to be unable to create new web server.  Server number is "&Index&"." 
WScript.Quit (1) 
End If 
Wend 
End If 
NewBindings = Array(0) 
NewBindings(0) = BindingString 
NewWebServer.ServerBindings = NewBindings 
NewWebServer.ServerComment = ServerComment 
NewWebServer.SetInfo  
' Now create the root directory object. 
Trace "Setting the home directory..." 
Set NewDir = NewWebServer.Create("IIsWebVirtualDir", "ROOT") 
NewDir.Path = RootDirectory 
NewDir.AccessRead = true 
Err.Clear 
NewDir.SetInfo 
NewDir.AppCreate (True)  
If (Err.Number = 0) Then 
Trace "Home directory set." 
Else 
Display "Error setting home directory." 
End If  
Trace "Web site created!"  
If Start = True Then 
Trace "Attempting to start new web server..." 
Err.Clear 
Set NewWebServer = GetObject("IIS://" & comp & "/w3svc/" & Index) 
NewWebServer.Start 
If Err.Number <> 0 Then 
Display "Error starting web server!" 
Err.Clear 
Else 
Trace "Web server started succesfully!" 
End If 
End If 
Next 
Call ASTSetPerms(comp, Index,ArgRootDirectory , prop, propNum) 
End Sub  
Sub ASTSetPerms(comp, ArgSiteNumber,ArgRootDirectory , propList, propCount) 
'On Error Resume Next 
Dim oAdmin 
Dim fullPath 
fullPath = "IIS://"&comp&"/w3svc/" & ArgSiteNumber & "/ROOT" 
Trace "Opening path " & fullPath 
Set oAdmin = GetObject(fullPath) 
If Err.Number <> 0 Then 
Display Error_NoNode 
WScript.Quit (1) 
End If  
Dim name, val 
if propCount > 0 then 
Dim i  
for i = 0 to propCount-1 
name = propList(i,0) 
val = propList(i,1) 
if verbose = true then 
Trace "Setting "&fullPath&"/"&name&" = "& val 
end if 
oAdmin.Put name, (val) 
If Err <> 0 Then 
Display "Unable to set property "&name 
End If 
next 
oAdmin.SetInfo 
If Err <> 0 Then 
Display "不能保存更新信息." 
End If 
end if 
End Sub  
' Display the usage message 
Sub DisplayUsage 
WScript.Quit (1) 
End Sub  
Sub Display(Msg) 
WScript.Echo Now & ". Error Code: " & Hex(Err) & " - " & Msg 
End Sub  
Sub Trace(Msg) 
if verbose = true then 
WScript.Echo Now & " : " & Msg 
end if 
End Sub