You can use the IIS Admin Objects to recursively walk the metabase on your computer. The following sample program uses VBScript code in an .asp file to list the nodes in the metabase structure, optionally printing the ADSI properties, mandatory properties, optional properties, whether each property is inheritable, and the data type of the property.
<HTML> <HEAD> <TITLE>SchemaA.asp (IIS Property Schema)</TITLE> </HEAD> <BODY BGCOLOR=#FFFFFF> <FONT FACE="Courier" SIZE=2> <% ' This program will list metabase nodes installed on LocalHost, ' optionally printing ADSI properties, mandatory properties, ' optional properties, whether the properties are inheritable, ' and the data type of the property. ' Option usage .../SchemaA.asp?ShowProp={param}&ShowInh={T|F} ' &ShowType={T|F}&StartKey={Path}&Recurse={T|F} ' ShowProp={All|None|(one or more of AMO)} ' All or AMO => All properties [Default] ' None or N => No properties ' A => ADSI properties ' M => Mandatory properties ' O => Optional properties ' ShowInh={T|F} (Show property inheritance attribute} ' ShowType={T|F} (Show property data type) ' StartKey={Path of starting key e.g. IIS://LocalHost/W3SVC} ' Recurse={T|F} (Recurse from the starting key) ' Default: All, T, T, IIS://LocalHost, T Dim MachName ' Holds machine name (LocalHost) Dim ADsObj ' Holds object Dim SchemaPath ' Path to object's schema object Dim SchemaObj ' Holds object's schema object Dim PropSchemaObj ' Holds schema for individual property Dim MandPropList ' Holds object's mandatory property list Dim OptPropList ' Holds object's optional property list Dim Level ' Recursive indent level Dim LevelWidth ' Number of indent spaces per level (default 3) Dim Indent ' String spaces for indentation Dim ShowProp ' Input parameter Dim ShowInh ' Input parameter Dim StartKey ' Input parameter Dim Recurse ' Input parameter Dim PropArgs ' Temporary variable Dim InhArgs ' Temporary variable Dim KeyArgs ' Temporary variable Dim RecurseArgs ' Temporary variable Dim InhList(2) ' Holds output text InhList(0) = " Inh " InhList(1) = "Not Inh" InhList(2) = "Invalid Property" MachName = "LocalHost" ' Get arguments from command line ShowProp = "AMO" ' Default to all options PropArgs = Request.QueryString("ShowProp") If PropArgs <> "" Then ShowProp = UCase(PropArgs) If ShowProp = "NONE" Then ShowProp = "N" If ShowProp = "ALL" Then ShowProp = "AMO" End If ShowInh = "T" InhArgs = Request.QueryString("ShowInh") If InhArgs <> "" Then ShowInh = UCase(InhArgs) If ShowInh = "YES" or ShowInh = "TRUE" Then ShowInh = "T" If ShowInh = "FALSE" or ShowInh = "F" Then ShowInh = "F" End If ShowType = "T" InhArgs = Request.QueryString("ShowType") If InhArgs <> "" Then ShowType = UCase(InhArgs) If ShowType = "YES" or ShowType = "TRUE" Then ShowType = "T" If ShowType = "FALSE" or ShowType = "F" Then ShowType = "F" End If StartKey = "IIS://" & MachName KeyArgs = Request.QueryString("StartKey") If KeyArgs <> "" Then StartKey = KeyArgs End If Recurse = "T" RecurseArgs = Request.QueryString("Recurse") If RecurseArgs <> "" Then Recurse = UCase(RecurseArgs) End If on error resume next Set ADsObj = GetObject(StartKey) If err.number <> 0 then response.write "Error " & err.number & " = " & err.description Err.Raise ,,"Unable to open path object" end if REM Use HTML <PRE> tag to prevent white space compression Response.Write "<PRE>" Response.Write "<B>" & ADsObj.ADsPath & "</B> Structure/Property Schema</B><BR>" Response.Write " [ShowProp = " & ShowProp & "]<BR>" Response.Write " [ShowInh = " & ShowInh & "]<BR>" Response.Write " [ShowType = " & ShowType & "]<BR>" Response.Write " [StartKey = " & StartKey & "]<BR>" Response.Write " [Recurse = " & Recurse & "]<BR>" Response.Write "<BR>" Response.Write " <B>Option usage:</B> .../SchemaA.asp?ShowProp={param}&ShowInh={T|F}" Response.Write "&ShowType={T|F}&StartKey={Path}&Recurse={T|F} <BR>" Response.Write " ShowProp={All|None|(one or more of AMO)} <BR>" Response.Write " All or AMO => All properties [Default] <BR>" Response.Write " None or N => No properties <BR>" Response.Write " A => ADSI properties <BR>" Response.Write " M => Mandatory properties <BR>" Response.Write " O => Optional properties <BR>" Response.Write " ShowInh={T|F} (Show property inheritance attribute} <BR>" Response.Write " ShowType={T|F} (Show property data type) <BR>" Response.Write " StartKey={Path of starting key e.g. IIS://LocalHost/W3SVC} <BR>" Response.Write " Recurse={T|F} (Recurse from the starting key) <BR>" Response.Write " Default: All, T, T, IIS://LocalHost, T <BR>" Response.Write "<HR>" ' Recursively retrieve and print object names and properties LevelWidth = 3 Level = -1 PrintProps(ADsObj) ' Complete the page Response.Write "</PRE>" Response.Write "<HR>" Sub PrintProps(ThisObj) On error Resume next If Err.Number <> 0 Then Err.Clear Level = Level - 1 Exit Sub End If Level = Level + 1 Response.write Space(LevelWidth*Level) If ShowProp <> "N" Then Response.write "<B>" End If Response.Write ThisObj.Name If IsNumeric(ThisObj.Name) Then Response.write " (Virtual Server - " & ThisObj.ServerComment & ")" End If If ShowProp <> "N" Then Response.write "</B>" End If Response.Write "<BR>" If Instr(ShowProp, "A") > 0 Then ' Print the ADSI properties Indent = Space(LevelWidth*(Level+1)) Response.Write Indent & "<I>ADSI Properties</I><BR>" Indent = Space(LevelWidth*(Level+2)) Response.write Indent & "Name = " & ThisObj.Name Response.write "<BR>" Response.write Indent & "ADsPath = " & ThisObj.AdsPath Response.write "<BR>" Response.write Indent & "Class = " & ThisObj.Class Response.write "<BR>" Response.write Indent & "GUID = " & ThisObj.GUID Response.write "<BR>" Response.write Indent & "Parent = " & ThisObj.Parent Response.write "<BR>" Response.write Indent & "Schema = " & ThisObj.Schema Response.write "<BR>" End If ' Show ADSI If Instr(ShowProp, "M") > 0 Then ' Print the mandatory properties SchemaPath = ThisObj.Schema Set SchemaObj = GetObject(SchemaPath) Indent = Space(LevelWidth*(Level+1)) Response.Write Indent & "<I>Mandatory Properties</I><BR>" MandPropList = SchemaObj.MandatoryProperties Indent = Space(LevelWidth*(Level+2)) For Each PropName in MandPropList Response.Write Indent & PropName If ShowInh = "T" Then Response.Write Space(35-Len(PropName)) Response.Write InhList(IsInheritable(PropName)) End If If ShowType = "T" Then If ShowInh = "T" Then ' Already vertically aligned - just move on a little Response.Write Space(4) Else ' Pad out to align vertically Response.Write Space(35-Len(PropName)) End If Set PropSchemaObj = GetObject("IIS://" & MachName & "/Schema/" & PropName) Response.Write PropSchemaObj.Syntax End If Response.Write "<BR>" Next End If ' Show Mandatory If Instr(ShowProp, "O") > 0 Then ' Print the optional properties SchemaPath = ThisObj.Schema Set SchemaObj = GetObject(SchemaPath) Indent = Space(LevelWidth*(Level+1)) Response.Write Indent & "<I>Optional Properties</I><BR>" OptPropList = SchemaObj.OptionalProperties Indent = Space(LevelWidth*(Level+2)) For Each PropName in OptPropList Response.Write Indent & PropName If ShowInh = "T" Then Response.Write Space(35-Len(PropName)) Response.Write InhList(IsInheritable(PropName)) End If If ShowType = "T" Then If ShowInh = "T" Then ' Already vertically aligned - just move on a little Response.Write Space(4) Else ' Pad out to align vertically Response.Write Space(35-Len(PropName)) End If Set PropSchemaObj = GetObject("IIS://" & MachName & "/Schema/" & PropName) Response.Write PropSchemaObj.Syntax End If Response.Write "<BR>" Next End If ' Show Optional ' Enumerate children recursively If Recurse <> "T" Then Exit Sub End If If ShowProp <> "N" Then ' Add a blank separator line if props show Response.Write "<BR>" End If For Each Child in ThisObj If Err.Number <> 0 Then ' Skip objects that have no children Err.Clear Else ' Recurse into the children of this object PrintProps(Child) End If Next Level = Level - 1 Err.Clear End Sub Function IsInheritable(PropNameIn) ' Returns 0 if inheritable ' Returns 1 if a valid property and not inheritable ' Returns 2 if not a valid property Const IIS_INHERITABLE_ONLY = 1 Const MD_ERROR_DATA_NOT_FOUND = &H800CC801 Const NOT_A_VALID_PROPERTY = &H80005006 Dim IsInheritableObj Dim IsInheritablePaths On Error Resume Next Set IsInheritableObj = GetObject("IIS://" & MachName) IsInheritablePaths = IsInheritableObj.GetDataPaths(PropNameIn, IIS_INHERITABLE_ONLY) Select Case Err.Number Case 0 ' Valid property, inheritable IsInheritable = 0 Case MD_ERROR_DATA_NOT_FOUND ' Valid property, not inheritable IsInheritable = 1 Case NOT_A_VALID_PROPERTY ' Not a valid property IsInheritable = 2 End Select Err.Clear End Function %> </BODY> </HTML>