天天看點

操作IIS的應用程式池與站點配置設定(C#)

一個應用程式池可以有多個站點,一個站點隻對應一個應用程式池。

程式設計由來:

       存放在一個應用程式池裡的站點過多就不便于操作,是以需把其中一些站點配置設定到其他程式池中。

程式設計題目:

      使用者輸入一個數字或者一個數字+一個名字。程式對站點的所在應用程式池進行統計,使用者輸入的數字用于限制應用程式池裡面的最大容量數,如果超出該容量,将把超出的站點配置設定到其他程式應用池,或者建立的一個應用程式池,把站點配置設定進去。

如果使用者輸入一個數字的情況,将周遊所有程式應用池;如果使用者輸入一個數字+一個名字的情況,将隻對該名字的應用程式池進行操作;如果站點的名字和應用程式池的名字一樣,将不進行操作。

條件:

一、把DefautlAppPool應用程式池或者含有字元"AppPool #"的應用程式池裡面的超出的站點配置設定到AppPool #?應用程式池中("?"代表數字)

二、如果aspnet1應用程式池裡面的網站數超出使用者限制的數字,則配置設定到建立應用程式池的命名方式為aspnet1-?;("?"代表數字,表示從屬aspnet1下的分支)

三、如二設定aspnet2,aspnet3,aspnet4應用程式池

四、當網站名字和應用程式池的名字相同時,将不進行操作

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

這是我在公司裡面的任務,以下是我公開的代碼(還不屬于最優化的代碼,我把我的制作品拿出來以代表原創性,最優化的代碼暫時不公布,如有需要,請聯系部落客!)

建立一個控制台應用程式(C#程式設計語言,使用vs2005版本制作)

添加引用:System.DirectoryServices

class Program

   {

       static Hashtable hs = new Hashtable();//建立哈希表,儲存池中的站點

       static string[] pls;//池數組

       static string[] nums;//應用程式池中各自包含的網站數量

       static Hashtable boolhs = new Hashtable();//建立哈希表,儲存池中站點數量是否滿

       static void Main(string[] args)

       {

           string strNum = Console.ReadLine();//使用者輸入資訊

           pls = GetApplicationPools();//擷取應用程式池名稱數組    

           foreach (string i in pls)//填充哈希表key值内容

           {

               hs.Add(i, "");

               boolhs.Add(i, "false");

           }

           getpoolweb();

           WebNums();

           if (strNum.Length > 1)//判斷使用者輸入的數字+名稱

               string[] pw = strNum.Split(' ');

               for (int i = 0; i < pls.Length; i++)

               {

                   if (pls[i] == pw[1])

                   {

                       if (int.Parse(nums[i]) > int.Parse(pw[0]))

                       {

                           boolhs[pls[i]] = "true";//将該池定義站點數量已滿

                           GetName(pw[1], int.Parse(pw[0]), int.Parse(nums[i]));

                           Console.WriteLine("編譯完畢!");

                       }

                       else Console.WriteLine("該"+pw[1].ToString()+"應用程式池不需進行操作!");

                   }

               }

           else//判斷使用者輸入的數字

                   if (int.Parse(nums[i]) > int.Parse(strNum))//如果超出

                       boolhs[pls[i]] = "true";//将該池定義站點數量已滿

                       GetName(pls[i], int.Parse(strNum), int.Parse(nums[i]));

                       Console.WriteLine("編譯完畢!");

           Console.ReadLine();

       }

       /// <summary>

       /// 判斷網站名與應用程式池名稱是否相等

       /// </summary>

       /// <param name="wnames">網站名稱</param>

       /// <returns>相等為假</returns>

       public static bool chname(string wnames)

           bool ctf = true;

           foreach (string i in pls)

               if (wnames == i)

                   ctf = false;

               else ctf = true;

           return ctf;

       /// 獲得池數組對應的網站數量

       static void WebNums()

           List<string> weblist = new List<string>();

           //string[] poolns = pooln.Split(',');

               if (hs[i].ToString() != "")

                   weblist.Add(hs[i].ToString().Split(',').Length.ToString());

               else

                   weblist.Add("0");

           nums = weblist.ToArray();

       ///<summary>

       ///檢測應用程式池的名稱

       ///</summary>

       ///<param name="AppPoolName">應用程式池的名稱</param>

       ///<param name="c">指定的限制數</param>

       ///<param name="inn">該池中網站的數量</param>

       ///<returns></returns>

       static void GetName(string AppPoolName, int c, int inn)

           int si = inn - c;//舊池中站點剩餘量

           string[] kt = hs[AppPoolName].ToString().Split(',');

           while (true)

               int ting = 0;

               foreach (string w in pls)

                   if (boolhs[w].ToString() == "true")

                       ting += 1;

               if (ting >= pls.Length) break;

                   if (boolhs[pls[i]].ToString() == "false")//如果哪個池的站點量可以容納

                   {                      

                       int d = c - int.Parse(nums[i]);

                       if (si < c)

                           for (int j = 0; j < si; j++)

                              if (chname(kt[j]))//判斷名稱是否存在

                                 movepool(kt[j], AppPoolName, pls[i]);//轉移站點

                       else

                           for (int j = 0; j < d; j++)

                               if (chname(kt[j]))

                                   movepool(kt[j], AppPoolName, pls[i]);

                       if (si-d < 0) break;

                       si = si - d;

                       boolhs[pls[i]] = "true";

           //需要建立的情況

           if(si>0)

               int sy = int.Parse(Math.Ceiling((double)si / (double)c).ToString());//建立多少個

               for (int j = 1; j <= sy; j++)

                   string ne = "";

                   bool bname = false;

                   int s = 1;

                   while (bname == false)

                       if (AppPoolName.StartsWith("aspnet")) ne = AppPoolName + "-" + s;

                       else if (AppPoolName.StartsWith("DefaultAppPool") && AppPoolName.StartsWith("AppPool #")) ne = AppPoolName + s;

                       bool bne = false;//判斷名稱是否存在

                       foreach (string n in pls)

                           if (n == ne)

                           {

                               bne = true;

                               break;

                           }

                       if (bne == true)

                           s += 1;

                       else bname = true;

                   AddAppPool(ne);//建立池

                   for (int i = 0; i < c ; i++)

                       if (i < si)

                           if (chname(kt[i]))//判斷名稱是否存在

                               movepool(kt[i], AppPoolName, ne);//轉移站點

                       //if (si < c)

                       //{

                       //    for (int j = 0; j < si; j++)

                       //        movepool(kt[j], AppPoolName, pls[i]);

                       //}

                       //else

                       //    for (int j = 0; j < d; j++)

                   si = si - c;

       #region 池與網站的操作(獲得所有池;獲得指定池的網站名稱;移動網站到新池)

       /// 擷取應用程式池->數組

       /// <returns></returns>

       public static string[] GetApplicationPools()

           DirectoryEntry directoryEntry = new DirectoryEntry("IIS://LOCALHOST/W3SVC/AppPools");

           if (directoryEntry == null) return null;

           List<string> list = new List<string>();

           foreach (DirectoryEntry entry2 in directoryEntry.Children)

               PropertyCollection properties = entry2.Properties;

               list.Add(entry2.Name.ToString().Trim());

           return list.ToArray();

       /// 獲得所有的應用程式池和對應站點

       static void getpoolweb()

           DirectoryEntry root = null;

           try

               root = new DirectoryEntry("IIS://localhost/W3SVC");

           catch

               return;

           foreach (DirectoryEntry website in root.Children)

               try

                   if (website.SchemaClassName != "IIsWebServer") continue;

                   string comment = website.Properties["ServerComment"][0].ToString();

                   DirectoryEntry siteVDir = website.Children.Find("Root", "IISWebVirtualDir");

                   string poolname = "";

                   try

                       poolname = siteVDir.Properties["AppPoolId"][0].ToString().Trim();

                   catch (Exception ex)

                       Console.WriteLine(ex.Message);

                   if (poolname == "")

                       try

                           poolname = website.Properties["AppPoolId"][0].ToString().Trim();

                       catch (Exception ex)

                           Console.WriteLine(ex.Message);

                   //if (pooln == "") pooln = poolname;

                   //else pooln += "," + poolname;

                   //string[] poolns = pooln.Split(',');

                   foreach (string i in pls)

                       if (i == poolname)

                           if (hs[i].ToString() == "")

                               hs[i] = comment;

                           else hs[i] += "," + comment;

               catch (Exception ex)

                   Console.WriteLine(ex.Message);

           root.Close();

       /// 建立池

       /// <param name="AppPoolName">應用程式池名稱</param>

       public static DirectoryEntry AddAppPool(string AppPoolName)

               DirectoryEntry appPool = new DirectoryEntry("IIS://localhost/W3SVC/AppPools");

               DirectoryEntry findPool = null;

                   findPool = appPool.Children.Find(AppPoolName, "IIsApplicationPool");

               catch (Exception) { }

               if (findPool == null)

                   findPool = appPool.Children.Add(AppPoolName, "IIsApplicationPool");

                   findPool.CommitChanges();

                   appPool.CommitChanges();

               //pooln += "," + AppPoolName;

               List<string> a = new List<string>();

               foreach (string b in pls)

                   a.Add(b);

               a.Add(AppPoolName);

               pls = a.ToArray();//添加新池到數組中

               WebNums();

               boolhs.Add(AppPoolName, "false");

               return findPool;

           catch (Exception ex)

               Console.WriteLine(ex.Message);

               return null;

       /// 移動網站到新池

       /// <param name="webns">網站名稱</param>

       /// <param name="poolold">舊池名稱</param>

       /// <param name="poolns">新池名稱</param>

       static void movepool(string webns,string poolold, string poolns)

               DirectoryEntry root = new DirectoryEntry("IIS://localhost/W3SVC");

               foreach (DirectoryEntry website in root.Children)

                   if (comment == webns)

                       DirectoryEntry siteVDir = website.Children.Find("Root", "IISWebVirtualDir");

                       siteVDir.Invoke("Put", new object[2] { "AppPoolId", poolns });

                       siteVDir.CommitChanges();

                       website.Invoke("Put", new object[2] { "AppPoolId", poolns });

                       website.CommitChanges();

               for (int i = 0; i < pls.Length; i++)//周遊舊池并修改原數目數組的資料

                   if (pls[i] == poolold)

                       nums[i] = (int.Parse(nums[i]) - 1).ToString();

                       string[] h = hs[poolold].ToString().Split(',');

                       string hnew = "";

                       foreach (string s in h)

                           if (s != webns)

                               if (hnew == "")

                                   hnew = s;

                               else hnew += "," + s;

                       hs[poolold] = hnew;

                       if (hs[poolns].ToString() == "") hs[poolns] = webns;

                       else hs[poolns] += "," + webns;

                   if (pls[i] == poolns)

                       WebNums();

                       nums[i] = (int.Parse(nums[i]) + 1).ToString();

繼續閱讀