用C#操纵IIS(代码)

所属分类: 软件编程 / C#教程 阅读数: 82
收藏 0 赞 0 分享

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 

更多精彩内容其他人还在看

WPF仿三星手机充电界面实现代码

这篇文章主要为大家详细介绍了WPF仿三星手机充电界面实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

浅谈C#各种数组直接的数据复制/转换

下面小编就为大家带来一篇浅谈C#各种数组直接的数据复制/转换。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

C#访问SQLServer增删改查代码实例

这篇文章主要为大家详细介绍了C#访问SQLServer增删改查代码实例,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C#根据身份证号码判断出生日期和性别

这篇文章主要为大家详细介绍了C#根据身份证号码判断出生日期和性别的方法,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C# 向Word中设置/更改文本方向的方法(两种)

在一般情况下word中输入的文字都是横向的,今天小编给大家带来两种方法来设置更改文本方向的方法,非常不错,对c# word 更改文本方向的知识感兴趣的朋友一起看看吧
收藏 0 赞 0 分享

让C# Excel导入导出 支持不同版本Office

让C# Excel导入导出,支持不同版本的Office,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

C#设置自定义文件图标实现双击启动(修改注册表)

这篇文章介绍的是利用C#设置自定义文件图标,然后实现双击启动的功能,文章给出了示例代码,介绍的很详细,有需要的可以参考借鉴。
收藏 0 赞 0 分享

C#两个相同属性的类赋值方法

这篇文章主要介绍了C#两个相同属性的类赋值方法的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

C#中ListView控件实现窗体代码

这篇文章主要介绍了C#中ListView控件实现窗体的核心代码,非常不错,具有参考借鉴价值,对c#listview相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

浅谈C# 序列化与反序列化几种格式的转换

下面小编就为大家带来一篇浅谈C# 序列化与反序列化几种格式的转换。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多