bdjhx 发表于 2017-2-12 09:19:50

Asp.Net IIS 管理类(全)

1using System;
2using System.Collections.Generic;
3using System.Text;
4
5using System;
6using System.Data;
7using System.DirectoryServices;
8using System.Collections;
9
10namespace IISManage
11{
12    /**////<summary>
13    /// IIS管理类,可以实现创建站点、虚拟目录,删除虚拟目录等 ///
14    /// </summary>
15    public class IISManager
16    {
17
18      private string _server, _website, _AnonymousUserPass, _AnonymousUserName;
19      private VirtualDirectories _virdirs;
20      protected System.DirectoryServices.DirectoryEntry rootfolder;
21      private bool _batchflag;
22
23
24      构造函数#region 构造函数
25      /**//// <summary>
26      /// 构造函数///
27      /// </summary>
28      public IISManager()
29      {
30            //默认情况下使用localhost,即访问本地机   
31            _server = "localhost"; _website = "1"; _batchflag = false;
32      }
33
34
35      /**//// <summary>
36      /// 构造函数
37      /// </summary>
38      /// <param name="strServer">服务器</param>
39      public IISManager(string strServer)
40      {
41            _server = strServer;
42            _website = "1"; _batchflag = false;
43      }
44
45
46      /**//// <summary>
47      /// 构造函数
48      /// </summary>
49      /// <param name="strServer">服务器</param>
50      /// <param name="website">站点,每一个站点为1,第二个站点为2,依此类推</param>
51      public IISManager(string strServer, int website)
52      {
53            _server = strServer;
54            _website = website.ToString();
55            _batchflag = false;
56      }
57      #endregion    #region 定义公共属性
58
59
60      /**//// <summary>
61      /// 匿名访问用户
62      /// </summary>
63      public string AnonymousUserName
64      {
65            get { return _AnonymousUserName; }
66            set { _AnonymousUserName = value; }
67      }
68
69
70      /**//// <summary>
71      /// 匿名访问用户密码
72      /// </summary>
73      public string AnonymousUserPass
74      {
75            get { return _AnonymousUserPass; }
76            set { _AnonymousUserPass = value; }
77      }
78
79
80      /**//// <summary>
81      /// 服务器,可以是IP或计算名
82      /// </summary>
83      public string Server
84      {
85            get { return _server; }
86            set { _server = value; }
87      }
88
89      /**//// <summary>
90      /// 站点,一般来说第一台主机为1,第二台主机为2,依次类推
91      /// </summary>
92      public int WebSite
93      {
94            get { return Convert.ToInt32(_website); }
95            set { _website = Convert.ToString(value); }
96      }
97
98
99      /**//// <summary>
100      /// 虚拟目录的名字
101      /// </summary>
102      public VirtualDirectories VirDirs
103      {
104            get { return _virdirs; }
105            set { _virdirs = value; }
106      }
107
108
109
110      定义公共方法#region 定义公共方法
111      /**//// <summary>
112      /// 获取匿名访问用户的用户名和密码
113      /// </summary>
114      public void get_AnonymousUser()
115      {
116            _AnonymousUserPass = "IUSR_DEVE-SERVER";
117            _AnonymousUserName = "IUSR_DEVE-SERVER";
118            VirtualDirectory vDir;
119            try
120            {
121                Hashtable myList = (Hashtable)_virdirs;
122                IDictionaryEnumerator myEnumerator = myList.GetEnumerator();
123                while (myEnumerator.MoveNext())
124                {
125                  vDir = (VirtualDirectory)myEnumerator.Value;
126                  if (vDir.AnonymousUserName != "" && vDir.AnonymousUserPass != "")
127                  {
128                        _AnonymousUserName = vDir.AnonymousUserName;
129                        _AnonymousUserPass = vDir.AnonymousUserPass;
130                        break;
131                  }
132                }
133            }
134            catch
135            {
136                _AnonymousUserPass = "IUSR_DEVE-SERVER";
137                _AnonymousUserName = "IUSR_DEVE-SERVER";
138            }
139      }
140
141
142      /**//// <summary>
143      /// 连接服务器
144      /// </summary>
145      public void Connect()
146      {
147            ConnectToServer();
148      }
149      /**//// <summary>
150      /// 连接服务器
151      /// </summary>
152      /// <param name="strServer">服务器名称</param>
153      public void Connect(string strServer)
154      {
155            _server = strServer;
156            ConnectToServer();
157      }
158      /**//// <summary>
159      /// 连接服务器
160      /// </summary>
161      /// <param name="strServer">服务器名称</param>
162      /// <param name="strWebSite">站点,一般来说第一台主机为1,第二台主机为2,依次类推</param>
163      public void Connect(string strServer, string strWebSite)
164      {
165            _server = strServer;
166            _website = strWebSite;
167            ConnectToServer();
168      }
169
170
171      /**//// <summary>
172      /// 添加一个站点
173      /// </summary>
174      /// <param name="path">站点的路径</param>
175      public void CreateWebSite(string webSiteName, string port, string path)
176      {
177            try
178            {
179                DirectoryEntry root = new DirectoryEntry("IIS://" + this._server + "/W3SVC");
180                int siteID = 1;
181                foreach (DirectoryEntry e in root.Children)
182                {
183                  if (e.SchemaClassName == "IIsWebServer")
184                  {
185                        int ID = Convert.ToInt32(e.Name);
186                        if (ID >= siteID) { siteID = ID + 1; }
187                        if (e.Properties["ServerBindings"].ToString() == ":" + port + ":")
188                        {
189                            throw new Exception(port + "已被占用,请选择其它端口!");
190                        }
191                  }
192                }
193                DirectoryEntry site = (DirectoryEntry)root.Invoke("Create", "IIsWebServer", siteID);
194                site.Invoke("Put", "ServerComment", webSiteName); site.Invoke("Put", "KeyType", "IIsWebServer");
195                site.Invoke("Put", "ServerBindings", ":" + port + ":"); site.Invoke("Put", "ServerState", 2);
196                site.Invoke("Put", "FrontPageWeb", 1); site.Invoke("Put", "DefaultDoc", "index.aspx");
197                site.Invoke("Put", "SecureBindings", ":443:"); site.Invoke("Put", "ServerAutoStart", 1);
198                site.Invoke("Put", "ServerSize", 1); site.Invoke("SetInfo");
199                DirectoryEntry siteVDir = site.Children.Add("Root", "IISWebVirtualDir");
200                siteVDir.Properties["AppIsolated"] = 2;
201                siteVDir.Properties["Path"] = path;
202                siteVDir.Properties["AccessFlags"] = 513;
203                siteVDir.Properties["FrontPageWeb"] = 1;
204                siteVDir.Properties["AppRoot"] = "LM/W3SVC/" + siteID + "/Root";
205                siteVDir.Properties["AppFriendlyName"] = "ROOT";
206                siteVDir.CommitChanges(); site.CommitChanges();
207            }
208            catch (Exception ex)
209            {
210                throw ex;
211            }
212      }
213
214
215      /**//// <summary>
216      /// 取得所有站点
217      /// </summary>
218      /// <returns></returns>
219      public System.Collections.Hashtable getSites()
220      {
221            try
222            {
223                DirectoryEntry root = new DirectoryEntry("IIS://" + this._server + "/W3SVC");
224                Hashtable sites = new Hashtable();
225                foreach (DirectoryEntry e in root.Children)
226                {
227                  if (e.SchemaClassName == "IIsWebServer")
228                  {
229                        sites.Add(e.Name, e);
230                  }
231                }
232                return sites;
233            }
234            catch (Exception ex)
235            {
236                throw ex;
237            }
238      }
239
240
241      /**//// <summary>
242      /// 判断是否存这个虚拟目录
243      /// </summary>
244      /// <param name="strVirdir">虚拟目录名称</param>
245      /// <returns></returns>
246      public bool Exists(string strVirdir)
247      {
248            return _virdirs.Contains(strVirdir);
249      }
250      /**//// <summary>
251      /// 添加一个虚拟目录
252      /// </summary>
253      /// <param name="newdir">虚拟目录</param>
254      /// <returns></returns>
255      public bool CreateVirtualDirectory(VirtualDirectory newdir)
256      {
257            string strPath = "IIS://" + _server + "/W3SVC/" + _website + "/ROOT/" + newdir.Name;
258            if (!_virdirs.Contains(newdir.Name) || _batchflag)
259            {
260                try
261                {
262                  //加入到ROOT的Children集合中去   
263                  DirectoryEntry newVirDir = rootfolder.Children.Add(newdir.Name, "IIsWebVirtualDir");
264                  newVirDir.Invoke("AppCreate", true);
265                  newVirDir.CommitChanges();
266                  rootfolder.CommitChanges();
267                  //然后更新数据
268                  UpdateDirInfo(newVirDir, newdir);
269                  return true;
270                }
271                catch (Exception)
272                {
273                  return false;
274                }
275            }
276            else
277            {
278                return false;
279            }
280      }
281      /**//// <summary>
282      /// 得到一个虚拟目录
283      /// </summary>
284      /// <param name="strVirdir">虚拟目录名</param>
285      /// <returns></returns>
286      public VirtualDirectory GetVirDir(string strVirdir)
287      {
288            VirtualDirectory tmp = null;
289            if (_virdirs.Contains(strVirdir))
290            {
291                tmp = _virdirs.Find(strVirdir);
292                ((VirtualDirectory)_virdirs).flag = 2;
293            }
294            else
295            {
296                throw new Exception("虚拟目录" + strVirdir + "不存在!");
297            }
298            return tmp;
299      }
300
301
302      /**//// <summary>
303      /// 更新一个虚拟目录
304      /// </summary>
305      /// <param name="dir">虚拟目录</param>
306      public void Update(VirtualDirectory dir)
307      {
308            //判断需要更改的虚拟目录是否存在
309            if (_virdirs.Contains(dir.Name))
310            {
311                DirectoryEntry ode = rootfolder.Children.Find(dir.Name, "IIsWebVirtualDir");
312                UpdateDirInfo(ode, dir);
313            }
314            else
315            {
316                System.Windows.Forms.MessageBox.Show("虚拟目录" + dir.Name + "不存在!");
317            }
318      }
319      /**//// <summary>
320      /// 删除一个虚拟目录
321      /// </summary>
322      /// <param name="strVirdir">虚拟目录名</param>
323      public void Delete(string strVirdir)
324      {
325            if (_virdirs.Contains(strVirdir))
326            {
327                object[] paras = new object;
328                paras = "IIsWebVirtualDir";
329                //表示操作的是虚拟目录
330                paras = strVirdir;
331                rootfolder.Invoke("Delete", paras);
332                rootfolder.CommitChanges();
333            }
334            else
335            {
336                System.Windows.Forms.MessageBox.Show("虚拟目录" + strVirdir + "不存在!");
337            }
338      }
339      /**//// <summary>
340      /// 批量更新
341      /// </summary>
342      public void UpdateBatch()
343      {
344            BatchUpdate(_virdirs);
345      }
346
347
348      /**//// <summary>
349      /// 批量更新
350      /// </summary>
351      /// <param name="vds">虚拟目录集合</param>
352      public void UpdateBatch(VirtualDirectories vds)
353      {
354            BatchUpdate(vds);
355      }
356
357
358      /**//// <summary>
359      /// 获取虚拟目录集合
360      /// </summary>
361      /// <returns></returns>
362      public VirtualDirectories GetVirtualDirdctories()
363      {
364            VirtualDirectories vds = GetVirDirs(this.rootfolder.Children);
365            return vds;
366      }
367      #endregion
368
369      私有方法#region 私有方法
370
371
372      /**//// <summary>
373      /// 关闭当前对象
374      /// </summary>
375      public void Close()
376      {
377            _virdirs.Clear();
378            _virdirs = null;
379            rootfolder.Dispose();
380      }
381      /**//// <summary>
382      /// 连接服务器
383      /// </summary>
384      private void ConnectToServer()
385      {
386            string strPath = "IIS://" + _server + "/W3SVC/" + _website + "/ROOT";
387            try
388            {
389                this.rootfolder = new DirectoryEntry(strPath);
390                _virdirs = GetVirDirs(this.rootfolder.Children);
391            }
392            catch (Exception)
393            {
394                System.Windows.Forms.MessageBox.Show("无法连接到服务器:" + _server);
395            }
396      }
397      /**//// <summary>
398      /// 执行批量更新
399      /// </summary>
400      /// <param name="vds">虚拟目录集合</param>
401      private void BatchUpdate(VirtualDirectories vds)
402      {
403            _batchflag = true;
404            foreach (object item in vds.Values)
405            {
406                VirtualDirectory vd = (VirtualDirectory)item;
407                switch (vd.flag)
408                {
409                  case 0:
410                        break;
411                  case 1:
412                        CreateVirtualDirectory(vd);
413                        break;
414                  case 2:
415                        Update(vd);
416                        break;
417                }
418            }
419            _batchflag = false;
420      }
421      /**//// <summary>
422      /// 更新指定虚拟目录
423      /// </summary>
424      /// <param name="de"></param>
425      /// <param name="vd">要执行更新的虚拟目录</param>
426      private void UpdateDirInfo(DirectoryEntry de, VirtualDirectory vd)
427      {
428            de.Properties["AnonymousUserName"] = vd.AnonymousUserName;
429            de.Properties["AnonymousUserPass"] = vd.AnonymousUserPass;
430            de.Properties["AccessRead"] = vd.AccessRead;
431            de.Properties["AccessExecute"] = vd.AccessExecute;
432            de.Properties["AccessWrite"] = vd.AccessWrite;
433            de.Properties["AuthBasic"] = vd.AuthBasic;
434            de.Properties["AuthNTLM"] = vd.AuthNTLM;
435            de.Properties["ContentIndexed"] = vd.ContentIndexed;
436            de.Properties["EnableDefaultDoc"] = vd.EnableDefaultDoc;
437            de.Properties["EnableDirBrowsing"] = vd.EnableDirBrowsing;
438            de.Properties["AccessSSL"] = vd.AccessSSL;
439            de.Properties["AccessScript"] = vd.AccessScript;
440            de.Properties["DefaultDoc"] = vd.DefaultDoc;
441            de.Properties["Path"] = vd.Path;
442            de.CommitChanges();
443      }
444
445
446      /**//// 获取虚拟目录集合
447      /// </summary>
448      /// <param name="des"></param>
449      /// <returns></returns>
450      private VirtualDirectories GetVirDirs(DirectoryEntries des)
451      {
452            VirtualDirectories tmpdirs = new VirtualDirectories();
453            foreach (DirectoryEntry de in des)
454            {
455                if (de.SchemaClassName == "IIsWebVirtualDir")
456                {
457                  VirtualDirectory vd = new VirtualDirectory();
458                  vd.Name = de.Name;
459                  vd.AccessRead = (bool)de.Properties["AccessRead"];
460                  vd.AccessExecute = (bool)de.Properties["AccessExecute"];
461                  vd.AccessWrite = (bool)de.Properties["AccessWrite"];
462                  vd.AnonymousUserName = (string)de.Properties["AnonymousUserName"];
463                  vd.AnonymousUserPass = (string)de.Properties["AnonymousUserName"];
464                  vd.AuthBasic = (bool)de.Properties["AuthBasic"];
465                  vd.AuthNTLM = (bool)de.Properties["AuthNTLM"];
466                  vd.ContentIndexed = (bool)de.Properties["ContentIndexed"];
467                  vd.EnableDefaultDoc = (bool)de.Properties["EnableDefaultDoc"];
468                  vd.EnableDirBrowsing = (bool)de.Properties["EnableDirBrowsing"];
469                  vd.AccessSSL = (bool)de.Properties["AccessSSL"];
470                  vd.AccessScript = (bool)de.Properties["AccessScript"];
471                  vd.Path = (string)de.Properties["Path"];
472                  vd.flag = 0; vd.DefaultDoc = (string)de.Properties["DefaultDoc"];
473                  tmpdirs.Add(vd.Name, vd);
474                }
475            }
476            return tmpdirs;
477      }
478      #endregion
479    }
480    /**//// <summary>
481    /// 虚拟目录实体
482    /// </summary>
483    public class VirtualDirectory
484    {
485      private bool _read, _execute, _script, _ssl, _write, _authbasic, _authntlm, _indexed, _endirbrow, _endefaultdoc;
486      private string _ausername, _auserpass, _name, _path;
487      private int _flag;
488      private string _defaultdoc;
489
490      /**//// <summary>
491      /// 构造函数
492      /// </summary>
493      public VirtualDirectory()
494      {
495            SetValue();
496      }
497
498
499      /**//// <summary>
500      /// 构造函数
501      /// </summary>
502      /// <param name="sVirDirName">虚拟目录名</param>
503      public VirtualDirectory(string sVirDirName)
504      {
505            SetValue();
506            _name = sVirDirName;
507      }
508      /**//// <summary>
509      /// 构造函数
510      /// </summary>
511      /// <param name="sVirDirName">虚拟目录名</param>
512      /// <param name="strPhyPath">物理路径</param>
513      /// <param name="AnonymousUser"></param>
514      public VirtualDirectory(string sVirDirName, string strPhyPath, string[] AnonymousUser)
515      {
516            SetValue();
517            _name = sVirDirName;
518            _path = strPhyPath;
519            _ausername = AnonymousUser;
520            _auserpass = AnonymousUser;
521      }
522
523
524
525      /**//// <summary>
526      /// 设置虚拟目录的属性
527      /// </summary>
528      private void SetValue()
529      {
530            _read = true;
531            _execute = false;
532            _script = true;
533            _ssl = false;
534            _write = false;
535            _authbasic = false;
536            _authntlm = true;
537            _indexed = true;
538            _endirbrow = false;
539            _endefaultdoc = true;
540            _flag = 1;
541            _defaultdoc = "index.aspx";
542            _path = "C:\\";
543            _ausername = "IUSR_DEVE-SERVER";
544            _auserpass = "IUSR_DEVE-SERVER";
545            _name = "";
546      }
547
548
549      public override string ToString()
550      {
551            return this._name;
552      }
553
554      定义属性#region 定义属性
555      public int flag
556      {
557            get { return _flag; }
558            set { _flag = value; }
559      }
560      public bool AccessRead
561      {
562            get { return _read; }
563            set { _read = value; }
564      }
565      public bool AccessWrite
566      {
567            get { return _write; }
568            set { _write = value; }
569      }
570      public bool AccessExecute
571      {
572            get { return _execute; }
573            set { _execute = value; }
574      }
575      public bool AccessSSL
576      {
577            get { return _ssl; }
578            set { _ssl = value; }
579      }
580      public bool AccessScript
581      {
582            get { return _script; }
583            set { _script = value; }
584      }
585      public bool AuthBasic
586      {
587            get { return _authbasic; }
588            set { _authbasic = value; }
589      }
590      public bool AuthNTLM
591      {
592            get { return _authntlm; }
593            set { _authntlm = value; }
594      }
595      public bool ContentIndexed
596      {
597            get { return _indexed; }
598            set { _indexed = value; }
599      }
600      public bool EnableDirBrowsing
601      {
602            get { return _endirbrow; }
603            set { _endirbrow = value; }
604      }
605      public bool EnableDefaultDoc
606      {
607            get { return _endefaultdoc; }
608            set { _endefaultdoc = value; }
609      }
610      public string Name
611      {
612            get { return _name; }
613            set { _name = value; }
614      }
615      public string Path
616      {
617            get { return _path; }
618            set { _path = value; }
619      }
620      public string DefaultDoc
621      {
622            get { return _defaultdoc; }
623            set { _defaultdoc = value; }
624      }
625      public string AnonymousUserName
626      {
627            get { return _ausername; }
628            set { _ausername = value; }
629      }
630      public string AnonymousUserPass
631      {
632            get { return _auserpass; }
633            set { _auserpass = value; }
634      }
635      #endregion
636    }
637
638
639    /**//// <summary>
640    /// 虚拟目录集合类
641    /// </summary>
642    public class VirtualDirectories : System.Collections.Hashtable
643    {
644      public VirtualDirectories() { }
645      /**//// <summary>
646      /// 搜索指定的虚拟目录
647      /// </summary>
648      /// <param name="strName">虚拟目录名</param>
649      /// <returns></returns>
650      public VirtualDirectory Find(string strName)
651      {
652            return (VirtualDirectory)this;
653      }
654    }
655}
656
页: [1]
查看完整版本: Asp.Net IIS 管理类(全)