C#からIISの操作 (ADSI編)

結構適当なので鵜呑みにはしないで。

・ADSIを使ってる。なのでWMIがないマシン(Windows2000)でも動く
・ローカルマシンのIISをいじることしか考えていない
・仮想ディレクトリを作ったら、ついでにASP.NET2.0を有効にしている

using System;
using System.DirectoryServices;
using System.Collections.Generic;
using System.Text;

namespace xxx
{
 public class IisAdsiContoller
 {
  private const string IIS_ADSI_VIRDIR_SCM = "IIsWebVirtualDir";
  private string siteId_;

  private string IIS_ADIN
  {
   get
   {
    return "IIS://localhost/W3SVC/" + siteId_;
   }
  }

  private string IIS_ADSI_ROOTPATH
  {
   get
   {
    return "IIS://localhost/W3SVC/" + siteId_ + "/root"; ;
   }
  }


  public IisAdsiContoller()
  {
  }

  //Webサイトの一覧を取得
  public WebSiteInfo[] GetWebSiteInfo()
  {
   DirectoryEntry iisAdmin = new DirectoryEntry("IIS://localhost/W3SVC");
   List<websiteinfo> list = new List<websiteinfo>();

   foreach (DirectoryEntry de in iisAdmin.Children)
   {
    if (de.SchemaClassName == "IIsWebServer")
    {
     list.Add(new WebSiteInfo(de.Name,de.Properties["ServerComment"][0].ToString()));
    }
   }
   return list.ToArray();
  }

  //操作するWebサイトをセット
  public void SetControlWebsiteId(string siteId)
  {
   siteId_ = siteId;
  }

  //IISの停止
  public void Stop()
  {
   try
   {
    DirectoryEntry iisAdmin = new DirectoryEntry(IIS_ADIN);
    iisAdmin.Invoke("STOP");
   }
   catch (Exception e)
   {
    throw new IisControlException("IISの停止に失敗しました", e);
   }
  }

  //IISの開始
  public void Start()
  {
   try
   {
    DirectoryEntry iisAdmin = new DirectoryEntry(IIS_ADIN);
    iisAdmin.Invoke("START");
   }
   catch (Exception e)
   {
    throw new IisControlException("IISの開始に失敗しました", e);
   }
  }

  //匿名アカウントの取得
  public string GetAnonymousUserName()
  {
   try
   {
    DirectoryEntry iisAdmin = new DirectoryEntry(IIS_ADSI_ROOTPATH);
    return (string)iisAdmin.Properties["AnonymousUserName"][0];
   }
   catch (Exception e)
   {
    throw new IisControlException("匿名アクセスに使用するアカウントの取得に失敗しました", e);
   }
  }

  //Webサイトのルートディレクトリを取得
  public string GetRootPath()
  {
   DirectoryEntry iisAdmin = new DirectoryEntry(IIS_ADSI_ROOTPATH);
   return (string)iisAdmin.Properties["Path"][0];
  }

  //仮想ディレクトリの存在確認
  public bool ExistsVirdir(string virdirName)
  {
   try
   {
    return DirectoryEntry.Exists(IIS_ADSI_ROOTPATH + "/" + virdirName);
   }
   catch (Exception e)
   {
    throw new IisControlException("仮想ディレクトリ[" + virdirName + "]の存在確認に失敗しました", e);
   }
  }

  //仮想ディレクトリの削除
  public void DeleteVirdir(string virdirName)
  {
   DirectoryEntry iisAdmin = new DirectoryEntry(IIS_ADSI_ROOTPATH);
   DirectoryEntry cde = iisAdmin.Children.Find(virdirName, IIS_ADSI_VIRDIR_SCM);

   iisAdmin.Children.Remove(cde);
   
   //cde.DeleteTree();
   
   iisAdmin.CommitChanges();

   cde.Close();
   iisAdmin.Close();
  }

  private void UpdateScriptMaps(ref DirectoryEntry entry)
  {
   //全削除
   entry.Properties["ScriptMaps"].Clear();

   string vsdir = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory();
   entry.Properties["ScriptMaps"].Add(".asax," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".ascx," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".ashx," + vsdir + "aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".asmx," + vsdir + "aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".aspx," + vsdir + "aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".axd," + vsdir + "aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".vsdisco," + vsdir + "aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".rem," + vsdir + "aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".soap," + vsdir + "aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".config," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".cs," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".csproj," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".vb," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".vbproj," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".webinfo," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".licx," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".resx," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".resources," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".master," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".skin," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".compiled," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".browser," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".mdb," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".jsl," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".vjsproj," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".sitemap," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".msgx," + vsdir + "aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".ad," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".dd," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".ldd," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".sd," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".cd," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".adprototype," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".lddprototype," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".sdm," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".sdmDocument," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".ldb," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".svc," + vsdir + "aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".mdf," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".ldf," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".java," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".exclude," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
   entry.Properties["ScriptMaps"].Add(".refresh," + vsdir + "aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG");
  }

  //仮想ディレクトリの作成
  public void CreateVirdir(string virdirName,string dir)
  {
   try
   {
    if (!ExistsVirdir(virdirName))
    {
     DirectoryEntry iisAdmin = new DirectoryEntry(IIS_ADSI_ROOTPATH);
     DirectoryEntry newVirdir = iisAdmin.Children.Add(
      virdirName,
      IIS_ADSI_VIRDIR_SCM);
     newVirdir.Properties["AccessRead"][0] = true;
     newVirdir.Properties["AppFriendlyName"][0] = virdirName;
     newVirdir.Properties["AccessExecute"][0] = true;
     newVirdir.Properties["AccessWrite"][0] = false;
     newVirdir.Properties["AccessScript"][0] = true;
     newVirdir.Properties["EnableDefaultDoc"][0] = true;
     newVirdir.Properties["Path"][0] = dir;
     newVirdir.CommitChanges();
     newVirdir.Invoke("AppCreate", false);
     newVirdir.Properties["AppIsolated"][0] = (System.Int32)2;

     string vsdir = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory();

     UpdateScriptMaps(ref newVirdir);

     newVirdir.CommitChanges();
     newVirdir.Close();
     iisAdmin.Close();
    }
    else
    {
     DirectoryEntry virdir = new DirectoryEntry(IIS_ADSI_ROOTPATH + "/" + virdirName);
     virdir.Properties["AccessRead"][0] = true;
     virdir.Properties["AppFriendlyName"][0] = virdirName;
     virdir.Properties["AccessExecute"][0] = true;
     virdir.Properties["AccessWrite"][0] = false;
     virdir.Properties["AccessScript"][0] = true;
     virdir.Properties["EnableDefaultDoc"][0] = true;
     virdir.CommitChanges();
     virdir.Invoke("AppCreate", false);
     virdir.Properties["AppIsolated"][0] = (System.Int32)2;

     UpdateScriptMaps(ref virdir);

     virdir.CommitChanges();
     virdir.Close();
    }
   }
   catch (Exception e)
   {
    throw new IisControlException(
     "仮想ディレクトリの作成に失敗しました" +
     Environment.NewLine +
     "仮想ディレクトリ:" +
     virdirName +
     Environment.NewLine +
     "ディレクトリ:"
     + dir, e);
   }
  }
 }
}