您现在的位置: 365建站网 > 365文章 > 使用DirectoryEntry进行IIS操作和构造函数的用法

使用DirectoryEntry进行IIS操作和构造函数的用法

文章来源:365jz.com     点击数:273    更新时间:2018-06-07 22:44   参与评论

DirectoryEntry 对象

在 System.DirectoryServices 中,目录中的每个对象都由 DirectoryEntry 对象表示。DirectoryEntry 在内存中创建一个项对象;在调用 CommitChanges 方法之前,它实际上并没有在目录中创建该对象。这样做的好处在于,您可以从客户端应用程序检索用于访问的目录信息,并且在本地读取或修改这些信息,然后重新连接到服务器,以便将修改后的信息保存到该目录。这会使服务器的执行效率达到最高。 
每个网络资源都表示为目录中的一个对象,并且每个目录对象(如前所述)都表示为客户端应用程序中的 DirectoryEntry。

这里写图片描述

这里写图片描述 
这里写图片描述

这里写图片描述

DirectoryEntry是.Net给我们的一大礼物,他的名字我们就知道他的功能--目录入口。使用过ADSI的人都知道操作IIS,WinNT这些时,我们还需要提供他们的Path,操作IIS时,这个Path的格式为:

IIS://ComputerName/Service/Website/Directory

ComputerName:即操作的服务器的名字,可以是名字也可以是IP,经常用的就是localhost 
Service:即操作的服务器,IIS中有Web,也有FTP,还有SMTP这些服务,我们主要是操作IIS的Web功能,因此此处就是"W3SVC",如果是FTP则应是"MSFTPSVC" 
WebSite:一个IIS服务中可以包括很多的站点,这个就用于设置操作的站点。他的值是一个数字,默认是1,表示缺省站点,如果有其它,则从1开始依次类推。

Directory:不用说,即操作的目录名称,一个站点一般顶层目录为"ROOT",其它目录则是他的孩子(Child)。 
首先我们获取一个站点的顶层目录(根目录):

DirectoryEntry rootfolder = new DirectoryEntry("IIS://localhost/W3SVC/1/ROOT");

如果我们创建这个对象是没有发生异常,则表示这个目录是真实存在的。

下面我们来添加新的虚拟目录,比如我们要加的是"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方法,如:

dir.Properties["AccessRead"].Add(true);

第二种是对第一个索引值赋值:

dir.Properties["AccessRead"][0] = true;

这两种方法都是可行的。具体是要看你的喜好了。

在进行赋值之前我们还是要确定要要赋值的目标吧:)这里我们使用DirectoryEntries类的Find方法,如:

DirectoryEntry de = rootfolder.Children.Find("Aspcn","IIsVirtualDir");

找到了,我们就可以赋值了。赋值时一定要好好看看啊,虚拟目录的属性值可以超多,一查一大堆。。:(太多了,飞刀我也不重复了,大家去微软的站点上查:)

比较常用的有: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();


实例代码示例:

