一下代码实现了用VBScript 调用 IIS ADSI API来访问iis下的所有websites。
主要功能如下:
- 列举出在给定iis服务器上的所有网站(假设用户在远程服务器上有相应的权限)
- 显示出每个网站的 HTTP/HTTPS绑定信息,包括IP, Port, Host Header
- 网站的状态Runtime state (启动、停止、暂停等)
- 其他信息,比如log文件路径和网站的友好名称
使用下面的脚本就可以实现这些功能: <EnumWebSites.vbs> [RemoteServerName] 来列出指定服务器上的网站。
比如,列出localhost的网站:
Site ID = 1
Comment = "Default WebSite"
State = Started (MD_SERVER_STATE_STARTED)
LogDir = %WinDir%/System32/LogFiles
IP Address Port Host
All Unassigned 80 *
1.2.3.4 81 *
12.34.56.78 82 HostHeader
All Unassigned 443 *
Site ID = 2
Comment = "Administration Web Site"
State = Started (MD_SERVER_STATE_STOPPED)
LogDir = %WinDir%/System32/LogFiles
IP Address Port Host
All Unassigned 8734 *
All Unassigned 443 *
如果想得到更详细的信息,参考以下网页:
- IIS ADSI Object Model Diagram (top-level view of the names and relations of various IIS administration objects).
- Documentation for IIsWebServer object (documentation for the IIsWebServer object, which is most pertinent to this question. You can find documentation for the other objects nearby).
- Script Center (lots of script snippets, but not a whole lot of hand-holding explanations)
- Simple script tool to edit IIS LIST objects
EnumWebSites.vbs代码:
OPTION EXPLICIT DIM CRLF, TAB DIM strServer DIM objWebService TAB = CHR( 9 ) CRLF = CHR( 13 ) & CHR( 10 ) IF WScript.Arguments.Length = 1 THEN strServer = WScript.Arguments( 0 ) ELSE strServer = "localhost" END IF WScript.Echo "Enumerating websites on " & strServer & CRLF SET objWebService = GetObject( "IIS://" & strServer & "/W3SVC" ) EnumWebsites objWebService SUB EnumWebsites( objWebService ) DIM objWebServer, strBindings FOR EACH objWebServer IN objWebService IF objWebserver.Class = "IIsWebServer" THEN WScript.Echo _ "Site ID = " & objWebserver.Name & CRLF & _ "Comment = """ & objWebServer.ServerComment & """ " & CRLF & _ "State = " & State2Desc( objWebserver.ServerState ) & CRLF & _ "LogDir = " & objWebServer.LogFileDirectory & _ "" ' Enumerate the HTTP bindings (ServerBindings) and ' SSL bindings (SecureBindings) strBindings = EnumBindings( objWebServer.ServerBindings ) & _ EnumBindings( objWebServer.SecureBindings ) IF NOT strBindings = "" THEN WScript.Echo "IP Address" & TAB & _ "Port" & TAB & _ "Host" & CRLF & _ strBindings END IF END IF NEXT END SUB FUNCTION EnumBindings( objBindingList ) DIM i, strIP, strPort, strHost DIM reBinding, reMatch, reMatches SET reBinding = NEW RegExp reBinding.Pattern = "([^:]*):([^:]*):(.*)" FOR i = LBOUND( objBindingList ) TO UBOUND( objBindingList ) ' objBindingList( i ) is a string looking like IP:Port:Host SET reMatches = reBinding.Execute( objBindingList( i ) ) FOR EACH reMatch IN reMatches strIP = reMatch.SubMatches( 0 ) strPort = reMatch.SubMatches( 1 ) strHost = reMatch.SubMatches( 2 ) ' Do some pretty processing IF strIP = "" THEN strIP = "All Unassigned" IF strHost = "" THEN strHost = "*" IF LEN( strIP ) < 8 THEN strIP = strIP & TAB EnumBindings = EnumBindings & _ strIP & TAB & _ strPort & TAB & _ strHost & TAB & _ "" NEXT EnumBindings = EnumBindings & CRLF NEXT END FUNCTION FUNCTION State2Desc( nState ) SELECT CASE nState CASE 1 State2Desc = "Starting (MD_SERVER_STATE_STARTING)" CASE 2 State2Desc = "Started (MD_SERVER_STATE_STARTED)" CASE 3 State2Desc = "Stopping (MD_SERVER_STATE_STOPPING)" CASE 4 State2Desc = "Stopped (MD_SERVER_STATE_STOPPED)" CASE 5 State2Desc = "Pausing (MD_SERVER_STATE_PAUSING)" CASE 6 State2Desc = "Paused (MD_SERVER_STATE_PAUSED)" CASE 7 State2Desc = "Continuing (MD_SERVER_STATE_CONTINUING)" CASE ELSE State2Desc = "Unknown state" END SELECT END FUNCTION