C#创建IIS虚拟目录的方法
本文实例讲述了c#创建iis虚拟目录的方法。分享给大家供大家参考。具体分析如下:
directoryentry是.net给我们的一大礼物,他的名字我们就知道他的功能--目录入口。使用过adsi的人都知道操作iis,winnt这些时,我们还需要提供他们的path,操作iis时,这个path的格式为:
computername:即操作的服务器的名字,可以是名字也可以是ip,经常用的就是localhost
service:即操作的服务器,iis中有web,也有ftp,还有smtp这些服务,我们主要是操作iis的web功能,因此此处就是"w3svc",如果是ftp则应是"msftpsvc"
website:一个iis服务中可以包括很多的站点,这个就用于设置操作的站点。他的值是一个数字,默认是1,表示缺省站点,如果有其它,则从1开始依次类推。
directory:不用说,即操作的目录名称,一个站点一般顶层目录为"root",其它目录则是他的孩子(child)。
首先我们获取一个站点的顶层目录(根目录):
如果我们创建这个对象是没有发生异常,则表示这个目录是真实存在的。
下面我们来添加新的虚拟目录,比如我们要加的是"aspcn":
directoryentry newvirdir = rootfolder.children.add("aspcn","iiswebvirtualdir"); newvirdir.invoke("appcreate",true); newvirdir.commitchanges(); rootfolder.commitchanges();
创建目录的思路很简单,即在根目录的子集(rootfolder.children)中再添加一条记录,这里使用的是directoryentries类中的add方法,它返回的是一个directoryentry,表示新加入的目录,第一个参数是虚拟目录的名字,第二个则是schema的类名以表明我们加入的目录类型。然后再使用directoryentry的invoke方法,调用adsi中的"appcreate"方法将目录真正创建(似乎不走这一步也可以创建目录成功,但是为了保险起见,大家还是用吧),最后便是依次调用新、根目录的commitchanges方法,确认此次操作。
在创建新目录时,我们也可以同时给这个目录的属性赋值,但是我的实战经验告诉我,最好不要这样做,如果创建时就赋值,将有很多属性不能赋值成功,比如重要的表示真实目录的path属性。因此飞刀建议大家最好是先创建目录,然后再赋值,即更新目录信息。
更新虚拟目录
相信大家对iis都比较熟悉,了解iis中一些重要的设置,如可读(accessread)、可写(accesswrite)、可执行(accessexecute)等。这些都可通过对directoryentry的properties属性集合的赋值来实现。赋值可以通过两种方式来完成:
第一种是调用properties集合的add方法,如:
第二种是对第一个索引值赋值:
这两种方法都是可行的。具体是要看你的喜好了。
在进行赋值之前我们还是要确定要要赋值的目标吧:)这里我们使用directoryentries类的find方法,如:
找到了,我们就可以赋值了。赋值时一定要好好看看啊,虚拟目录的属性值可以超多,一查一大堆。。:(太多了,飞刀我也不重复了,大家去微软的站点上查:)
比较常用的有:
accessread,accesswrite,accessexecute,accessscript,defaultdoc,enabledefaultdoc,path
删除虚拟目录
删除虚拟目录的方法也很简单,就是找到你要删除的虚拟目录,然后调用appdelete方法。
directoryentry de = rootfolder.children.find("aspcn","iisvirtualdir"); de.invoke("appdelete",true); rootfolder.commitchanges();
还有一种方法,就是调用root目录的delete方法。
object[] paras = new object[2]; paras[0] = "iiswebvirtualdir"; //表示操作的是虚拟目录 paras[1] = "aspcn"; rootfolder.invoke("delete",paras); rootfolder.commitchanges(); system.directoryservices.directoryentries
iis创建虚拟目录
using system; using system.collections.generic; using system.text; using system.directoryservices; namespace install_iis { class iismanager { public iismanager() { } /// <summary> /// 创建虚拟目录 /// </summary> /// <param name="website">服务器站点名称</param> /// <param name="vdirname">虚拟目录名称</param> /// <param name="path"></param> /// <param name="rootdir"></param> /// <param name="chkread"></param> /// <param name="chkwrite"></param> /// <param name="chkexecute"></param> /// <param name="chkscript"></param> /// <param name="chkauth"></param> /// <param name="websitenum">1</param> /// <param name="servername">localhost</param> /// <returns></returns> public string createvdir(string website,string vdirname, string path, bool rootdir, bool chkread,bool chkwrite, bool chkexecute, bool chkscript, bool chkauth, int websitenum, string servername) { string sret=string.empty; system.directoryservices.directoryentry iisschema; system.directoryservices.directoryentry iisadmin; system.directoryservices.directoryentry vdir; bool iisundernt; // // 确定iis版本 // iisschema = new system.directoryservices.directoryentry("iis://" + servername + "/schema/appisolated"); if(iisschema.properties["syntax"].value.tostring().toupper()=="boolean") iisundernt=true; else iisundernt=false; iisschema.dispose(); // // get the admin object // 获得管理权限 // iisadmin=new system.directoryservices.directoryentry("iis://" +servername +"/w3svc/" + websitenum + "/root"); if (iisadmin == null) return "iis 未正常安装"; if (iisadmin.children == null) return "iis 可能未启动"; // // if we're not creating a root directory // 如果我们不能创建一个根目录 // if (!rootdir) { // // if the virtual directory already exists then delete it // 如果虚拟目录已经存在则删除 // foreach(system.directoryservices.directoryentry v in iisadmin.children) { if (v.name == vdirname) { // delete the specified virtual directory if it already exists try { iisadmin.invoke("delete", new string [] { v.schemaclassname, vdirname }); iisadmin.commitchanges(); } catch(exception ex) { sret+=ex.message; } } } } // // create the virtual directory // 创建一个虚拟目录 // if (!rootdir) { vdir = iisadmin.children.add(vdirname, "iiswebvirtualdir"); } else { vdir = iisadmin; } // // make it a web application // 创建一个web应用 // vdir.properties["path"][0] = path; //设置虚拟目录指向的物理路径 if (iisundernt) { vdir.invoke("appcreate", false); } else { vdir.invoke("appcreate", 1); } // // setup the vdir // 设置虚拟目录 // vdir.properties["accessread"][0] = chkread; //设置读取权限 vdir.properties["accessexecute"][0] = chkexecute; //设置执行权限 vdir.properties["accesswrite"][0] = chkwrite; //设置写入权限 vdir.properties["accessscript"][0] = chkscript; //执行权限 vdir.properties["defaultdoc"][0] = "index.asp,default.aspx";//设置默认文档,多值情况下中间用逗号分割 vdir.properties["appfriendlyname"][0] = vdirname; //应用程序名称 vdir.properties["authflags"][0] = 0; // 设置目录的安全性,0表示不允许匿名访问,1为允许,3为基本身份验证,7为windows继承身份验证 vdir.properties["authntlm"][0] = chkauth; vdir.properties["enabledefaultdoc"][0] = true; vdir.properties["enabledirbrowsing"][0] = false; // // nt doesn't support this property // nt格式不支持这特性 // if (!iisundernt) { vdir.properties["aspenableparentpaths"][0] = true; } // // set the changes // 设置改变 // vdir.commitchanges(); //下面的方法是得到所有属性名称的方法: foreach (propertyvaluecollection pvc in vdir.properties) { console.writeline(pvc.propertyname); } sret+= "vroot " +vdirname + " created!"; return sret; } #region properties public string servername { get { return _servername; } set { _servername = value; } } #endregion public static string virdirschemaname = "iiswebvirtualdir"; #region private members private string _servername; #endregion } }
测试用:
这个我已投入项目中使用,可放心使用。
希望本文所述对大家的c#程序设计有所帮助。