</>code

  1. public class IISAdmin 
  2.     #region  建IIS站点方法1 (缺点 不能启动站点) 
  3.     //    public static int CreateWebsite(string webserver, string serverComment, string serverBindings, string homeDirectory) 
  4. //    { 
  5. //        DirectoryEntry w3svc = new DirectoryEntry("IIS://localhost/w3svc"); 
  6. //        object[] newsite = new object[] { serverComment, new object[] { serverBindings }, homeDirectory }; 
  7. //        object websiteId = (object)w3svc.Invoke("CreateNewSite", newsite); 
  8. //  int c=int(websiteId); 
  9. //        return c; 
  10.     //    } 
  11.     #endregion 
  12.     #region  建IIS站点(OK) 
  13.     public int CreateWebSite2(string webSiteName, string pathToRoot, string bd) //创建网站 
  14.     { 
  15.         DirectoryEntry root = new DirectoryEntry("IIS://localhost/W3SVC"); 
  16.         // Find unused ID value for new web site 
  17.         int siteID = 1; 
  18.         foreach (DirectoryEntry e in root.Children) 
  19.         { 
  20.             if (e.SchemaClassName == "IIsWebServer") 
  21.             { 
  22.                 int ID = Convert.ToInt32(e.Name); 
  23.                 if (ID >= siteID) 
  24.                 { 
  25.                     siteID = ID + 1; 
  26.                 } 
  27.             } 
  28.         } 
  29.         // Create web site 
  30.         DirectoryEntry site = (DirectoryEntry)root.Invoke("Create", "IIsWebServer", siteID); 
  31.         site.Invoke("Put", "ServerComment", webSiteName);//网站名称 
  32.         site.Invoke("Put", "ServerBindings", bd);//二级域名绑定 
  33.         site.Invoke("Put", "ServerState", 2);//默认4 
  34.         site.Invoke("Put", "DefaultDoc", "index.htm,index.asp,index.aspx,Default.aspx"); 
  35.         site.Invoke("Put", "ServerAutoStart", 1);//开启站点 
  36.         site.Invoke("SetInfo"); 
  37.         DirectoryEntry siteVDir = site.Children.Add("ROOT", "IISWebVirtualDir"); 
  38.         siteVDir.Invoke("AppCreate", true); //创建应用程序站点 
  39.         siteVDir.CommitChanges(); 
  40.         site.CommitChanges(); 
  41.         siteVDir.Properties["AppIsolated"][0] = 2;//默认2 
  42.         siteVDir.Properties["Path"][0] = pathToRoot;//主目录路径 
  43.         siteVDir.Properties["AccessFlags"][0] = 513; 
  44.         siteVDir.Properties["FrontPageWeb"][0] = 1; 
  45.         siteVDir.Properties["AppRoot"][0] = "/LM/W3SVC/" + siteID + "/Root"; 
  46.         siteVDir.Properties["AppFriendlyName"][0] = "默认应用程序"; 
  47.         siteVDir.Properties["AspEnableParentPaths"][0] = true;  //父路径启用 
  48.         siteVDir.CommitChanges(); 
  49.         site.CommitChanges(); 
  50.         return siteID; 
  51.     } 
  52.     #endregion 
  53.     #region  域名绑定方法 
  54.     public static void AddHostHeader(int siteid, string ip, int port, string domain)//增加主机头(站点编号.ip.端口.域名) 
  55.     { 
  56.         DirectoryEntry site = new DirectoryEntry("IIS://localhost/W3SVC/" + siteid); 
  57.         PropertyValueCollection serverBindings = site.Properties["ServerBindings"]; 
  58.         string headerStr = string.Format("{0}:{1}:{2}", ip, port, domain); 
  59.         if (!serverBindings.Contains(headerStr)) 
  60.         { 
  61.           serverBindings.Add(headerStr); 
  62.         } 
  63.         site.CommitChanges(); 
  64.     } 
  65.     #endregion 
  66.     #region  删除主机头 
  67.     public static void DeleteHostHeader(int siteid, string ip, int port, string domain)//删除主机头(站点编号.ip.端口.域名) 
  68.     { 
  69.         DirectoryEntry site = new DirectoryEntry("IIS://localhost/W3SVC/" + siteid); 
  70.         PropertyValueCollection serverBindings = site.Properties["ServerBindings"]; 
  71.         string headerStr = string.Format("{0}:{1}:{2}", ip, port, domain); 
  72.         if (serverBindings.Contains(headerStr)) 
  73.         { 
  74.             serverBindings.Remove(headerStr); 
  75.         } 
  76.         site.CommitChanges(); 
  77.     } 
  78.     #endregion 
  79.     #region  删除站点 
  80.     public static string DelSite(int siteidon) //没用的 
  81.     { 
  82.             string SiteID =Convert.ToString(siteidon); 
  83.             if (SiteID == null) return "error:该站点不存在!!"; 
  84.             DirectoryEntry deRoot = new DirectoryEntry("IIS://localhost/W3SVC"); 
  85.            
  86.                 DirectoryEntry deVDir = new DirectoryEntry(); 
  87.                 deRoot.RefreshCache(); 
  88.                 deVDir = deRoot.Children.Find(SiteID,"IIsVirtualDir"); 
  89.                 deRoot.Children.Remove(deVDir); 
  90.                 deRoot.CommitChanges(); 
  91.                 deRoot.Close(); 
  92.                 return "successful:删除站点成功!"; 
  93.          
  94.     } 
  95.     public void DeleteWebSiteByName(string siteName) 
  96.     { 
  97.         string siteNum = GetWebSiteNum(siteName); 
  98.         string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", "localhost", siteNum); 
  99.         DirectoryEntry siteEntry = new DirectoryEntry(siteEntPath); 
  100.         string rootPath = String.Format("IIS://{0}/w3svc", "localhost"); 
  101.         DirectoryEntry rootEntry = new DirectoryEntry(rootPath); 
  102.         rootEntry.Children.Remove(siteEntry); 
  103.         rootEntry.CommitChanges(); 
  104.     } 
  105.     #endregion 
  106.      
  107.    ///<summary> 
  108.    ///获取一个网站的编号。根据网站的ServerBindings或者ServerComment来确定网站编号 
  109.    ///</summary> 
  110.    ///<paramname="siteName"></param> 
  111.    ///<returns>返回网站的编号</returns> 
  112.    
  113.     #region 获取一个网站编号的方法 
  114.    public string GetWebSiteNum(string siteName) 
  115.     { 
  116.         Regex regex = new Regex(siteName); 
  117.         string tmpStr; 
  118.         string entPath = String.Format("IIS://{0}/w3svc", "localhost"); 
  119.         DirectoryEntry ent = new DirectoryEntry(entPath); 
  120.         foreach (DirectoryEntry child in ent.Children) 
  121.         { 
  122.             if (child.SchemaClassName == "IIsWebServer") 
  123.             { 
  124.                 if (child.Properties["ServerBindings"].Value != null) 
  125.                 { 
  126.                     tmpStr = child.Properties["ServerBindings"].Value.ToString(); 
  127.                     if (regex.Match(tmpStr).Success) 
  128.                     { 
  129.                         return child.Name; 
  130.                     } 
  131.                 } 
  132.                 if (child.Properties["ServerComment"].Value != null) 
  133.                 { 
  134.                     tmpStr = child.Properties["ServerComment"].Value.ToString(); 
  135.                     if (regex.Match(tmpStr).Success) 
  136.                     { 
  137.                         return child.Name; 
  138.                     } 
  139.                 } 
  140.             } 
  141.         } 
  142.         return "没有找到要删除的站点"; 
  143.     } 
  144.    
  145.    #endregion 
  146.    
  147.    
  148.    #region Start和Stop网站的方法 
  149.    
  150.    public void StartWebSite(string siteName) 
  151.    { 
  152.    string siteNum=GetWebSiteNum(siteName); 
  153.    string siteEntPath=String.Format("IIS://{0}/w3svc/{1}","localhost",siteNum); 
  154.    DirectoryEntry siteEntry=new DirectoryEntry(siteEntPath); 
  155.    siteEntry.Invoke("Start",new object[]{}); 
  156.    } 
  157.    
  158.    public void StopWebSite(string siteName) 
  159.    { 
  160.    string siteNum=GetWebSiteNum(siteName); 
  161.    string siteEntPath=String.Format("IIS://{0}/w3svc/{1}","localhost",siteNum); 
  162.    DirectoryEntry siteEntry=new DirectoryEntry(siteEntPath); 
  163.    siteEntry.Invoke("Stop",new object[]{}); 
  164.    } 
  165.    
  166.    #endregion 
  167. }


