IIS控制类

来源:互联网 发布:jstor知乎 编辑:程序博客网 时间:2024/06/10 16:10
1using System;
  2using System.Data;
  3using System.DirectoryServices;
  4using System.Collections;
  5
  6namespace CreateWebDir
  7{
  8/// <summary>
  9/// IISManager 的摘要说明。
 10/// </summary>

 11public class IISManager
 12{
 13//定义需要使用的
 14private string _server,_website,_AnonymousUserPass,_AnonymousUserName;
 15private VirtualDirectories _virdirs;
 16protected System.DirectoryServices.DirectoryEntry rootfolder;
 17private bool _batchflag;
 18/// <summary>
 19/// 默认情况下使用localhost,即访问本地机
 20/// </summary>

 21public IISManager()
 22{
 23_server = "localhost";
 24_website = "1";
 25_batchflag = false;
 26}

 27/// <summary>
 28/// 
 29/// </summary>
 30/// <param name="strServer">主机名称</param>

 31public IISManager(string strServer)
 32{
 33_server = strServer;
 34_website = "1"
 35_batchflag = false;
 36}

 37/// <summary>
 38/// 生成一个新的站点
 39/// </summary>
 40/// <param name="webSiteName">站点名称</param>
 41/// <param name="pathToRoot">物理地址</param>
 42/// <returns></returns>

 43public int CreateWebSite(string webSiteName, string pathToRoot)
 44{
 45DirectoryEntry root = new DirectoryEntry("IIS://localhost/W3SVC");
 46// Find unused ID value for new web site
 47int siteID = 1;
 48foreach(DirectoryEntry e in root.Children)
 49{
 50if(e.SchemaClassName == "IIsWebServer")
 51{
 52int ID = Convert.ToInt32(e.Name);
 53if(ID >= siteID)
 54{
 55siteID = ID+1;
 56}

 57}

 58}

 59// Create web site
 60DirectoryEntry site = (DirectoryEntry)root.Invoke("Create""IIsWebServer", siteID);
 61site.Invoke("Put""ServerComment", webSiteName);
 62site.Invoke("Put""KeyType""IIsWebServer");
 63site.Invoke("Put""ServerBindings"":80:");
 64site.Invoke("Put""ServerState"2);
 65site.Invoke("Put""FrontPageWeb"1);
 66site.Invoke("Put""DefaultDoc""Default.aspx");
 67site.Invoke("Put""SecureBindings"":443:");
 68site.Invoke("Put""ServerAutoStart"1);
 69site.Invoke("Put""ServerSize"1);
 70site.Invoke("SetInfo");
 71// Create application virtual directory
 72DirectoryEntry siteVDir = site.Children.Add("Root""IISWebVirtualDir");
 73siteVDir.Properties["AppIsolated"][0= 2;
 74siteVDir.Properties["Path"][0= pathToRoot;
 75siteVDir.Properties["AccessFlags"][0= 513;
 76siteVDir.Properties["FrontPageWeb"][0= 1;
 77siteVDir.Properties["AppRoot"][0= "LM/W3SVC/"+siteID+"/Root";
 78siteVDir.Properties["AppFriendlyName"][0= "Root";
 79siteVDir.CommitChanges();
 80site.CommitChanges();
 81return siteID;
 82}

 83
 84        /// <summary>
 85        /// 获得匿名用户
 86        /// </summary>

 87public void get_AnonymousUser()
 88{
 89_AnonymousUserPass="IUSR_DEVE-SERVER"
 90_AnonymousUserName="IUSR_DEVE-SERVER";
 91VirtualDirectory vDir;
 92try
 93{
 94Hashtable myList = (Hashtable)_virdirs;
 95IDictionaryEnumerator myEnumerator = myList.GetEnumerator();
 96while ( myEnumerator.MoveNext() )
 97{
 98vDir = (VirtualDirectory)myEnumerator.Value;
 99if (vDir.AnonymousUserName!="" && vDir.AnonymousUserPass != "")
100{
101_AnonymousUserName=vDir.AnonymousUserName;
102_AnonymousUserPass=vDir.AnonymousUserPass;
103break;
104}

105}

106}

107catch
108{
109_AnonymousUserPass="IUSR_DEVE-SERVER"
110_AnonymousUserName="IUSR_DEVE-SERVER";
111}

112}

113/// <summary>
114/// 匿名用户名
115/// </summary>

116public string AnonymousUserName
117{
118getreturn _AnonymousUserName;}
119set{ _AnonymousUserName = value;}
120}

121/// <summary>
122/// 匿名用户密码
123/// </summary>

124public string AnonymousUserPass
125{
126getreturn _AnonymousUserPass;}
127set{ _AnonymousUserPass = value;}
128}

129
130/// <summary>
131/// Server属性定义访问机器的名字,可以是IP与计算名
132/// </summary>

133public string Server
134{
135getreturn _server;}
136set{ _server = value;}
137}

138/// <summary>
139/// WebSite属性定义,为一数字,为方便,使用string 
140/// 一般来说第一台主机为1,第二台主机为2,依次类推
141/// </summary>

142public string WebSite
143{
144getreturn _website; }
145set{ _website = value; }
146}

147
148/// <summary>
149/// 虚拟目录的名字
150/// </summary>

151public VirtualDirectories VirDirs
152{
153getreturn _virdirs; }
154set{ _virdirs = value;}
155}

156///<summary>
157///定义公共方法
158///</summary>
159
160
161/// <summary>
162/// 连接服务器
163/// </summary>

164public void Connect()
165{
166ConnectToServer();
167}

168
169/// <summary>
170/// 为方便重载
171/// </summary>

172public void Connect(string strServer)
173{
174_server = strServer;
175ConnectToServer();
176}

177
178/// <summary>
179/// 为方便重载
180/// </summary>
181/// <param name="strServer"></param>
182/// <param name="strWebSite"></param>

183public void Connect(string strServer,string strWebSite)
184{
185_server = strServer;
186_website = strWebSite;
187ConnectToServer();
188}

189/// <summary>
190/// 判断是否存这个虚拟目录
191/// </summary>
192/// <param name="strVirdir"></param>
193/// <returns></returns>

194public bool Exists(string strVirdir)
195{
196return _virdirs.Contains(strVirdir);
197}

198
199/// <summary>
200/// 添加一个虚拟目录
201/// </summary>
202/// <param name="newdir">虚拟目录的实例</param>
203/// <returns></returns>

204public bool Create(VirtualDirectory newdir) 
205{
206string strPath = "IIS://" + _server + "/W3SVC/" + _website + "/ROOT/" + newdir.Name;
207if(!_virdirs.Contains(newdir.Name) || _batchflag )
208{
209try
210{
211//加入到ROOT的Children集合中去
212DirectoryEntry newVirDir = rootfolder.Children.Add(newdir.Name,"IIsWebVirtualDir");
213newVirDir.Invoke("AppCreate",true);
214newVirDir.CommitChanges();
215rootfolder.CommitChanges();
216//然后更新数据
217UpdateDirInfo(newVirDir,newdir);
218return true;
219}

220catch(Exception ee)
221{
222//throw new Exception(ee.ToString());
223return false;
224}

225}

226else
227{
228return true;
229//throw new Exception("This virtual directory is already exist.");
230}

231}

232
233/// <summary>
234/// 得到一个虚拟目录
235/// </summary>
236/// <param name="strVirdir"></param>
237/// <returns></returns>

238public VirtualDirectory GetVirDir(string strVirdir)
239{
240VirtualDirectory tmp = null;
241if(_virdirs.Contains(strVirdir))
242{
243tmp = _virdirs.Find(strVirdir);
244((VirtualDirectory)_virdirs[strVirdir]).flag = 2;
245}

246else
247{
248//throw new Exception("This virtual directory is not exists");
249}

250return tmp;
251}

252
253
254/// <summary>
255/// 更新一个虚拟目录
256/// </summary>
257/// <param name="dir"></param>

258public void Update(VirtualDirectory dir)
259{
260//判断需要更改的虚拟目录是否存在
261if(_virdirs.Contains(dir.Name))
262{
263DirectoryEntry ode = rootfolder.Children.Find(dir.Name,"IIsWebVirtualDir");
264UpdateDirInfo(ode,dir);
265}

266else
267{
268//throw new Exception("This virtual directory is not exists.");
269}

270}

271 
272
273/// <summary>
274/// 删除一个虚拟目录
275/// </summary>
276/// <param name="strVirdir"></param>

277public void Delete(string strVirdir)
278{
279if(_virdirs.Contains(strVirdir))
280{
281object[] paras = new object[2];
282paras[0= "IIsWebVirtualDir"//表示操作的是虚拟目录
283paras[1= strVirdir;
284rootfolder.Invoke("Delete",paras);
285rootfolder.CommitChanges();
286}

287else
288{
289//throw new Exception("Can''t delete " + strVirdir + ",because it isn''t exists.");
290}

291}

292
293/// <summary>
294/// 批量更新
295/// </summary>

296public void UpdateBatch()
297{
298BatchUpdate(_virdirs);
299}

300//重载一个:-)
301public void UpdateBatch(VirtualDirectories vds)
302{
303BatchUpdate(vds);
304}

305 
306///<summary>
307///私有方法
308///</summary>

309
310public void Close()
311{
312_virdirs.Clear();
313_virdirs = null;
314rootfolder.Dispose();
315
316}

317
318/// <summary>
319/// 连接服务器
320/// </summary>

321private void ConnectToServer()
322{
323string strPath = "IIS://" + _server + "/W3SVC/" + _website +"/ROOT";
324try
325{
326this.rootfolder = new DirectoryEntry(strPath);
327_virdirs = GetVirDirs(this.rootfolder.Children);
328}
 
329catch(Exception e)
330{
331//throw new Exception("Can''t connect to the server ["+ _server +"] ",e);
332}

333}

334//执行批量更新
335private void BatchUpdate(VirtualDirectories vds)
336{
337_batchflag = true;
338foreach(object item in vds.Values)
339{
340VirtualDirectory vd = (VirtualDirectory)item;
341switch(vd.flag)
342{
343case 0:
344break;
345case 1:
346Create(vd);
347break;
348case 2:
349Update(vd);
350break;
351}

352}

353_batchflag = false;
354}

355//更新东东
356private void UpdateDirInfo(DirectoryEntry de,VirtualDirectory vd)
357{
358de.Properties["AnonymousUserName"][0= vd.AnonymousUserName;
359de.Properties["AnonymousUserPass"][0= vd.AnonymousUserPass;
360de.Properties["AccessRead"][0= vd.AccessRead;
361de.Properties["AccessExecute"][0= vd.AccessExecute;
362de.Properties["AccessWrite"][0= vd.AccessWrite;
363de.Properties["AuthBasic"][0= vd.AuthBasic;
364de.Properties["AuthNTLM"][0= vd.AuthNTLM;
365de.Properties["ContentIndexed"][0= vd.ContentIndexed;
366de.Properties["EnableDefaultDoc"][0= vd.EnableDefaultDoc;
367de.Properties["EnableDirBrowsing"][0= vd.EnableDirBrowsing;
368de.Properties["AccessSSL"][0= vd.AccessSSL;
369de.Properties["AccessScript"][0= vd.AccessScript;
370de.Properties["DefaultDoc"][0= vd.DefaultDoc;
371de.Properties["Path"][0= vd.Path;
372de.Properties["AppFriendlyName"][0= vd.AppFriendlyName;
373de.CommitChanges();
374}

375
376//获取虚拟目录集合
377private VirtualDirectories GetVirDirs(DirectoryEntries des)
378{
379VirtualDirectories tmpdirs = new VirtualDirectories();
380foreach(DirectoryEntry de in des)
381{
382if(de.SchemaClassName == "IIsWebVirtualDir")
383{
384VirtualDirectory vd = new VirtualDirectory();
385vd.Name = de.Name;
386vd.AccessRead = (bool)de.Properties["AccessRead"][0];
387vd.AccessExecute = (bool)de.Properties["AccessExecute"][0];
388vd.AccessWrite = (bool)de.Properties["AccessWrite"][0];
389vd.AnonymousUserName = (string)de.Properties["AnonymousUserName"][0];
390vd.AnonymousUserPass = (string)de.Properties["AnonymousUserName"][0];
391vd.AuthBasic = (bool)de.Properties["AuthBasic"][0];
392vd.AuthNTLM = (bool)de.Properties["AuthNTLM"][0];
393vd.ContentIndexed = (bool)de.Properties["ContentIndexed"][0];
394vd.EnableDefaultDoc = (bool)de.Properties["EnableDefaultDoc"][0];
395vd.EnableDirBrowsing = (bool)de.Properties["EnableDirBrowsing"][0];
396vd.AccessSSL = (bool)de.Properties["AccessSSL"][0];
397vd.AccessScript = (bool)de.Properties["AccessScript"][0];
398vd.Path = (string)de.Properties["Path"][0];
399vd.flag = 0;
400vd.AppFriendlyName=(string)de.Properties["AppFriendlyName"][0];
401vd.DefaultDoc = (string)de.Properties["DefaultDoc"][0];
402tmpdirs.Add(vd.Name,vd);
403}

404}

405return tmpdirs;
406}

407
408}

409/// <summary>
410/// VirtualDirectory类
411/// </summary>

412public class VirtualDirectory
413{
414private bool _read,_execute,_script,_ssl,_write,_authbasic,_authntlm, _indexed,_endirbrow,_endefaultdoc;
415private string _ausername,_auserpass,_name,_path,_appfriendlyname;
416private int _flag;
417private string _defaultdoc;
418/// <summary>
419/// 构造函数
420/// </summary>

421public VirtualDirectory()
422{
423SetValue();
424}

425/// <summary>
426/// 构造函数
427/// </summary>
428/// <param name="sVirDirName">虚拟目录的名字</param>

429public VirtualDirectory(string sVirDirName)
430{
431SetValue();
432_name = sVirDirName;
433}

434/// <summary>
435/// 构造函数
436/// </summary>
437/// <param name="sVirDirName">虚拟路径</param>
438/// <param name="strPhyPath">物理路径</param>
439/// <param name="AnonymousUser">匿名用户名和密码</param>

440public VirtualDirectory(string sVirDirName,string strPhyPath,string[] AnonymousUser)
441{
442SetValue();
443_name = sVirDirName;
444_path = strPhyPath;
445_ausername = AnonymousUser[0];
446_auserpass = AnonymousUser[1];
447}

448private void SetValue()
449{
450_read = true;_execute = false;_script = true;_ssl= false;_write=false;_authbasic=false;
451_authntlm=true;_indexed = true;_endirbrow=false;_endefaultdoc = true;
452_flag = 1;
453_defaultdoc = "default.htm,default.aspx,default.asp,index.htm";
454_path = "C://";
455_appfriendlyname="";
456_ausername = "IUSR_DEVE-SERVER";_auserpass ="IUSR_DEVE-SERVER";_name="";
457}

458///<summary>
459///定义属性,IISVirtualDir太多属性了
460///我只搞了比较重要的一些,其它的大伙需要的自个加吧。
461///</summary>
462        
463/// <summary>
464/// 标志
465/// </summary>

466public int flag
467{
468getreturn _flag;}
469set{ _flag = value;}
470}

471/// <summary>
472/// 是否可读
473/// </summary>

474public bool AccessRead
475{
476getreturn _read;}
477set{ _read = value;}
478}

479/// <summary>
480/// 是否可写
481/// </summary>

482public bool AccessWrite
483{
484getreturn _write;}
485set{ _write = value;}
486}

487/// <summary>
488/// 是否可执行
489/// </summary>

490public bool AccessExecute
491{
492getreturn _execute;}
493set{ _execute = value;}
494}

495/// <summary>
496/// SSL验证
497/// </summary>

498public bool AccessSSL
499{
500getreturn _ssl;}
501set{ _ssl = value;}
502}

503/// <summary>
504/// 是否允许脚本
505/// </summary>

506public bool AccessScript
507{
508getreturn _script;}
509set{ _script = value;}
510}

511        public bool AuthBasic
512{
513getreturn _authbasic;}
514set{ _authbasic = value;}
515}

516public bool AuthNTLM
517{
518getreturn _authntlm;}
519set{ _authntlm = value;}
520}

521public bool ContentIndexed
522{
523getreturn _indexed;}
524set{ _indexed = value;}
525}

526/// <summary>
527/// 是否可浏览
528/// </summary>

529public bool EnableDirBrowsing
530{
531getreturn _endirbrow;}
532set{ _endirbrow = value;}
533}

534public bool EnableDefaultDoc
535{
536getreturn _endefaultdoc;}
537set{ _endefaultdoc = value;}
538}

539/// <summary>
540/// 虚拟目录的名字
541/// </summary>

542public string Name
543{
544getreturn _name;}
545set{ _name = value;}
546}

547/// <summary>
548/// 虚拟目录的物理地址
549/// </summary>

550public string Path
551{
552getreturn _path;}
553set{ _path = value;}
554}

555/// <summary>
556/// 默认访问首页
557/// </summary>

558public string DefaultDoc
559{
560getreturn _defaultdoc;}
561set{ _defaultdoc = value;}
562}

563/// <summary>
564/// 匿名用户名
565/// </summary>

566public string AnonymousUserName
567{
568getreturn _ausername;}
569set{ _ausername = value;}
570}

571/// <summary>
572/// 匿名用户密码
573/// </summary>

574public string AnonymousUserPass
575{
576getreturn _auserpass;}
577set{ _auserpass = value;}
578}

579/// <summary>
580/// 应用程序名称
581/// </summary>

582public string AppFriendlyName
583{
584getreturn _appfriendlyname;}
585set{ _appfriendlyname = value;}
586}

587}

588/// <summary>
589/// 集合VirtualDirectories
590/// </summary>

591
592public class VirtualDirectories : System.Collections.Hashtable
593{
594public VirtualDirectories()
595{
596}

597//添加新的方法 
598public VirtualDirectory Find(string strName)
599{
600return (VirtualDirectory)this[strName];
601}

602}

603}

604
使用举例:
string sServer = /"localhost/";
string VirtualDir = /"vTest/";    //虚拟目录
string PathDir    =@/"c://inetpub//dlwang///";  //物理目录

IISManager iisMg 
= new IISManager(sServer);
iisMg.Connect();
  
if (iisMg.Exists(VirtualDir))
{
throw new Exception(VirtualDir  /" is exist!/");
}

else
{
VirtualDirectory newVirDir 
= new VirtualDirectory(VirtualDir);
                newVirDir.Path
=PathDir;
                newVirDir.DefaultDoc
=/"Index.htm/";
newVirDir.AccessExecute
=true;
newVirDir.AccessScript
=true;
newVirDir.AccessWrite
=false;
                newVirDir.AppFriendlyName
=/"vTestApp/";
if (!iisMg.Create(newVirDir))
  
throw new Exception(VirtualDir  /" 创建不成功!/");
}


iisMg.Close();