C#操作IIS方法集合

 更新时间:2015年09月28日 12:04:56   投稿:lijiao  
这篇文章主要介绍了C#操作IIS方法集合的相关资料,需要的朋友可以参考下

C# 操作IIS方法集合
如果在win8,win7情况下报错:未知错误(0x80005000) ----见https://www.jb51.net/article/72881.htm

using System;
using System.Collections;
using System.Collections.Generic;
using System.DirectoryServices;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace IISControlHelper
{
  /// <summary>
  /// IIS 操作方法集合
  /// https://www.jb51.net/article/72881.htm 错误
  /// </summary>
  public class IISWorker
  {
    private static string HostName = "localhost";

    /// <summary>
    /// 获取本地IIS版本
    /// </summary>
    /// <returns></returns>
    public static string GetIIsVersion()
    {
      try
      {
        DirectoryEntry entry = new DirectoryEntry("IIS://" + HostName + "/W3SVC/INFO");
        string version = entry.Properties["MajorIISVersionNumber"].Value.ToString();
        return version;
      }
      catch (Exception se)
      {
        //说明一点:IIS5.0中没有(int)entry.Properties["MajorIISVersionNumber"].Value;属性,将抛出异常 证明版本为 5.0
        return string.Empty;
      }
    }

    /// <summary>
    /// 创建虚拟目录网站
    /// </summary>
    /// <param name="webSiteName">网站名称</param>
    /// <param name="physicalPath">物理路径</param>
    /// <param name="domainPort">站点+端口,如192.168.1.23:90</param>
    /// <param name="isCreateAppPool">是否创建新的应用程序池</param>
    /// <returns></returns>
    public static int CreateWebSite(string webSiteName, string physicalPath, string domainPort,bool isCreateAppPool)
    {
      DirectoryEntry root = new DirectoryEntry("IIS://" + HostName + "/W3SVC");
      // 为新WEB站点查找一个未使用的ID
      int siteID = 1;
      foreach (DirectoryEntry e in root.Children)
      {
        if (e.SchemaClassName == "IIsWebServer")
        {
          int ID = Convert.ToInt32(e.Name);
          if (ID >= siteID) { siteID = ID + 1; }
        }
      }
      // 创建WEB站点
      DirectoryEntry site = (DirectoryEntry)root.Invoke("Create", "IIsWebServer", siteID);
      site.Invoke("Put", "ServerComment", webSiteName);
      site.Invoke("Put", "KeyType", "IIsWebServer");
      site.Invoke("Put", "ServerBindings", domainPort + ":");
      site.Invoke("Put", "ServerState", 2);
      site.Invoke("Put", "FrontPageWeb", 1);
      site.Invoke("Put", "DefaultDoc", "Default.html");
      // site.Invoke("Put", "SecureBindings", ":443:");
      site.Invoke("Put", "ServerAutoStart", 1);
      site.Invoke("Put", "ServerSize", 1);
      site.Invoke("SetInfo");
      // 创建应用程序虚拟目录

      DirectoryEntry siteVDir = site.Children.Add("Root", "IISWebVirtualDir");
      siteVDir.Properties["AppIsolated"][0] = 2;
      siteVDir.Properties["Path"][0] = physicalPath;
      siteVDir.Properties["AccessFlags"][0] = 513;
      siteVDir.Properties["FrontPageWeb"][0] = 1;
      siteVDir.Properties["AppRoot"][0] = "LM/W3SVC/" + siteID + "/Root";
      siteVDir.Properties["AppFriendlyName"][0] = "Root";

      if (isCreateAppPool)
      {
        DirectoryEntry apppools = new DirectoryEntry("IIS://" + HostName + "/W3SVC/AppPools");

        DirectoryEntry newpool = apppools.Children.Add(webSiteName, "IIsApplicationPool");
        newpool.Properties["AppPoolIdentityType"][0] = "4"; //4
        newpool.Properties["ManagedPipelineMode"][0] = "0"; //0:集成模式 1:经典模式
        newpool.CommitChanges();
        siteVDir.Properties["AppPoolId"][0] = webSiteName;
      }

      siteVDir.CommitChanges();
      site.CommitChanges();
      return siteID;
    }

    /// <summary>
    /// 得到网站的物理路径
    /// </summary>
    /// <param name="rootEntry">网站节点</param>
    /// <returns></returns>
    public static string GetWebsitePhysicalPath(DirectoryEntry rootEntry)
    {
      string physicalPath = "";
      foreach (DirectoryEntry childEntry in rootEntry.Children)
      {
        if ((childEntry.SchemaClassName == "IIsWebVirtualDir") && (childEntry.Name.ToLower() == "root"))
        {
          if (childEntry.Properties["Path"].Value != null)
          {
            physicalPath = childEntry.Properties["Path"].Value.ToString();
          }
          else
          {
            physicalPath = "";
          }
        }
      }
      return physicalPath;
    }

    /// <summary>
    /// 获取站点名
    /// </summary>
    public static List<IISInfo> GetServerBindings()
    {
      List<IISInfo> iisList = new List<IISInfo>();
      string entPath = String.Format("IIS://{0}/w3svc", HostName);
      DirectoryEntry ent = new DirectoryEntry(entPath);
      foreach (DirectoryEntry child in ent.Children)
      {
        if (child.SchemaClassName.Equals("IIsWebServer", StringComparison.OrdinalIgnoreCase))
        {
          if (child.Properties["ServerBindings"].Value != null)
          {
            object objectArr = child.Properties["ServerBindings"].Value;
            string serverBindingStr = string.Empty;
            if (IsArray(objectArr))//如果有多个绑定站点时
            {
              object[] objectToArr = (object[])objectArr;
              serverBindingStr = objectToArr[0].ToString();
            }
            else//只有一个绑定站点
            {
              serverBindingStr = child.Properties["ServerBindings"].Value.ToString();
            }
            IISInfo iisInfo = new IISInfo();
            iisInfo.DomainPort = serverBindingStr;
            iisInfo.AppPool = child.Properties["AppPoolId"].Value.ToString();//应用程序池
            iisList.Add(iisInfo);
          }
        }
      }
      return iisList;
    }


    public static bool CreateAppPool(string appPoolName, string Username, string Password)
    {
      bool issucess = false;
      try
      {
        //创建一个新程序池
        DirectoryEntry newpool;
        DirectoryEntry apppools = new DirectoryEntry("IIS://" + HostName + "/W3SVC/AppPools");
        newpool = apppools.Children.Add(appPoolName, "IIsApplicationPool");

        //设置属性 访问用户名和密码 一般采取默认方式
        newpool.Properties["WAMUserName"][0] = Username;
        newpool.Properties["WAMUserPass"][0] = Password;
        newpool.Properties["AppPoolIdentityType"][0] = "3";
        newpool.CommitChanges();
        issucess = true;
        return issucess;
      }
      catch // (Exception ex) 
      {
        return false;
      }
    }


    /// <summary>
    /// 建立程序池后关联相应应用程序及虚拟目录
    /// </summary>
    public static void SetAppToPool(string appname,string poolName)
    {
      //获取目录
      DirectoryEntry getdir = new DirectoryEntry("IIS://localhost/W3SVC");
      foreach (DirectoryEntry getentity in getdir.Children)
      {
        if (getentity.SchemaClassName.Equals("IIsWebServer"))
        {
          //设置应用程序程序池 先获得应用程序 在设定应用程序程序池
          //第一次测试根目录
          foreach (DirectoryEntry getchild in getentity.Children)
          {
            if (getchild.SchemaClassName.Equals("IIsWebVirtualDir"))
            {
              //找到指定的虚拟目录.
              foreach (DirectoryEntry getsite in getchild.Children)
              {
                if (getsite.Name.Equals(appname))
                {
                  //【测试成功通过】
                  getsite.Properties["AppPoolId"].Value = poolName;
                  getsite.CommitChanges();
                }
              }
            }
          }
        }
      }
    }


    /// <summary>
    /// 判断object对象是否为数组
    /// </summary>
    public static bool IsArray(object o)
    {
      return o is Array;
    }
  }
}

