解决方案 »

  1.   

    using System;using System.DirectoryServices;using System.Collections;using System.Text.RegularExpressions;using System.Text; /** * @author 吴海燕 * @email  [email protected] * 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();         }
      

  2.   


              /// <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}
      

  3.   

    using System; 
      using System.Data; 
      using System.DirectoryServices; 
      using System.Collections; 
      namespace Aspcn.Management 
      { 
      /// <summary> 
      /// IISManager 的摘要说明。 
      /// </summary> 
      public class IISManager 
      { 
      //定义需要使用的 
      private string _server,_website; 
      private VirtualDirectories _virdirs; 
      protected System.DirectoryServices.DirectoryEntry rootfolder; 
      private bool _batchflag; 
      public IISManager() 
      { 
       //默认情况下使用localhost,即访问本地机 
       _server = "localhost"; 
       _website = "1"; 
       _batchflag = false; 
      } 
      public IISManager(string strServer) 
      { 
       _server = strServer; 
       _website = "1"; 
       _batchflag = false; 
      } 
      /// <summary> 
      /// 定义公共属性 
      /// </summary> 
       
      //Server属性定义访问机器的名字,可以是IP与计算名 
      public string Server 
      { 
       get{ return _server;} 
       set{ _server = value;} 
      } 
      //WebSite属性定义,为一数字,为方便,使用string 
      //一般来说第一台主机为1,第二台主机为2,依次类推 
      public string WebSite 
      { 
       get{ return _website; } 
       set{ _website = value; } 
      } 
       
      //虚拟目录的名字 
      public VirtualDirectories VirDirs 
      { 
       get{ return _virdirs; } 
       set{ _virdirs = value;} 
      } 
      ///<summary> 
      ///定义公共方法 
      ///</summary> 
       
      //连接服务器 
      public void Connect() 
      { 
       ConnectToServer(); 
      } 
      //为方便重载 
      public void Connect(string strServer) 
      { 
       _server = strServer; 
       ConnectToServer(); 
      } 
      //为方便重载 
      public void Connect(string strServer,string strWebSite) 
      { 
       _server = strServer; 
       _website = strWebSite; 
       ConnectToServer(); 
      } 
      //判断是否存这个虚拟目录 
      public bool Exists(string strVirdir) 
      { 
       return _virdirs.Contains(strVirdir); 
      } 
      //添加一个虚拟目录 
      public void Create(VirtualDirectory newdir) 
      { 
       string strPath = "IIS://" + _server + "/W3SVC/" + _website + "/ROOT/" + newdir.Name; 
       if(!_virdirs.Contains(newdir.Name) || _batchflag ) 
       { 
       try 
       { 
       //加入到ROOT的Children集合中去 
       DirectoryEntry newVirDir = rootfolder.Children.Add(newdir.Name,"IIsWebVirtualDir"); 
       newVirDir.Invoke("AppCreate",true); 
       newVirDir.CommitChanges(); 
       rootfolder.CommitChanges(); 
       //然后更新数据 
       UpdateDirInfo(newVirDir,newdir); 
       } 
       catch(Exception ee) 
       { 
       throw new Exception(ee.ToString()); 
       } 
       } 
       else 
       { 
       throw new Exception("This virtual directory is already exist."); 
       } 
      } 
      //得到一个虚拟目录 
      

  4.   

    I think the following is useful for u.http://www.cnblogs.com/pw/archive/2006/11/21/567029.html
      

  5.   

    public VirtualDirectory GetVirDir(string strVirdir) 
      { 
       VirtualDirectory tmp = null; 
       if(_virdirs.Contains(strVirdir)) 
       { 
       tmp = _virdirs.Find(strVirdir); 
       ((VirtualDirectory)_virdirs[strVirdir]).flag = 2; 
       } 
       else 
       { 
       throw new Exception("This virtual directory is not exists"); 
       } 
       return tmp; 
      } 
       
      //更新一个虚拟目录 
      public void Update(VirtualDirectory dir) 
      { 
       //判断需要更改的虚拟目录是否存在 
       if(_virdirs.Contains(dir.Name)) 
       { 
       DirectoryEntry ode = rootfolder.Children.Find(dir.Name,"IIsWebVirtualDir"); 
       UpdateDirInfo(ode,dir); 
       } 
       else 
       { 
       throw new Exception("This virtual directory is not exists."); 
       } 
      } 
        
      //删除一个虚拟目录 
      public void Delete(string strVirdir) 
      { 
       if(_virdirs.Contains(strVirdir)) 
       { 
       object[] paras = new object[2]; 
       paras[0] = "IIsWebVirtualDir"; //表示操作的是虚拟目录 
       paras[1] = strVirdir; 
       rootfolder.Invoke("Delete",paras); 
       rootfolder.CommitChanges(); 
       } 
       else 
       { 
       throw new Exception("Can't delete " + strVirdir + ",because it isn't exists."); 
       } 
      } 
      //批量更新 
      public void UpdateBatch() 
      { 
       BatchUpdate(_virdirs); 
      } 
      //重载一个:-) 
      public void UpdateBatch(VirtualDirectories vds) 
      { 
       BatchUpdate(vds); 
      } 
        
      ///<summary> 
      ///私有方法 
      ///</summary> 
       
      //连接服务器 
      private void ConnectToServer() 
      { 
       string strPath = "IIS://" + _server + "/W3SVC/" + _website +"/ROOT"; 
       try 
       { 
       this.rootfolder = new DirectoryEntry(strPath); 
       _virdirs = GetVirDirs(this.rootfolder.Children); 
       } 
       catch(Exception e) 
       { 
       throw new Exception("Can't connect to the server ["+ _server +"] ...",e); 
       } 
      } 
      //执行批量更新 
      private void BatchUpdate(VirtualDirectories vds) 
      { 
       _batchflag = true; 
       foreach(object item in vds.Values) 
       { 
       VirtualDirectory vd = (VirtualDirectory)item; 
       switch(vd.flag) 
       { 
       case 0: 
       break; 
       case 1: 
       Create(vd); 
       break; 
       case 2: 
       Update(vd); 
       break; 
       } 
       } 
       _batchflag = false; 
      } 
      //更新东东 
      private void UpdateDirInfo(DirectoryEntry de,VirtualDirectory vd) 
      { 
       de.Properties["AnonymousUserName"][0] = vd.AnonymousUserName; 
       de.Properties["AnonymousUserPass"][0] = vd.AnonymousUserPass; 
       de.Properties["AccessRead"][0] = vd.AccessRead; 
       de.Properties["AccessExecute"][0] = vd.AccessExecute; 
       de.Properties["AccessWrite"][0] = vd.AccessWrite; 
       de.Properties["AuthBasic"][0] = vd.AuthBasic; 
       de.Properties["AuthNTLM"][0] = vd.AuthNTLM; 
       de.Properties["ContentIndexed"][0] = vd.ContentIndexed; 
       de.Properties["EnableDefaultDoc"][0] = vd.EnableDefaultDoc; 
       de.Properties["EnableDirBrowsing"][0] = vd.EnableDirBrowsing; 
       de.Properties["AccessSSL"][0] = vd.AccessSSL; 
       de.Properties["AccessScript"][0] = vd.AccessScript; 
       de.Properties["DefaultDoc"][0] = vd.DefaultDoc; 
       de.Properties["Path"][0] = vd.Path; 
       de.CommitChanges(); 
      } 
       
      //获取虚拟目录集合 
      private VirtualDirectories GetVirDirs(DirectoryEntries des) 
      { 
       VirtualDirectories tmpdirs = new VirtualDirectories(); 
       foreach(DirectoryEntry de in des) 
       { 
       if(de.SchemaClassName == "IIsWebVirtualDir") 
       { 
       VirtualDirectory vd = new VirtualDirectory(); 
       vd.Name = de.Name; 
       vd.AccessRead = (bool)de.Properties["AccessRead"][0]; 
       vd.AccessExecute = (bool)de.Properties["AccessExecute"][0]; 
       vd.AccessWrite = (bool)de.Properties["AccessWrite"][0]; 
       vd.AnonymousUserName = (string)de.Properties["AnonymousUserName"][0]; 
       vd.AnonymousUserPass = (string)de.Properties["AnonymousUserName"][0]; 
       vd.AuthBasic = (bool)de.Properties["AuthBasic"][0]; 
       vd.AuthNTLM = (bool)de.Properties["AuthNTLM"][0]; 
       vd.ContentIndexed = (bool)de.Properties["ContentIndexed"][0]; 
       vd.EnableDefaultDoc = (bool)de.Properties["EnableDefaultDoc"][0]; 
       vd.EnableDirBrowsing = (bool)de.Properties["EnableDirBrowsing"][0]; 
       vd.AccessSSL = (bool)de.Properties["AccessSSL"][0]; 
       vd.AccessScript = (bool)de.Properties["AccessScript"][0]; 
       vd.Path = (string)de.Properties["Path"][0]; 
       vd.flag = 0; 
       vd.DefaultDoc = (string)de.Properties["DefaultDoc"][0]; 
       tmpdirs.Add(vd.Name,vd); 
       } 
       } 
       return tmpdirs; 
      } 
       
      } 
      

  6.   

    /// <summary> 
      /// VirtualDirectory类 
      /// </summary> 
      public class VirtualDirectory 
      { 
       private bool _read,_execute,_script,_ssl,_write,_authbasic,_authntlm,_indexed,_endirbrow,_endefaultdoc; 
       private string _ausername,_auserpass,_name,_path; 
       private int _flag; 
       private string _defaultdoc; 
       /// <summary> 
       /// 构造函数 
       /// </summary> 
       public VirtualDirectory() 
       { 
       SetValue(); 
       } 
       public VirtualDirectory(string strVirDirName) 
       { 
       _name = strVirDirName; 
       SetValue(); 
       } 
       private void SetValue() 
       { 
       _read = true;_execute = false;_script = false;_ssl= false;_write=false;_authbasic=false;_authntlm=false; 
       _indexed = false;_endirbrow=false;_endefaultdoc = false; 
       _flag = 1; 
       _defaultdoc = "default.htm,default.aspx,default.asp,index.htm"; 
       _path = "C:\\"; 
       _ausername = "";_auserpass ="";_name=""; 
       } 
       ///<summary> 
       ///定义属性,IISVirtualDir太多属性了 
       ///我只搞了比较重要的一些,其它的大伙需要的自个加吧。 
       ///</summary> 
       
       public int flag 
       { 
       get{ return _flag;} 
       set{ _flag = value;} 
       } 
       public bool AccessRead 
       { 
       get{ return _read;} 
       set{ _read = value;} 
       } 
       public bool AccessWrite 
       { 
       get{ return _write;} 
       set{ _write = value;} 
       } 
       public bool AccessExecute 
       { 
       get{ return _execute;} 
       set{ _execute = value;} 
       } 
       public bool AccessSSL 
       { 
       get{ return _ssl;} 
       set{ _ssl = value;} 
       } 
       public bool AccessScript 
       { 
       get{ return _script;} 
       set{ _script = value;} 
       } 
       public bool AuthBasic 
       { 
       get{ return _authbasic;} 
       set{ _authbasic = value;} 
       } 
       public bool AuthNTLM 
       { 
       get{ return _authntlm;} 
       set{ _authntlm = value;} 
       } 
       public bool ContentIndexed 
       { 
       get{ return _indexed;} 
       set{ _indexed = value;} 
       } 
       public bool EnableDirBrowsing 
       { 
       get{ return _endirbrow;} 
       set{ _endirbrow = value;} 
       } 
       public bool EnableDefaultDoc 
       { 
       get{ return _endefaultdoc;} 
       set{ _endefaultdoc = value;} 
       } 
       public string Name 
       { 
       get{ return _name;} 
       set{ _name = value;} 
       } 
       public string Path 
       { 
       get{ return _path;} 
       set{ _path = value;} 
       } 
       public string DefaultDoc 
       { 
       get{ return _defaultdoc;} 
       set{ _defaultdoc = value;} 
       } 
       public string AnonymousUserName 
       { 
       get{ return _ausername;} 
       set{ _ausername = value;} 
       } 
       public string AnonymousUserPass 
       { 
       get{ return _auserpass;} 
       set{ _auserpass = value;} 
       } 
      } 
      /// <summary> 
      /// 集合VirtualDirectories 
      /// </summary> 
       
      public class VirtualDirectories : System.Collections.Hashtable 
      { 
       public VirtualDirectories() 
       { 
       } 
       //添加新的方法 
       public VirtualDirectory Find(string strName) 
       { 
       return (VirtualDirectory)this[strName]; 
       } 
      } 
      }
      

  7.   

    http://www.fqf.cn/detail/281/454281637563.htmlhttp://www.newasp.net/tech/net/9648.html