Net中如何操作IIS
System.DirectoryServices命名空間中包括了些強(qiáng)大的東東--DirectoryEntry,DirectoryEntries,它們?yōu)槲覀兲峁┝嗽L問活動(dòng)目錄的強(qiáng)大功能,在這些類允許我們操作IIS、LDAP、NDS以及WinNT,功能很強(qiáng)大的吧:)
不過我們此處只談IIS的控制,一般來說,我們操作IIS一般都是對(duì)虛擬目錄的操作,因此我將此列為主要的內(nèi)容來講。
首先我們要搞清楚IIS的層次結(jié)構(gòu)的問題,下面是我從國外找來的一張圖,很好的解釋了IIS的層次結(jié)構(gòu):
[htmChina:Image id=Image1|12][/htmChina:Image]為了搞清楚IIS的控制語法,我們就必須搞清上圖,了解IIS元數(shù)據(jù)(Metabase)的層次結(jié)構(gòu)。圖中的每一個(gè)節(jié)點(diǎn)稱之Key,而每個(gè)Key可以包含一個(gè)或多個(gè)值,這些值就是我們說的屬性(properties),IIS元數(shù)據(jù)中的Key與IIS中的元素是相符的,因此元數(shù)據(jù)中的屬性值的設(shè)定是會(huì)影響IIS中的設(shè)置。這就是我們編程的基本思路和核心。
另外還要了解一下Schema這個(gè)概念。它表示IIS中構(gòu)架的名稱,即可以理解IIS元數(shù)據(jù)中Key的類型,具體點(diǎn)說就是指每個(gè)結(jié)點(diǎn)的類型。我們知道,IIS中有虛擬目錄,普通目錄,以及文件這些東東,而這些都屬于IIS的元素,區(qū)分的他們的標(biāo)幟就是Schema。比如虛擬目錄的Schema就是"IIsVirtualDir",普通目錄就是"IIsWebDir"。這樣我們添加、刪除目錄時(shí),IIS就知道我們添加的是虛擬目錄還是普通目錄。
創(chuàng)建虛擬目錄
DirectoryEntry是.Net給我們的一大禮物,他的名字我們就知道他的功能--目錄入口。使用過ADSI的人都知道操作IIS,WinNT這些時(shí),我們還需要提供他們的Path,操作IIS時(shí),這個(gè)Path的格式為:
??? IIS://ComputerName/Service/Website/Directory
- ComputerName:即操作的服務(wù)器的名字,可以是名字也可以是IP,經(jīng)常用的就是localhost
- Service:即操作的服務(wù)器,IIS中有Web,也有FTP,還有SMTP這些服務(wù),我們主要是操作IIS的Web功能,因此此處就是"W3SVC",如果是FTP則應(yīng)是"MSFTPSVC"
- WebSite:一個(gè)IIS服務(wù)中可以包括很多的站點(diǎn),這個(gè)就用于設(shè)置操作的站點(diǎn)。他的值是一個(gè)數(shù)字,默認(rèn)是1,表示缺省站點(diǎn),如果有其它,則從1開始依次類推。
- Directory:不用說,即操作的目錄名稱,一個(gè)站點(diǎn)一般頂層目錄為"ROOT",其它目錄則是他的孩子(Child)。
首先我們獲取一個(gè)站點(diǎn)的頂層目錄(根目錄):
??? DirectoryEntry rootfolder = new DirectoryEntry("IIS://localhost/W3SVC/1/ROOT");
如果我們創(chuàng)建這個(gè)對(duì)象是沒有發(fā)生異常,則表示這個(gè)目錄是真實(shí)存在的。
下面我們來添加新的虛擬目錄,比如我們要加的是"Aspcn":
??? DirectoryEntry newVirDir = rootfolder.Children.Add("Aspcn","IIsWebVirtualDir");
????newVirDir.Invoke("AppCreate",true);
????newVirDir.CommitChanges();
????rootfolder.CommitChanges();
創(chuàng)建目錄的思路很簡(jiǎn)單,即在根目錄的子集(rootfolder.Children)中再添加一條記錄,這里使用的是DirectoryEntries類中的Add方法,它返回的是一個(gè)DirectoryEntry,表示新加入的目錄,第一個(gè)參數(shù)是虛擬目錄的名字,第二個(gè)則是Schema的類名以表明我們加入的目錄類型。然后再使用DirectoryEntry的Invoke方法,調(diào)用ADSI中的"AppCreate"方法將目錄真正創(chuàng)建(似乎不走這一步也可以創(chuàng)建目錄成功,但是為了保險(xiǎn)起見,大家還是用吧),最后便是依次調(diào)用新、根目錄的CommitChanges方法,確認(rèn)此次操作。
在創(chuàng)建新目錄時(shí),我們也可以同時(shí)給這個(gè)目錄的屬性賦值,但是我的實(shí)戰(zhàn)經(jīng)驗(yàn)告訴我,最好不要這樣做,如果創(chuàng)建時(shí)就賦值,將有很多屬性不能賦值成功,比如重要的表示真實(shí)目錄的Path屬性。因此飛刀建議大家最好是先創(chuàng)建目錄,然后再賦值,即更新目錄信息。
更新虛擬目錄
相信大家對(duì)IIS都比較熟悉,了解IIS中一些重要的設(shè)置,如可讀(AccessRead)、可寫(AccessWrite)、可執(zhí)行(AccessExecute)等。這些都可通過對(duì)DirectoryEntry的Properties屬性集合的賦值來實(shí)現(xiàn)。賦值可以通過兩種方式來完成:
第一種是調(diào)用Properties集合的Add方法,如:
??? dir.Properties["AccessRead"].Add(true);
第二種是對(duì)第一個(gè)索引值賦值:
??? dir.Properties["AccessRead"][0] = true;
這兩種方法都是可行的。具體是要看你的喜好了。
在進(jìn)行賦值之前我們還是要確定要要賦值的目標(biāo)吧:)這里我們使用DirectoryEntries類的Find方法,如:
??? DirectoryEntry de = rootfolder.Children.Find("Aspcn","IIsVirtualDir");
找到了,我們就可以賦值了。賦值時(shí)一定要好好看看啊,虛擬目錄的屬性值可以超多,一查一大堆。。:(太多了,飛刀我也不重復(fù)了,大家去微軟的站點(diǎn)上查:)
比較常用的有:AccessRead,AccessWrite,AccessExecute,AccessScript,DefaultDoc,EnableDefaultDoc,Path
刪除虛擬目錄
刪除虛擬目錄的方法也很簡(jiǎn)單,就是找到你要?jiǎng)h除的虛擬目錄,然后調(diào)用AppDelete方法。
??? DirectoryEntry de = rootfolder.Children.Find("Aspcn","IIsVirtualDir");
??? de.Invoke("AppDelete",true);
??? rootfolder.CommitChanges();
還有一種方法,就是調(diào)用Root目錄的Delete方法。
object[] paras = new object[2];
paras[0] = "IIsWebVirtualDir"; //表示操作的是虛擬目錄
paras[1] = "Aspcn";
rootfolder.Invoke("Delete",paras);
rootfolder.CommitChanges();
喜歡哪一種就看編程習(xí)慣了:))
.Net中如何操作IIS(源代碼)using System;
? ???using System.Data;
? ???using System.DirectoryServices;
? ???using System.Collections;
? ???namespace Aspcn.Management
? ???{
? ???/// <summary>
? ???/// IISManager 的摘要說明。
? ???/// </summary>
? ???public class IISManager
? ???{
? ???//定義需要使用的
? ???private string _server,_website;
? ???private VirtualDirectories _virdirs;
? ???protected System.DirectoryServices.DirectoryEntry rootfolder;
? ???private bool _batchflag;
? ???public IISManager()
? ???{
? ???//默認(rèn)情況下使用localhost,即訪問本地機(jī)
? ???_server = "localhost";
? ???_website = "1";
? ???_batchflag = false;
? ???}
? ???public IISManager(string strServer)
? ???{
? ???_server = strServer;
? ???_website = "1";
? ???_batchflag = false;
? ???}
? ???/// <summary>
? ???/// 定義公共屬性
? ???/// </summary>
? ???
? ???//Server屬性定義訪問機(jī)器的名字,可以是IP與計(jì)算名
? ???public string Server
? ???{
? ???get{ return _server;}
? ???set{ _server = value;}
? ???}
? ???//WebSite屬性定義,為一數(shù)字,為方便,使用string
? ???//一般來說第一臺(tái)主機(jī)為1,第二臺(tái)主機(jī)為2,依次類推
? ???public string WebSite
? ???{
? ???get{ return _website; }
? ???set{ _website = value; }
? ???}
? ???
? ???//虛擬目錄的名字
? ???public VirtualDirectories VirDirs
? ???{
? ???get{ return _virdirs; }
? ???set{ _virdirs = value;}
? ???}
? ???///<summary>
? ???///定義公共方法
? ???///</summary>
? ???
? ???//連接服務(wù)器
? ???public void Connect()
? ???{
? ???ConnectToServer();
? ???}
? ???//為方便重載
? ???public void Connect(string strServer)
? ???{
? ???_server = strServer;
? ???ConnectToServer();
? ???}
? ???//為方便重載
? ???public void Connect(string strServer,string strWebSite)
? ???{
? ???_server = strServer;
? ???_website = strWebSite;
? ???ConnectToServer();
? ???}
? ???//判斷是否存這個(gè)虛擬目錄
? ???public bool Exists(string strVirdir)
? ???{
? ???return _virdirs.Contains(strVirdir);
? ???}
? ???//添加一個(gè)虛擬目錄
? ???public void Create(VirtualDirectory newdir)
? ???{
? ???string strPath = "IIS://" + _server + "/W3SVC/" + _website + "/ROOT/" + newdir.Name;
? ???if(!_virdirs.Contains(newdir.Name) || _batchflag )
? ???{
? ???try
? ???{
? ???//加入到ROOT的Children集合中去
? ???DirectoryEntry newVirDir = rootfolder.Children.Add(newdir.Name,"IIsWebVirtualDir";
? ???newVirDir.Invoke("AppCreate",true);
? ???newVirDir.CommitChanges();
? ???rootfolder.CommitChanges();
? ???//然后更新數(shù)據(jù)
? ???UpdateDirInfo(newVirDir,newdir);
? ???}
? ???catch(Exception ee)
? ???{
? ???throw new Exception(ee.ToString());
? ???}
? ???}
? ???else
? ???{
? ???throw new Exception("This virtual directory is already exist.";
? ???}
? ???}
? ???//得到一個(gè)虛擬目錄
? ???public VirtualDirectory GetVirDir(string strVirdir)
? ???{
? ???VirtualDirectory tmp = null;
? ???if(_virdirs.Contains(strVirdir))
? ???{
? ???tmp = _virdirs.Find(strVirdir);
? ???((VirtualDirectory)_virdirs[strVirdir]).flag = 2;
? ???}
? ???else
? ???{
? ???throw new Exception("This virtual directory is not exists";
? ???}
? ???return tmp;
? ???}
? ???
? ???//更新一個(gè)虛擬目錄
? ???public void Update(VirtualDirectory dir)
? ???{
? ???//判斷需要更改的虛擬目錄是否存在
? ???if(_virdirs.Contains(dir.Name))
? ???{
? ???DirectoryEntry ode = rootfolder.Children.Find(dir.Name,"IIsWebVirtualDir";
? ???UpdateDirInfo(ode,dir);
? ???}
? ???else
? ???{
? ???throw new Exception("This virtual directory is not exists.";
? ???}
? ???}
? ???
? ???//刪除一個(gè)虛擬目錄
? ???public void Delete(string strVirdir)
? ???{
? ???if(_virdirs.Contains(strVirdir))
? ???{
? ???object[] paras = new object[2];
? ???paras[0] = "IIsWebVirtualDir"; //表示操作的是虛擬目錄
? ???paras[1] = strVirdir;
? ???rootfolder.Invoke("Delete",paras);
? ???rootfolder.CommitChanges();
? ???}
? ???else
? ???{
? ???throw new Exception("Can't delete " + strVirdir + ",because it isn't exists.";
? ???}
? ???}
? ???//批量更新
? ???public void UpdateBatch()
? ???{
? ???BatchUpdate(_virdirs);
? ???}
? ???//重載一個(gè):-)
? ???public void UpdateBatch(VirtualDirectories vds)
? ???{
? ???BatchUpdate(vds);
? ???}
? ???
? ???///<summary>
? ???///私有方法
? ???///</summary>
? ???
? ???//連接服務(wù)器
? ???private void ConnectToServer()
? ???{
? ???string strPath = "IIS://" + _server + "/W3SVC/" + _website +"/ROOT";
? ???try
? ???{
? ???this.rootfolder = new DirectoryEntry(strPath);
? ???_virdirs = GetVirDirs(this.rootfolder.Children);
? ???}
? ???catch(Exception e)
? ???{
? ???throw new Exception("Can't connect to the server ["+ _server +"] ...",e);
? ???}
? ???}
? ???//執(zhí)行批量更新
? ???private void BatchUpdate(VirtualDirectories vds)
? ???{
? ???_batchflag = true;
? ???foreach(object item in vds.Values)
? ???{
? ???VirtualDirectory vd = (VirtualDirectory)item;
? ???switch(vd.flag)
? ???{
? ???case 0:
? ???break;
? ???case 1:
? ???Create(vd);
? ???break;
? ???case 2:
? ???Update(vd);
? ???break;
? ???}
? ???}
? ???_batchflag = false;
? ???}
? ???//更新東東
? ???private void UpdateDirInfo(DirectoryEntry de,VirtualDirectory vd)
? ???{
? ???de.Properties["AnonymousUserName"][0] = vd.AnonymousUserName;
? ???de.Properties["AnonymousUserPass"][0] = vd.AnonymousUserPass;
? ???de.Properties["AccessRead"][0] = vd.AccessRead;
? ???de.Properties["AccessExecute"][0] = vd.AccessExecute;
? ???de.Properties["AccessWrite"][0] = vd.AccessWrite;
? ???de.Properties["AuthBasic"][0] = vd.AuthBasic;
? ???de.Properties["AuthNTLM"][0] = vd.AuthNTLM;
? ???de.Properties["ContentIndexed"][0] = vd.ContentIndexed;
? ???de.Properties["EnableDefaultDoc"][0] = vd.EnableDefaultDoc;
? ???de.Properties["EnableDirBrowsing"][0] = vd.EnableDirBrowsing;
? ???de.Properties["AccessSSL"][0] = vd.AccessSSL;
? ???de.Properties["AccessScript"][0] = vd.AccessScript;
? ???de.Properties["DefaultDoc"][0] = vd.DefaultDoc;
? ???de.Properties["Path"][0] = vd.Path;
? ???de.CommitChanges();
? ???}
? ???
? ???//獲取虛擬目錄集合
? ???private VirtualDirectories GetVirDirs(DirectoryEntries des)
? ???{
? ???VirtualDirectories tmpdirs = new VirtualDirectories();
? ???foreach(DirectoryEntry de in des)
? ???{
? ???if(de.SchemaClassName == "IIsWebVirtualDir"
? ???{
? ???VirtualDirectory vd = new VirtualDirectory();
? ???vd.Name = de.Name;
? ???vd.AccessRead = (bool)de.Properties["AccessRead"][0];
? ???vd.AccessExecute = (bool)de.Properties["AccessExecute"][0];
? ???vd.AccessWrite = (bool)de.Properties["AccessWrite"][0];
? ???vd.AnonymousUserName = (string)de.Properties["AnonymousUserName"][0];
? ???vd.AnonymousUserPass = (string)de.Properties["AnonymousUserName"][0];
? ???vd.AuthBasic = (bool)de.Properties["AuthBasic"][0];
? ???vd.AuthNTLM = (bool)de.Properties["AuthNTLM"][0];
? ???vd.ContentIndexed = (bool)de.Properties["ContentIndexed"][0];
? ???vd.EnableDefaultDoc = (bool)de.Properties["EnableDefaultDoc"][0];
? ???vd.EnableDirBrowsing = (bool)de.Properties["EnableDirBrowsing"][0];
? ???vd.AccessSSL = (bool)de.Properties["AccessSSL"][0];
? ???vd.AccessScript = (bool)de.Properties["AccessScript"][0];
? ???vd.Path = (string)de.Properties["Path"][0];
? ???vd.flag = 0;
? ???vd.DefaultDoc = (string)de.Properties["DefaultDoc"][0];
? ???tmpdirs.Add(vd.Name,vd);
? ???}
? ???}
? ???return tmpdirs;
? ???}
? ???
? ???}
? ???/// <summary>
? ???/// VirtualDirectory類
? ???/// </summary>
? ???public class VirtualDirectory
? ???{
? ???private bool _read,_execute,_script,_ssl,_write,_authbasic,_authntlm,_indexed,_endirbrow,_endefaultdoc;
? ???private string _ausername,_auserpass,_name,_path;
? ???private int _flag;
? ???private string _defaultdoc;
? ???/// <summary>
? ???/// 構(gòu)造函數(shù)
? ???/// </summary>
? ???public VirtualDirectory()
? ???{
? ???SetValue();
? ???}
? ???public VirtualDirectory(string strVirDirName)
? ???{
? ???_name = strVirDirName;
? ???SetValue();
? ???}
? ???private void SetValue()
? ???{
? ???_read = true;_execute = false;_script = false;_ssl= false;_write=false;_authbasic=false;_authntlm=false;
? ???_indexed = false;_endirbrow=false;_endefaultdoc = false;
? ???_flag = 1;
? ???_defaultdoc = "default.htm,default.aspx,default.asp,index.htm";
? ???_path = "C:\\";
? ???_ausername = "";_auserpass ="";_name="";
? ???}
? ???///<summary>
? ???///定義屬性,IISVirtualDir太多屬性了
? ???///我只搞了比較重要的一些,其它的大伙需要的自個(gè)加吧。
? ???///</summary>
? ???
? ???public int flag
? ???{
? ???get{ return _flag;}
? ???set{ _flag = value;}
? ???}
? ???public bool AccessRead
? ???{
? ???get{ return _read;}
? ???set{ _read = value;}
? ???}
? ???public bool AccessWrite
? ???{
? ???get{ return _write;}
? ???set{ _write = value;}
? ???}
? ???public bool AccessExecute
? ???{
? ???get{ return _execute;}
? ???set{ _execute = value;}
? ???}
? ???public bool AccessSSL
? ???{
? ???get{ return _ssl;}
? ???set{ _ssl = value;}
? ???}
? ???public bool AccessScript
? ???{
? ???get{ return _script;}
? ???set{ _script = value;}
? ???}
? ???public bool AuthBasic
? ???{
? ???get{ return _authbasic;}
? ???set{ _authbasic = value;}
? ???}
? ???public bool AuthNTLM
? ???{
? ???get{ return _authntlm;}
? ???set{ _authntlm = value;}
? ???}
? ???public bool ContentIndexed
? ???{
? ???get{ return _indexed;}
? ???set{ _indexed = value;}
? ???}
? ???public bool EnableDirBrowsing
? ???{
? ???get{ return _endirbrow;}
? ???set{ _endirbrow = value;}
? ???}
? ???public bool EnableDefaultDoc
? ???{
? ???get{ return _endefaultdoc;}
? ???set{ _endefaultdoc = value;}
? ???}
? ???public string Name
? ???{
? ???get{ return _name;}
? ???set{ _name = value;}
? ???}
? ???public string Path
? ???{
? ???get{ return _path;}
? ???set{ _path = value;}
? ???}
? ???public string DefaultDoc
? ???{
? ???get{ return _defaultdoc;}
? ???set{ _defaultdoc = value;}
? ???}
? ???public string AnonymousUserName
? ???{
? ???get{ return _ausername;}
? ???set{ _ausername = value;}
? ???}
? ???public string AnonymousUserPass
? ???{
? ???get{ return _auserpass;}
? ???set{ _auserpass = value;}
? ???}
? ???}
? ???/// <summary>
? ???/// 集合VirtualDirectories
? ???/// </summary>
? ???
? ???public class VirtualDirectories : System.Collections.Hashtable
? ???{
? ???public VirtualDirectories()
? ???{
? ???}
? ???//添加新的方法
? ???public VirtualDirectory Find(string strName)
? ???{
? ???return (VirtualDirectory)this[strName];
? ???}
? ???}
? ???}
轉(zhuǎn)載于:https://www.cnblogs.com/therock/archive/2005/07/27/201254.html
總結(jié)
以上是生活随笔為你收集整理的Net中如何操作IIS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vi编辑器的学习使用(十三)
- 下一篇: Castle实践9-在Castle IO