当前位置:首页>>开发编程>>VS.NET>>新闻内容
用C#操纵IIS(代码)
作者:佚名 发布时间:2004-10-4 9:31:29 文章来源:iwebsms的Blog

using System;

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;

              this.portNum = portNum;

              this.descOfWebSite = descOfWebSite;

              this.commentOfWebSite = commentOfWebSite;

              this.webPath = webPath;

         }

 

         public string BindString

         {

              get

              {

                   return String.Format("{0}:{1}:{2}", hostIP, portNum, descOfWebSite);

              }

         }

 

         public string CommentOfWebSite

         {

              get

              {

                   return commentOfWebSite;

              }

         }

 

         public string WebPath

         {

              get

              {

                   return webPath;

              }

         }

     }

     #endregion

}

 


最新更新
·C#中使用Split分隔字符串的技
·VS2008开发中Windows Mobile
·PC机和移动设备上绝对路径的
·C#程序加壳的方法(使用Sixx
·当前上下文中不存在名称Conf
·请插入磁盘:Visual Studio 2
·用VS.NET读取Flash格式文件信
·在ASP.NET中使用AJAX的简单方
·VS.NET 2005中常用的一些代码
·安装VS.NET 2005 SP1补丁全攻
相关信息
·C#中使用Split分隔字符串的技巧
·PC机和移动设备上绝对路径的获取(C#)
·C#程序加壳的方法(使用Sixxpack)
·当前上下文中不存在名称ConfigurationManager的解决方法
·C#的支付宝Payto接口代码
·C#实现窗口最小化到系统托盘
·解密QQ的MsgEx.db消息文件格式
·QQ的TEA填充算法C#实现
·C#用Guid获取不规则的唯一值(标识)
·基于Windows Mobile 5.0的掌上天气预报设计
画心
愚爱
偏爱
火苗
白狐
画沙
犯错
歌曲
传奇
稻香
小酒窝
狮子座
小情歌
全是爱
棉花糖
海豚音
我相信
甩葱歌
这叫爱
shero
走天涯
琉璃月
Nobody
我爱他
套马杆
爱是你我
最后一次
少女时代
灰色头像
断桥残雪
美了美了
狼的诱惑
我很快乐
星月神话
心痛2009
爱丫爱丫
半城烟沙
旗开得胜
郎的诱惑
爱情买卖
2010等你来
我叫小沈阳
i miss you
姑娘我爱你
我们都一样
其实很寂寞
我爱雨夜花
变心的玫瑰
犀利哥之歌
你是我的眼
你是我的OK绷
贝多芬的悲伤
哥只是个传说
丢了幸福的猪
找个人来爱我
要嫁就嫁灰太狼
如果这就是爱情
我们没有在一起
寂寞在唱什么歌
斯琴高丽的伤心
别在我离开之前离开
不是因为寂寞才想你
爱上你等于爱上了错
在心里从此永远有个你
一个人的寂寞两个人的错