设为首页 收藏本站
查看: 651|回复: 0

[经验分享] 用C#操纵IIS(代码)

[复制链接]

尚未签到

发表于 2017-2-11 13:06:31 | 显示全部楼层 |阅读模式
using System;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

using System.DirectoryServices;

using System.Collections;

using System.Text.RegularExpressions;

using System.Text;


/**

* @author 吴海燕

* @email wuhy80-usual@yahoo.com

* 2004-6-25 第一版

*/

namespace Wuhy.ToolBox

{

/// <summary>

/// 这个类是静态类。用来实现管理IIS的基本操作。

/// 管理IIS有两种方式,一是ADSI,一是WMI。由于系统限制的原因,只好选择使用ADSI实现功能。

/// 这是一个遗憾。只有等到只有使用IIS 6的时候,才有可能使用WMI来管理系统

/// 不过有一个问题就是,我现在也觉得这样的一个方法在本地执行会比较的好。最好不要远程执行。

/// 因为那样需要占用相当数量的带宽,即使要远程执行,也是推荐在同一个网段里面执行

/// </summary>

public class IISAdminLib

{

  #region UserName,Password,HostName的定义

public static string HostName

{

  get

{

  return hostName;

}

  set

{

  hostName = value;

}

}


public static string UserName

{

  get

{

  return userName;

}

  set

{

  userName = value;

}

}


public static string Password

{

  get

{

  return password;

}

  set

{

  if(UserName.Length <= 1)

  {

  throw new ArgumentException("还没有指定好用户名。请先指定用户名");

  }


  password = value;

}

}


public static void RemoteConfig(string hostName, string userName, string password)

{

  HostName = hostName;

  UserName = userName;

  Password = password;

}


  private static string hostName = "localhost";

  private static string userName;

  private static string password;

  #endregion


  #region 根据路径构造Entry的方法

/// <summary>

/// 根据是否有用户名来判断是否是远程服务器。

/// 然后再构造出不同的DirectoryEntry出来

/// </summary>

/// <param name="entPath">DirectoryEntry的路径</param>

/// <returns>返回的是DirectoryEntry实例</returns>

public static DirectoryEntry GetDirectoryEntry(string entPath)

{

  DirectoryEntry ent;


  if(UserName == null)

{

  ent = new DirectoryEntry(entPath);

}

  else

{

  // ent = new DirectoryEntry(entPath, HostName+"\\"+UserName, Password, AuthenticationTypes.Secure);

  ent = new DirectoryEntry(entPath, UserName, Password, AuthenticationTypes.Secure);

}


  return ent;

}

  #endregion


  #region 添加,删除网站的方法

/// <summary>

/// 创建一个新的网站。根据传过来的信息进行配置

/// </summary>

/// <param name="siteInfo">存储的是新网站的信息</param>

public static void CreateNewWebSite(NewWebSiteInfo siteInfo)

{

  if(! EnsureNewSiteEnavaible(siteInfo.BindString))

{

  throw new DuplicatedWebSiteException("已经有了这样的网站了。" + Environment.NewLine + siteInfo.BindString);

}


  string entPath = String.Format("IIS://{0}/w3svc", HostName);

  DirectoryEntry rootEntry = GetDirectoryEntry(entPath);


  string newSiteNum = GetNewWebSiteID();

  DirectoryEntry newSiteEntry = rootEntry.Children.Add(newSiteNum, "IIsWebServer");

  newSiteEntry.CommitChanges();


  newSiteEntry.Properties["ServerBindings"].Value = siteInfo.BindString;

  newSiteEntry.Properties["ServerComment"].Value = siteInfo.CommentOfWebSite;

  newSiteEntry.CommitChanges();


  DirectoryEntry vdEntry = newSiteEntry.Children.Add("root", "IIsWebVirtualDir");

  vdEntry.CommitChanges();


  vdEntry.Properties["Path"].Value = siteInfo.WebPath;

  vdEntry.CommitChanges();

}


/// <summary>

/// 删除一个网站。根据网站名称删除。

/// </summary>

/// <param name="siteName">网站名称</param>

public static void DeleteWebSiteByName(string siteName)

{

  string siteNum = GetWebSiteNum(siteName);

  string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);

  DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);


  string rootPath = String.Format("IIS://{0}/w3svc", HostName);

  DirectoryEntry rootEntry = GetDirectoryEntry(rootPath);