希望本文所述对大家的C#程序设计有所帮助。

相关文章

  • C#文件和字节流的转换方法

    C#文件和字节流的转换方法

    这篇文章主要介绍了C#文件和字节流的转换方法,涉及C#将文件以字节流形式读取及将字节流写入文件的相关技巧,需要的朋友可以参考下
    2015-05-05
  • C#的Excel导入、导出

    C#的Excel导入、导出

    这篇文章主要为大家详细介绍了C#的Excel导入、导出的相关资料,需要的朋友可以参考下
    2016-05-05
  • c#压缩字符串的方法

    c#压缩字符串的方法

    这篇文章主要介绍了c#压缩字符串的方法,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • C#向无窗口的进程发送消息

    C#向无窗口的进程发送消息

    这篇文章主要介绍了C#向无窗口的进程发送消息 的相关资料,需要的朋友可以参考下
    2016-05-05
  • C#实现的三种模拟自动登录和提交POST信息的方法

    C#实现的三种模拟自动登录和提交POST信息的方法

    这篇文章主要介绍了C#实现的三种模拟自动登录和提交POST信息的方法,分别列举了WebBrowser、WebClient及HttpWebRequest实现自动登录及提交POST的相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • C#实现老板键功能的代码

    C#实现老板键功能的代码

    最近在做项目中遇到需要增加个老板键功能,找一惯的方式,开始从网络下手寻找: 关键字类似”C# 老板键“,一搜,一堆又一堆,然而出来的代码大多数都不是太合适,下面给大家分享下自己的解决方案已经一个网友的解决方案,有需要的小伙伴可以参考下。
    2015-05-05
  • 探究C#访问null字段会抛异常原因

    探究C#访问null字段会抛异常原因

    本文主要介绍了探究C#访问null字段会抛异常原因,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • c#循环左移字符示例

    c#循环左移字符示例

    这篇文章主要介绍了c#循环左移字符示例,需要的朋友可以参考下
    2014-04-04
  • C#基于Sockets类实现TCP通讯

    C#基于Sockets类实现TCP通讯

    这篇文章主要为大家详细介绍了C#基于Sockets类实现TCP通讯,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C#程序窗体间使用回调事件方式通讯示例

    C#程序窗体间使用回调事件方式通讯示例

    C#有事件这个东西,为啥不用呢,而且事件在窗体通信方面,有着更为方便的作用,我们知道事件实际上就是状态的捕获,数据互相操作的例子
    2013-12-12

最新评论