DirectoryEntry 构造函数 (String)的VB.NET实例


下面的示例将 DirectoryEntry 对象绑定到位于指定路径的目录项,并显示由该节点 Children 属性指定的每一子项 Path 属性。

</>code

  1. Public Class PrintChildren
  2.     
  3.     'Entry point which delegates to C-style main Private Function.
  4.     Public Overloads Shared Sub Main()
  5.         Main(System.Environment.GetCommandLineArgs())
  6.     End Sub
  7.     
  8.     Overloads Public Shared Sub Main(args() As String)
  9.         Dim objDE As DirectoryEntry
  10.         Dim strPath As String = "LDAP://DC=onecity,DC=corp,DC=fabrikam,DC=com"
  11.         If args.Length > 0 Then
  12.             strPath = args(1)
  13.         End If 
  14.         ' Create a new DirectoryEntry with the given path.
  15.         objDE = New DirectoryEntry(strPath)
  16.         
  17.         Dim objChildDE As DirectoryEntry
  18.         For Each objChildDE In  objDE.Children
  19.             Console.WriteLine(objChildDE.Path)
  20.         Next objChildDE
  21.     End Sub 'Main
  22. End Class 'PrintChildren


如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛

发表评论 (273人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
昵称:
最新评论
------分隔线----------------------------

快速入口

· 365软件
· 杰创官网
· 建站工具
· 网站大全

其它栏目

· 建站教程
· 365学习

业务咨询

· 技术支持
· 服务时间:9:00-18:00
365建站网二维码

Powered by 365建站网 RSS地图 HTML地图

copyright © 2013-2024 版权所有 鄂ICP备17013400号