'---------------------------------------------------------------------------------------------------
' This function searches a computer for a specified Web Site, and
' displays information about the site.
'
' findweb [--computer|-c COMPUTER]
'         [WEBSITE]
'         [--help|-?]
'
'COMPUTER                Computer on which users exists
'WEBSITE                 Virtual Web Sites on which directories will be created
'
'Example 1		findweb -c LocalHost "Default Web Site"
'
'---------------------------------------------------------------------------------------------------

' Force explicit declaration of all variables.
Option Explicit

'On Error Resume Next

Dim oArgs, ArgNum

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

Set oArgs = WScript.Arguments
ArgComputers = Array("LocalHost")
ArgWebSites = "1"
ArgNum = 0
While ArgNum < oArgs.Count
	Select Case LCase(oArgs(ArgNum))
		Case "--computer","-c":
			ArgNum = ArgNum + 1
			If (ArgNum >= oArgs.Count) Then
				Call DisplayUsage
			End If	
			ArgComputers = Split(oArgs(ArgNum), ",", -1)
		Case "--help","-?"
			Call DisplayUsage
		Case Else:
			ArgWebSites = oArgs(ArgNum)
	End Select	

	ArgNum = ArgNum + 1
Wend

Dim foundSite
Dim compIndex
Dim bindInfo
Dim aBinding, binding
Dim hostname

for compIndex = 0 to UBound(ArgComputers)
	set foundSite = findWeb(ArgComputers(compIndex), ArgWebSites)
	if isObject(foundSite) then
		Trace "  Web Site Number = " & foundSite.Name
		Trace "  Web Site Description = " & foundSite.ServerComment
		aBinding = foundSite.ServerBindings
		if (IsArray(aBinding)) then
			if aBinding(0) = "" then
				binding = Null
			else
				binding = getBinding(ArgComputers(compIndex), aBinding(0))
			end if
		else 
			if aBinding = "" then
				binding = Null
			else
				binding = getBinding(ArgComputers(compIndex), aBinding)
			end if
		end if
		
		if IsArray(binding) then
			Trace "    Hostname = " & binding(2)
			Trace "    Port = " & binding(1)
			Trace "    IP Address = " & binding(0)
		end if
	else
		Trace "No matching web found."
	end if
next

function getBinding(hostName, bindstr)

	Dim one, two, ia, ip, hn
	Dim netw, host
	
	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))
	
	if ia = "" or hn = "" then
		Set netw = CreateObject("WScript.Network")
		if UCase(hostName) = "LOCALHOST" then
			host = resolveHostName(netw.ComputerName)
		else
			host = resolveHostName(hostName)
		end if
		if IsArray(host) then
			hn = host(0)
			ia = host(1)
		end if
	end if
	
	getBinding = Array(ia, ip, hn)
end function

Function findWeb(computer, webname)
	On Error Resume Next

	Dim websvc, site
	dim webinfo
	Dim aBinding, binding

	set websvc = GetObject("IIS://"&computer&"/W3svc")
	if (Err <> 0) then
		exit function
	end if
	' First try to open the webname.
	set site = websvc.GetObject("IIsWebServer", webname)
	if (Err = 0) and (not isNull(site)) then
		if (site.class = "IIsWebServer") then
			' Here we found a site that is a web server.
			set findWeb = site
			exit function
		end if
	end if
	err.clear
	for each site in websvc
		if site.class = "IIsWebServer" then
			'
			' First, check to see if the ServerComment
			' matches
			'
			If site.ServerComment = webname Then
				set findWeb = site
				exit function
			End If
			aBinding=site.ServerBindings
			if (IsArray(aBinding)) then
				if aBinding(0) = "" then
					binding = Null
				else
					binding = getBinding(computer, aBinding(0))
				end if
			else 
				if aBinding = "" then
					binding = Null
				else
					binding = getBinding(computer, aBinding)
				end if
			end if
			if IsArray(binding) then
				if (binding(2) = webname) or (binding(0) = webname) then
					set findWeb = site
					exit function
				End If
			end if 
		end if
	next
End Function

' Receives a NetBIOS hostname end return the FQDN for that host
Function resolveHostName(hostName)
	Dim ShellObj, FSObj
	Dim workFile, textFile, lines, index, tempSplit
	Dim result(2)
	
	Set ShellObj = CreateObject("WScript.Shell")
  	Set FSObj = CreateObject("Scripting.FileSystemObject")
  	workFile = FSObj.GetTempName

  	' Execute "nslookup <hostName>
  	ShellObj.Run "%COMSPEC% /c nslookup " & hostName & " > " & workFile, 0, true
  	Set ShellObj = nothing
  	Set textFile = FSObj.OpenTextFile(workFile)
  	lines = split(textFile.ReadAll, VBCrLf)
  	textFile.Close
  	Set textFile = nothing
  	FSObj.DeleteFile workFile
  	Set FSObj = nothing
  	
  	for index = 0 to UBound(lines)
  		' Look for "Name:   host.domain"
  		if instr(lines(index), "Name:") then
  			tempSplit = split(lines(index), ":")
  			result(0) = Trim(tempSplit(1))
  			tempSplit = split(lines(index + 1), ":")
  			result(1) = Trim(tempSplit(1))
  			resolveHostName = result
  			exit for
  		end if
  	next
End Function

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

Sub Trace(Msg)
	WScript.Echo Msg	
End Sub

Sub DisplayUsage()
	WScript.Echo " findweb [--computer|-c COMPUTER]"
	WScript.Echo "         [WEBSITE]"
	WScript.Echo "         [--help|-?]"
	WScript.Echo ""
	WScript.Echo "Finds the named web on the specified computer."
	WScript.Echo "Displays the site number, description, host name, port,"
	WScript.Echo "and IP Address"
	WScript.Echo ""
	WScript.Echo "Note, WEBSITE is the name of the Web Site to look for."
	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. ""www.domain.com"")"
	WScript.Echo " IP Address (i.e., 127.0.0.1)"
	WScript.Echo ""
	WScript.Echo "Example findweb -c MACHINE www.mycompany.com"
	WScript.Quit
End Sub
'---------------------------------------------------------------------------------