  rootEntry.Children.Remove(siteEntry);

  rootEntry.CommitChanges();

}

  #endregion


  #region Start和Stop网站的方法

public static void StartWebSite(string siteName)

{

  string siteNum = GetWebSiteNum(siteName);

  string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);

  DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);


  siteEntry.Invoke("Start", new object[] {});

}


public static void StopWebSite(string siteName)

{

  string siteNum = GetWebSiteNum(siteName);

  string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);

  DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);


  siteEntry.Invoke("Stop", new object[] {});

}

  #endregion


  #region 确认网站是否相同

/// <summary>

/// 确定一个新的网站与现有的网站没有相同的。

/// 这样防止将非法的数据存放到IIS里面去

/// </summary>

/// <param name="bindStr">网站邦定信息</param>

/// <returns>真为可以创建,假为不可以创建</returns>

public static bool EnsureNewSiteEnavaible(string bindStr)

{

  string entPath = String.Format("IIS://{0}/w3svc", HostName);

  DirectoryEntry ent = GetDirectoryEntry(entPath);


  foreach(DirectoryEntry child in ent.Children)

{

  if(child.SchemaClassName == "IIsWebServer")

  {

   if(child.Properties["ServerBindings"].Value != null)

  {

   if(child.Properties["ServerBindings"].Value.ToString() == bindStr)

  {

   return false;

  }

  }

  }

}


  return true;

}

  #endregion


  #region 获取一个网站编号的方法

/// <summary>

/// 获取一个网站的编号。根据网站的ServerBindings或者ServerComment来确定网站编号

/// </summary>

/// <param name="siteName"></param>

/// <returns>返回网站的编号</returns>

/// <exception cref="NotFoundWebSiteException">表示没有找到网站</exception>

public static string GetWebSiteNum(string siteName)

{

  Regex regex = new Regex(siteName);

  string tmpStr;


  string entPath = String.Format("IIS://{0}/w3svc", HostName);

  DirectoryEntry ent = GetDirectoryEntry(entPath);


  foreach(DirectoryEntry child in ent.Children)

{

  if(child.SchemaClassName == "IIsWebServer")

  {

   if(child.Properties["ServerBindings"].Value != null)

  {

   tmpStr = child.Properties["ServerBindings"].Value.ToString();

   if(regex.Match(tmpStr).Success)

  {

   return child.Name;

  }

  }


   if(child.Properties["ServerComment"].Value != null)

  {

   tmpStr = child.Properties["ServerComment"].Value.ToString();

   if(regex.Match(tmpStr).Success)

  {

   return child.Name;

  }

  }

  }

}


  throw new NotFoundWebSiteException("没有找到我们想要的站点" + siteName);

}

  #endregion


  #region 获取新网站id的方法

/// <summary>

/// 获取网站系统里面可以使用的最小的ID。

/// 这是因为每个网站都需要有一个唯一的编号,而且这个编号越小越好。

/// 这里面的算法经过了测试是没有问题的。

/// </summary>

/// <returns>最小的id</returns>

public static string GetNewWebSiteID()

{

  ArrayList list = new ArrayList();

  string tmpStr;


  string entPath = String.Format("IIS://{0}/w3svc", HostName);

  DirectoryEntry ent = GetDirectoryEntry(entPath);


  foreach(DirectoryEntry child in ent.Children)

{

  if(child.SchemaClassName == "IIsWebServer")

  {

  tmpStr = child.Name.ToString();

   list.Add(Convert.ToInt32(tmpStr));

  }

}


  list.Sort();


  int i = 1;

  foreach(int j in list)

{

  if(i == j)

  {

  i++;

  }

}


  return i.ToString();

}

  #endregion

}


#region 新网站信息结构体

public struct NewWebSiteInfo

{

  private string hostIP; // The Hosts IP Address

  private string portNum; // The New Web Sites Port.generally is "80"

  private string descOfWebSite; // 网站表示。一般为网站的网站名。例如"www.dns.com.cn"

  private string commentOfWebSite;// 网站注释。一般也为网站的网站名。

  private string webPath; // 网站的主目录。例如"e:\tmp"


public NewWebSiteInfo(string hostIP, string portNum, string descOfWebSite, string commentOfWebSite, string webPath)

{

  this.hostIP = hostIP;


  <span s

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-340659-1-1.html 上篇帖子: IIS配置支持.NET 下篇帖子: iis下手动配置php
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表