soyizi 发表于 2015-8-14 13:10:48

IIS操作类

  添加引用 Microsoft.Web.Administration



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