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); } } } }