Working with IIS Metabase with DirectoryServices


Introduction:

 

While working with the IIS we all like to know the settings done on the Virtual Directory are correct or not. So we are going to see how to do that programmatically.

 

To check some properties of the IIS (Virtual Directory) of Web based application after  install, one can create custom application for that.

 

There are list of IIS Properties which we can get after post installation. The list of properties exposed by the IIS API or Web Settings Property is mentioned below 

  • AuthFlags
  • Path
  • AppFriendlyName
  • EnableDirBrowsing
  • AccessRead
  • AccessExecute
  • AccessWrite
  • AccessScript
  • AuthNTLM
  • EnableDefaultDoc
  • DefaultDoc
  • AspEnableParentPaths

The above settings are configured in the Metabase of the IIS.

 

IIS Metabase:

 

IIS Metabase is a structure where IIS configuration settings are stored. The metabase configuration and schema for IIS 4.0 and IIS 5.0 were stored in a binary file, but from IIS6.0 the configuration and setting is stored in single binary file (MetaBase.bin), with plain text, Extensible Markup Language (XML) formatted files named MetaBase.xml and MBSchema.xml.  You can navigate through the IIS Metabase using MetaEdit or Metabase Explorer. 

 

The Metabase is based on a hierarchical design with inheritance. Each object in the metabase has a KeyType. The KeyType property specifies the type of metabase key.

 

Implementation:

 

.Net provides the namespace which is used to get the properties of the IIS Virtual Directory. .Net have the "System.DirectoryServices" namespace which exposes the DirectoryEntry Class.

 

Code:

 

WebSettings.cs:

  

public class WebSettings

{

     //Authentication Bitmask Values

     //Constant Value Description

     public const int MD_AUTH_ANONYMOUS = 0x00000001;

     //Anonymous authentication available.

     public const int MD_AUTH_BASIC = 0x00000002;

     //Basic authentication available.

     public const int MD_AUTH_NT = 0x00000004;

     //Windows authentication schemes available.

     string Auth_Type;

     public string calc(int AuthValue)

     {

          if (AuthValue == MD_AUTH_ANONYMOUS)

          {

               Auth_Type = "ANONYMOUS ACCESS ENABLED";

          }

          if (AuthValue == MD_AUTH_BASIC)

          {

               Auth_Type = "BASIC ACCESS ENABLED";

          }

          if (AuthValue == MD_AUTH_NT)

          {

               Auth_Type = "INTEGRATED WINDOWS ACCESS ENABLED";

          }

          if (AuthValue == (MD_AUTH_ANONYMOUS + MD_AUTH_NT))

          {

               Auth_Type = "INTEGRATED WINDOWS + ANONYMOUS ACCESS ENABLED";

          }

          if (AuthValue == (MD_AUTH_ANONYMOUS + MD_AUTH_BASIC))

         {

              Auth_Type="BASIC + ANONYMOUS";

         }

         if (AuthValue == (MD_AUTH_ANONYMOUS + MD_AUTH_NT))

         {

              Auth_Type = "INTEGRATED + ANONYMOUS";

         }

         if (AuthValue == (MD_AUTH_BASIC + MD_AUTH_NT))

         {

             Auth_Type = "BASIC + INTEGRATED";

         }

         if (AuthValue == (MD_AUTH_ANONYMOUS + MD_AUTH_BASIC + MD_AUTH_NT))

         {

             Auth_Type = "ANONYMOUS + BASIC + INTEGRATED";

         }

          return Auth_Type;

     }

 

Main.cs

 

string serverName;

string vDir;

serverName = System.Environment.MachineName;

vDir = "DirectoryName";

vdir = new DirectoryEntry("IIS://" + serverName + "/W3SVC/1/ROOT/" + vDir);

wbs = new WebSettings();

string[] sComp = new string[12];

sComp[0] = "AuthFlags";

sComp[1] = "Path";

sComp[2] = "AppFriendlyName";

sComp[3] ="EnableDirBrowsing";

sComp[4] ="AccessRead";

sComp[5] ="AccessExecute";

sComp[6] ="AccessWrite";

sComp[7] ="AccessScript";

sComp[8] ="AuthNTLM";

sComp[9] ="EnableDefaultDoc";

sComp[10] ="DefaultDoc";

sComp[11] ="AspEnableParentPaths";

ListViewItem[] listViewItem = new ListViewItem[12];

lstIISProperty.Items.Clear();

for (int i = 0; i < sComp.Length; i++)

{

    //lstComponents.MultiColumn = 2;

    lstIISProperty.Sorting = SortOrder.Ascending;

    if (sComp[i] != null)

    {

    listViewItem[i] = new ListViewItem(new string[]{ sComp[i], IISPropertyValue(sCompi]), fnExpected_Value(sComp[i])}, -1);

    lstIISProperty.Items.Add(listViewItem[i]);

    }

}