using System; 
 using System.DirectoryServices; 
 using System.Collections; 
 using System.Text.RegularExpressions; 
 using System.Text; 
  
 namespace Wuhy.ToolBox 
 { 
      /**  
      ///  这个类是静态类。用来实现管理IIS的基本操作。 
      ///  管理IIS有两种方式,一是ADSI,一是WMI。由于系统限制的原因,只好选择使用ADSI实现功能。 
      ///  这是一个遗憾。只有等到只有使用IIS 6的时候,才有可能使用WMI来管理系统 
      ///  不过有一个问题就是,我现在也觉得这样的一个方法在本地执行会比较的好。最好不要远程执行。 
      ///  因为那样需要占用相当数量的带宽,即使要远程执行,也是推荐在同一个网段里面执行 
      ///  
      public class IISAdminLib 
      { 
           UserName,Password,HostName的定义#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 
  
   
  
           根据路径构造Entry的方法#region 根据路径构造Entry的方法 
  
          /**  
  
          ///  根据是否有用户名来判断是否是远程服务器。 
  
          ///  然后再构造出不同的DirectoryEntry出来 
  
          ///  
  
          /// DirectoryEntry的路径 
  
          /// 返回的是DirectoryEntry实例 
  
          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 添加,删除网站的方法 
  
          /**  
  
          ///  创建一个新的网站。根据传过来的信息进行配置 
  
          ///  
  
          /// 存储的是新网站的信息 
  
          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(); 
  
          } 
  
   
  
          /**  
  
          ///  删除一个网站。根据网站名称删除。 
  
          ///  
  
          /// 网站名称 
  
          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 
  
   
  
           Start和Stop网站的方法#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 确认网站是否相同 
  
          /**  
  
          ///  确定一个新的网站与现有的网站没有相同的。 
  
          ///  这样防止将非法的数据存放到IIS里面去 
  
          ///  
  
          /// 网站邦定信息 
  
          /// 真为可以创建,假为不可以创建 
  
          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 获取一个网站编号的方法 
  
          /**  
  
          ///  获取一个网站的编号。根据网站的ServerBindings或者ServerComment来确定网站编号 
  
          ///  
  
          ///  
  
          /// 返回网站的编号 
  
          /// 表示没有找到网站 
  
          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 ; 
  
                             } 
  
                        } 
  
   
  
                         if(child.Properties["ServerComment"].Value != null) 
  
                        { 
  
                             tmpStr = child.Properties["ServerComment"].Value.ToString(); 
  
                             if(regex.Match(tmpStr).Success) 
  
                             { 
  
                                  return ; 
  
                             } 
  
                        } 
  
                    } 
  
               } 
  
   
  
               throw new NotFoundWebSiteException("没有找到我们想要的站点" + siteName); 
  
          } 
  
           #endregion 
  
   
  
           获取新网站id的方法#region 获取新网站id的方法 
  
          /**  
  
          ///  获取网站系统里面可以使用的最小的ID。 
  
          ///  这是因为每个网站都需要有一个唯一的编号,而且这个编号越小越好。 
  
          ///  这里面的算法经过了测试是没有问题的。 
  
          ///  
  
          /// 最小的id 
  
          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 = .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#操纵IIS
原创
             ©著作权归作者所有:来自51CTO博客作者biyusr216的原创作品,请联系作者获取转载授权,否则将追究法律责任        
            上一篇:在计算机屏幕上画图
 
            
        
                提问和评论都可以,用心的回复会被更多人看到
                评论
            
            
                    发布评论
                
            
            相关文章
        
        
- 
                    如何用C#编程修改系统菜单?控件一般都用 Control.ContextMenu 得到上下文菜单,窗体用 Form.Menu 获得主菜单,但没有 SystemMenu 或是其它的属性 c# 开发语言 Windows System 构造函数
- 
                    C#多线程学习(二) 如何操纵一个线程下面我们就动手来创建一个线程,使用Thread类创建线程时,只需提供线程入口即可。(线程入口使程序知道该让这个线程干什 c# 多线程 thread application class
 
 
                    













 
                    

 
                 
                    