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

適当なのはこっちも一緒

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

using System;
using System.Collections.Generic;
using System.Text;
using System.Management;

namespace xxx
{
  public class IisWmiController
    :IIisContoller
  {
    private string siteId_;
    private bool stopComplete_;
    private bool startComplete_;

    private bool deleteComplete_;
    private bool createComplete_;

    //仮想ディレクトリの作成
    public void CreateVirdir(string virdirName, string dir)
    {
      ConnectionOptions co = new ConnectionOptions();
      string mn = "localhost";
      ManagementScope ms = new ManagementScope(@"\\" + mn + @"\root\MicrosoftIISV2", co);
      ms.Connect();
      ManagementPath mp = new ManagementPath("IIsWebVirtualDirSetting");
      ManagementClass mc = new ManagementClass(ms, mp, null);
      ManagementObject virDir = mc.CreateInstance();

      virDir.Properties["Name"].Value = siteId_ + "/Root/" + virdirName;
      virDir.Properties["Path"].Value = dir;
      virDir.Put();

      CreateVirdirInternal(virdirName, dir);
      for (int i = 0; i < value = "False" value =" virdirName;" value =" 1073741886;" createcomplete_ =" false;" mn = "localhost" co =" new" ms =" new" searcher =" new" name =" '" createmoo =" new" svc =" searcher.Get();" createcomplete_ =" true;" i =" 0;" deletecomplete_ =" false;" mn = "localhost" co =" new" ms =" new" searcher =" new" name =" '" deletemmo =" new" svc =" searcher.Get();" deletecomplete_ =" true;" mn = "localhost" co =" new" ms =" new" searcher =" new" name =" '" virdir =" searcher.Get();"> 0;
    }

    //匿名アカウントの取得
    public string GetAnonymousUserName()
    {
      string mn = "localhost";
      ConnectionOptions co = new ConnectionOptions();
      ManagementScope ms = new ManagementScope(@"\\" + mn + @"\root\MicrosoftIISV2", co);
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(
        ms,
        new ObjectQuery("SELECT AnonymousUserName FROM IIsWebServerSetting Where Name = '" + siteId_ + "'"),
        null);
      ManagementObjectCollection setting = searcher.Get();

      foreach (ManagementObject mo in setting)
      {
        return (string)mo.Properties["AnonymousUserName"].Value;
      }
      return string.Empty;
    }

    //Webサイトのルートディレクトリを取得
    public string GetRootPath()
    {
      string mn = "localhost";
      ConnectionOptions co = new ConnectionOptions();
      ManagementScope ms = new ManagementScope(@"\\" + mn + @"\root\MicrosoftIISV2", co);
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(
        ms,
        new ObjectQuery("SELECT Path FROM IIsWebVirtualDirSetting Where Name = '" + siteId_ + "/Root'"),
        null);
      ManagementObjectCollection setting = searcher.Get();

      foreach (ManagementObject mo in setting)
      {
        return (string)mo.Properties["Path"].Value;
      }
      return string.Empty;
    }

    //Webサイトの一覧を取得
    public WebSiteInfo[] GetWebSiteInfo()
    {
      //string mn = System.Environment.MachineName;

      List<websiteinfo> list = new List<websiteinfo>();

      string mn = "localhost";
      ConnectionOptions co = new ConnectionOptions();
      ManagementScope ms = new ManagementScope(@"\\" + mn + @"\root\MicrosoftIISV2", co);
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(ms, new ObjectQuery("SELECT name FROM IIsWebServer"), null);
      ManagementObjectCollection sites = searcher.Get();

      foreach (ManagementObject mo in sites)
      {
        string id = mo.Properties["Name"].Value.ToString();
        list.Add(new WebSiteInfo(
          id,
          GetWebSiteComment(id)));
      }
      return list.ToArray();
    }


    private string GetWebSiteComment(string name)
    {
      //string mn = System.Environment.MachineName;
      string mn = "localhost";
      ConnectionOptions co = new ConnectionOptions();
      ManagementScope ms = new ManagementScope(@"\\" + mn + @"\root\MicrosoftIISV2", co);
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(
        ms,
        new ObjectQuery("SELECT ServerComment FROM IIsWebServerSetting Where Name = '" + name + "'"),
        null);
      ManagementObjectCollection comments = searcher.Get();

      foreach (ManagementObject mo in comments)
      {
        return (string)mo.Properties["ServerComment"].Value;
      }

      return string.Empty;
    }

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

    //IISの開始
    public void Start()
    {
      StartInternal();
      for (int i = 0; i < 60; i++)
      {
        lock (this)
        {
          if (startComplete_)
          {
            return;
          }
        }
        System.Threading.Thread.Sleep(1000);
      }
    }

    private void StartInternal()
    {
      startComplete_ = false;
      string mn = "localhost";
      ConnectionOptions co = new ConnectionOptions();
      ManagementScope ms = new ManagementScope(@"\\" + mn + @"\root\MicrosoftIISV2", co);
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(
        ms,
        new ObjectQuery("SELECT * FROM IIsWebServer Where Name = '" + siteId_ + "'"),
        null);

      ManagementOperationObserver stopmoo = new ManagementOperationObserver();

      stopmoo.Completed += new CompletedEventHandler(startmoo_Completed);

      ManagementObjectCollection svc = searcher.Get();
      foreach (ManagementObject mo in svc)
      {
        mo.InvokeMethod(stopmoo, "Start", null);
        return;
      }
    }

    void startmoo_Completed(object sender, CompletedEventArgs e)
    {
      lock (this)
      {
        startComplete_ = true;
      }
    }

    //IISの停止
    public void Stop()
    {
      StopInternal();
      for (int i = 0; i < 60;i++)
      {
        lock (this)
        {
          if (stopComplete_)
          {
            return;
          }
        }
        System.Threading.Thread.Sleep(1000);
      }
    }

    private void StopInternal()
    {
      stopComplete_ = false;
      string mn = "localhost";
      ConnectionOptions co = new ConnectionOptions();
      ManagementScope ms = new ManagementScope(@"\\" + mn + @"\root\MicrosoftIISV2", co);
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(
        ms,
        new ObjectQuery("SELECT * FROM IIsWebServer Where Name = '" + siteId_ + "'"),
        null);

      ManagementOperationObserver stopmoo = new ManagementOperationObserver();

      stopmoo.Completed += new CompletedEventHandler(stopmoo_Completed);
      
      ManagementObjectCollection svc = searcher.Get();
      foreach (ManagementObject mo in svc)
      {
        mo.InvokeMethod(stopmoo, "Stop", null);
        return;
      }
    }

    void stopmoo_Completed(object sender, CompletedEventArgs e)
    {
      lock (this)
      {
        stopComplete_ = true;
      }
    }
  }
}