yzq 发表于 2015-8-13 07:57:24

C#操作IIS类

操作IIS类
1using System;
2using System.DirectoryServices;
3using System.Collections;
4using System.Text.RegularExpressions;
5using System.Text;
6
7namespace Business
8{
9    public class ControlIIS
10    {
11      UserName,Password,HostName的定义#region UserName,Password,HostName的定义
12      public static string HostName
13      {
14            get
15            {
16                return hostName;
17            }
18            set
19            {
20                hostName = value;
21            }
22      }
23      public static string UserName
24      {
25            get
26            {
27                return userName;
28            }
29            set
30            {
31                userName = value;
32            }
33      }
34      public static string Password
35      {
36            get
37            {
38                return password;
39            }
40            set
41            {
42                if (UserName.Length <= 1)
43                {
44                  throw new ArgumentException("还没有指定好用户名。请先指定用户名");
45                }
46                password = value;
47            }
48      }
49      public static void RemoteConfig(string hostName, string userName, string password)
50      {
51            HostName = hostName;
52            UserName = userName;
53            Password = password;
54      }
55      private static string hostName = "localhost";
56      private static string userName = "qf";
57      private static string password = "qinfei";
58      #endregion
59
60      根据路径构造Entry的方法#region 根据路径构造Entry的方法
61      /**//// <summary>
62      /// 根据是否有用户名来判断是否是远程服务器。
63      /// 然后再构造出不同的DirectoryEntry出来
64      /// </summary>
65      /// <param name="entPath">DirectoryEntry的路径</param>
66      /// <returns>返回的是DirectoryEntry实例</returns>
67      public static DirectoryEntry GetDirectoryEntry(string entPath)
68      {
69            DirectoryEntry ent;
70            if (UserName == null)
71            {
72                ent = new DirectoryEntry(entPath);
73            }
74            else
75            {
76                ent = new DirectoryEntry(entPath, HostName + "\\" + UserName, Password, AuthenticationTypes.Secure);
77                //ent = new DirectoryEntry(entPath, UserName, Password, AuthenticationTypes.Secure);
78            }
79            return ent;
80      }
81      #endregion
82
83      添加,删除网站的方法#region 添加,删除网站的方法
84      public static void CreateNewWebSite(string hostIP, string portNum, string descOfWebSite, string commentOfWebSite, string webPath)
85      {
86            if (!EnsureNewSiteEnavaible(hostIP + portNum + descOfWebSite))
87            {
88                throw new ArgumentNullException("已经有了这样的网站了。" + Environment.NewLine + hostIP + portNum + descOfWebSite);
89            }
90
91            string entPath = String.Format("IIS://{0}/w3svc", HostName);
92            DirectoryEntry rootEntry = GetDirectoryEntry(entPath);//取得iis路径
93            string newSiteNum = GetNewWebSiteID(); //取得新网站ID
94            DirectoryEntry newSiteEntry = rootEntry.Children.Add(newSiteNum, "IIsWebServer"); //增加站点
95            newSiteEntry.CommitChanges();//保存对区域的更改(这里对站点的更改)
96            newSiteEntry.Properties["ServerBindings"].Value = hostIP + portNum + descOfWebSite;
97            newSiteEntry.Properties["ServerComment"].Value = commentOfWebSite;
98            newSiteEntry.CommitChanges();
99            DirectoryEntry vdEntry = newSiteEntry.Children.Add("root", "IIsWebVirtualDir");
100            vdEntry.CommitChanges();
101            vdEntry.Properties["Path"].Value = webPath;
102            vdEntry.CommitChanges();
103
104      }
105      /**//// <summary>
106      /// 删除一个网站。根据网站名称删除。
107      /// </summary>
108      /// <param name="siteName">网站名称</param>
109      public static void DeleteWebSiteByName(string siteName)
110      {
111            string siteNum = GetWebSiteNum(siteName);
112            string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);
113            DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);
114            string rootPath = String.Format("IIS://{0}/w3svc", HostName);
115            DirectoryEntry rootEntry = GetDirectoryEntry(rootPath);
116            rootEntry.Children.Remove(siteEntry);
117            rootEntry.CommitChanges();
118      }
119      #endregion
120
121      Start和Stop网站的方法#region Start和Stop网站的方法
122      public static void StartWebSite(string siteName)
123      {
124            string siteNum = GetWebSiteNum(siteName);
125            string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);
126            DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);
127            siteEntry.Invoke("Start", new object[] { });
128      }
129      public static void StopWebSite(string siteName)
130      {
131            string siteNum = GetWebSiteNum(siteName);
132            string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);
133            DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);
134            siteEntry.Invoke("Stop", new object[] { });
135      }
136      #endregion
137
138      确认网站是否相同#region 确认网站是否相同
139      /**//// <summary>
140      /// 确定一个新的网站与现有的网站没有相同的。
141      /// 这样防止将非法的数据存放到IIS里面去
142      /// </summary>
143      /// <param name="bindStr">网站邦定信息</param>
144      /// <returns>真为可以创建,假为不可以创建</returns>
145      public static bool EnsureNewSiteEnavaible(string bindStr)
146      {
147            string entPath = String.Format("IIS://{0}/w3svc", HostName);
148            DirectoryEntry ent = GetDirectoryEntry(entPath);
149            foreach (DirectoryEntry child in ent.Children)
150            {
151                if (child.SchemaClassName == "IIsWebServer")
152                {
153                  if (child.Properties["ServerBindings"].Value != null)
154                  {
155                        if (child.Properties["ServerBindings"].Value.ToString() == bindStr)
156                        {
157                            return false;
158                        }
159                  }
160                }
161            }
162            return true;
163      }
164
165      #endregion
166
167      获取一个网站编号//一个输入参数为站点描述#region 获取一个网站编号//一个输入参数为站点描述
168      /**//// <summary>
169      /// 输入参数为 站点的描述名 默认是站点描述为 "默认网站"
170      /// </summary>
171      /// <param name="siteName">站点描述</param>
172      /// <exception cref="NotFoundWebSiteException">表示没有找到网站</exception>
173      public static string GetWebSiteNum(string siteName)
174      {
175            Regex regex = new Regex(siteName);
176            string tmpStr;
177            string entPath = String.Format("IIS://{0}/w3svc", HostName);
178            DirectoryEntry ent = GetDirectoryEntry(entPath);
179            foreach (DirectoryEntry child in ent.Children)
180            {
181                if (child.SchemaClassName == "IIsWebServer")
182                {
183                  if (child.Properties["ServerBindings"].Value != null)
184                  {
185                        tmpStr = child.Properties["ServerBindings"].Value.ToString();
186                        if (regex.Match(tmpStr).Success)
187                        {
188                            return child.Name;
189                        }
190                  }
191                  if (child.Properties["ServerComment"].Value != null)
192                  {
193                        tmpStr = child.Properties["ServerComment"].Value.ToString();
194                        if (regex.Match(tmpStr).Success)
195                        {
196                            return child.Name;
197                        }
198                  }
199                }
200            }
201            throw new Exception("没有找到我们想要的站点" + siteName);
202      }
203      #endregion
204
205      获取新网站id的方法#region 获取新网站id的方法
206      /**//// <summary>
207      /// 获取网站系统里面可以使用的最小的ID。
208      /// 这是因为每个网站都需要有一个唯一的编号,而且这个编号越小越好。
209      /// 这里面的算法经过了测试是没有问题的。
210      /// </summary>
211      /// <returns>最小的id</returns>
212      public static string GetNewWebSiteID()
213      {
214            ArrayList list = new ArrayList();
215            string tmpStr;
216            string entPath = String.Format("IIS://{0}/w3svc", HostName);
217            DirectoryEntry ent = GetDirectoryEntry(entPath);
218            foreach (DirectoryEntry child in ent.Children)
219            {
220                if (child.SchemaClassName == "IIsWebServer")
221                {
222                  tmpStr = child.Name.ToString();
223                  list.Add(Convert.ToInt32(tmpStr));
224                }
225            }
226            list.Sort();
227            int i = 1;
228            foreach (int j in list)
229            {
230                if (i == j)
231                {
232                  i++;
233                }
234            }
235            return i.ToString();
236      }
237      #endregion
238
239      增加,删除主机头#region 增加,删除主机头
240      /**//// <summary>
241      /// 增加主机头
242      /// </summary>
243      /// <param name="HostName">站点描述</param>
244      /// <param name="ip">ip</param>
245      /// <param name="port">端口</param>
246      /// <param name="domain">域名</param>
247      public static void AddHostHeader(string HostName, string ip, int port, string domain)//增加主机头(站点编号.ip.端口.域名)
248      {
249            DirectoryEntry site = new DirectoryEntry(String.Format("IIS://{0}/w3svc", HostName));
250            PropertyValueCollection serverBindings = site.Properties["ServerBindings"];
251            string headerStr = string.Format("{0}:{1}:{2}", ip, port, domain);
252            if (!serverBindings.Contains(headerStr))
253            {
254                serverBindings.Add(headerStr);
255            }
256            site.CommitChanges();
257      }
258      /**//// <summary>
259      /// 删除主机头
260      /// </summary>
261      /// <param name="HostName">站点描述</param>
262      /// <param name="ip">ip</param>
263      /// <param name="port">端口</param>
264      /// <param name="domain">域名</param>
265      public static void DeleteHostHeader(string HostName, string ip, int port, string domain)//删除主机头(站点编号.ip.端口.域名)
266      {
267            DirectoryEntry site = new DirectoryEntry(String.Format("IIS://{0}/w3svc", HostName));
268            PropertyValueCollection serverBindings = site.Properties["ServerBindings"];
269            string headerStr = string.Format("{0}:{1}:{2}", ip, port, domain);
270            if (serverBindings.Contains(headerStr))
271            {
272                serverBindings.Remove(headerStr);
273            }
274            site.CommitChanges();
275      }
276      #endregion
277
278    }
279}
280
页: [1]
查看完整版本: C#操作IIS类