當(dāng)前位置:首頁>>開發(fā)編程>>VS.NET>>新聞內(nèi)容
用C#操縱IIS(代碼)
作者:佚名 發(fā)布時間: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>

     ///  這個類是靜態(tài)類。用來實現(xiàn)管理IIS的基本操作。

     ///  管理IIS有兩種方式,一是ADSI,一是WMI。由于系統(tǒng)限制的原因,只好選擇使用ADSI實現(xiàn)功能。

     ///  這是一個遺憾。只有等到只有使用IIS 6的時候,才有可能使用WMI來管理系統(tǒng)

     ///  不過有一個問題就是,我現(xiàn)在也覺得這樣的一個方法在本地執(zhí)行會比較的好。最好不要遠(yuǎn)程執(zhí)行。

     ///  因為那樣需要占用相當(dāng)數(shù)量的帶寬,即使要遠(yuǎn)程執(zhí)行,也是推薦在同一個網(wǎng)段里面執(zhí)行

     /// </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 根據(jù)路徑構(gòu)造Entry的方法

         /// <summary>

         ///  根據(jù)是否有用戶名來判斷是否是遠(yuǎn)程服務(wù)器。

         ///  然后再構(gòu)造出不同的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 添加,刪除網(wǎng)站的方法

         /// <summary>

         ///  創(chuàng)建一個新的網(wǎng)站。根據(jù)傳過來的信息進(jìn)行配置

         /// </summary>

         /// <param name="siteInfo">存儲的是新網(wǎng)站的信息</param>

         public static void CreateNewWebSite(NewWebSiteInfo siteInfo)

         {

              if(! EnsureNewSiteEnavaible(siteInfo.BindString))

              {

                   throw new DuplicatedWebSiteException("已經(jīng)有了這樣的網(wǎng)站了。" + 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>

         ///  刪除一個網(wǎng)站。根據(jù)網(wǎng)站名稱刪除。

         /// </summary>

         /// <param name="siteName">網(wǎng)站名稱</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網(wǎng)站的方法

         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 確認(rèn)網(wǎng)站是否相同

         /// <summary>

         ///  確定一個新的網(wǎng)站與現(xiàn)有的網(wǎng)站沒有相同的。

         ///  這樣防止將非法的數(shù)據(jù)存放到IIS里面去

         /// </summary>

         /// <param name="bindStr">網(wǎng)站邦定信息</param>

         /// <returns>真為可以創(chuàng)建,假為不可以創(chuàng)建</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 獲取一個網(wǎng)站編號的方法

         /// <summary>

         ///  獲取一個網(wǎng)站的編號。根據(jù)網(wǎng)站的ServerBindings或者ServerComment來確定網(wǎng)站編號

         /// </summary>

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

         /// <returns>返回網(wǎng)站的編號</returns>

         /// <exception cref="NotFoundWebSiteException">表示沒有找到網(wǎng)站</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 獲取新網(wǎng)站id的方法

         /// <summary>

         ///  獲取網(wǎng)站系統(tǒng)里面可以使用的最小的ID。

         ///  這是因為每個網(wǎng)站都需要有一個唯一的編號,而且這個編號越小越好。

         ///  這里面的算法經(jīng)過了測試是沒有問題的。

         /// </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 新網(wǎng)站信息結(jié)構(gòu)體

     public struct NewWebSiteInfo

     {

          private string hostIP;   // The Hosts IP Address

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

          private string descOfWebSite; // 網(wǎng)站表示。一般為網(wǎng)站的網(wǎng)站名。例如"www.dns.com.cn"

          private string commentOfWebSite;// 網(wǎng)站注釋。一般也為網(wǎng)站的網(wǎng)站名。

          private string webPath;   // 網(wǎng)站的主目錄。例如"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開發(fā)中Windows Mobile
·PC機(jī)和移動設(shè)備上絕對路徑的
·C#程序加殼的方法(使用Sixx
·當(dāng)前上下文中不存在名稱Conf
·請插入磁盤:Visual Studio 2
·用VS.NET讀取Flash格式文件信
·在ASP.NET中使用AJAX的簡單方
·VS.NET 2005中常用的一些代碼
·安裝VS.NET 2005 SP1補(bǔ)丁全攻
相關(guān)信息
·C#中使用Split分隔字符串的技巧
·PC機(jī)和移動設(shè)備上絕對路徑的獲取(C#)
·C#程序加殼的方法(使用Sixxpack)
·當(dāng)前上下文中不存在名稱ConfigurationManager的解決方法
·C#的支付寶Payto接口代碼
·C#實現(xiàn)窗口最小化到系統(tǒng)托盤
·解密QQ的MsgEx.db消息文件格式
·QQ的TEA填充算法C#實現(xiàn)
·C#用Guid獲取不規(guī)則的唯一值(標(biāo)識)
·基于Windows Mobile 5.0的掌上天氣預(yù)報設(shè)計
畫心
愚愛
偏愛
火苗
白狐
畫沙
犯錯
歌曲
傳奇
稻香
小酒窩
獅子座
小情歌
全是愛
棉花糖
海豚音
我相信
甩蔥歌
這叫愛
shero
走天涯
琉璃月
Nobody
我愛他
套馬桿
愛是你我
最后一次
少女時代
灰色頭像
斷橋殘雪
美了美了
狼的誘惑
我很快樂
星月神話
心痛2009
愛丫愛丫
半城煙沙
旗開得勝
郎的誘惑
愛情買賣
2010等你來
我叫小沈陽
i miss you
姑娘我愛你
我們都一樣
其實很寂寞
我愛雨夜花
變心的玫瑰
犀利哥之歌
你是我的眼
你是我的OK繃
貝多芬的悲傷
哥只是個傳說
丟了幸福的豬
找個人來愛我
要嫁就嫁灰太狼
如果這就是愛情
我們沒有在一起
寂寞在唱什么歌
斯琴高麗的傷心
別在我離開之前離開
不是因為寂寞才想你
愛上你等于愛上了錯
在心里從此永遠(yuǎn)有個你
一個人的寂寞兩個人的錯