在.NET框架中,DirectoryEntry是一个非常重要的类,它允许我们与Windows域交互,并对Active Directory(AD)对象执行增、删、改、查等操作。本文将深度解读DirectoryEntry类的作用与使用方法。
一、DirectoryEntry类的概述
DirectoryEntry类是.NET中的一个典型的COM互操作类,它允许我们通过COM组件来操作Windows域和Active Directory。DirectoryEntry类实现了IDirectorySearch和IDirectoryObject接口,允许我们在对象级别上进行访问控制和认证操作。
DirectoryEntry类提供了一组通用的方法和属性,用于访问以及对Active Directory和Windows域执行增、删、改、查等操作。下面是DirectoryEntry的一些主要属性和方法:
(1)Path:用于指定Active Directory的路径。可以是WinNT、LDAP、GC等路径格式,比如“LDAP://DC=mydomain,DC=com”。
(2)Children:返回此节点的子节点集合。
(3)Parent:返回此节点的父节点。
(4)SchemaEntry:返回与当前节点对应的架构对象。
(5)Properties(属性):允许访问节点的属性集合。
(6)Methods(方法):允许访问节点的方法集合。
(7)Invoke(调用):调用节点的方法。
(8)Guid(全局唯一标识符):节点的GUID。
(9)Name:节点的名称。
(10)NativeGuid:节点的原生对象的GUID。
(11)ChildrenSchemaFilter:返回节点子节点的架构过滤器。
(12)NativeObject:返回原生COM对象。
(13)CommitChanges:保存对节点属性和方法的更改。
(14)DeleteTree:从节点及其子节点中删除当前节点。
(15)CopyTo:将当前节点的副本复制到目标节点。
DirectoryEntry类很容易使用,无需使用专家级编码技能或复杂工具即可实现一些基本的AD操作。
二、DirectoryEntry类的使用方法
使用DirectoryEntry类的第一步是创建对象。实例化DirectoryEntry对象有多种方式,其中最常见的方法是通过LDAP路径连接到AD。例如:
DirectoryEntry de = new DirectoryEntry("LDAP://mydomain.com");
此代码将创建一个DirectoryEntry对象,该对象代表了LDAP://mydomain.com上的AD节点。此时de对象连接到了LDAP目录,可以通过代码执行AD相关操作。
DirectoryEntry类的几个重要方法和属性如下:
1.新增对象
下面是向Active Directory中添加对象的示例(以添加一个新的用户为例):
//新建一个DirectoryEntry对象并赋值
DirectoryEntry entry = parentEntry.Children.Add(name, LDAPClass);
//设置属性
entry.Properties["samAccountName"].Value = "shuyan.zhou";
entry.Properties["userAccountControl"].Value = 66048;
entry.Properties["givenName"].Value = "ShuYan";
entry.Properties["sn"].Value = "Zhou";
entry.Properties["displayName"].Value = "ShuYan Zhou";
entry.Properties["mail"].Value = "shuyan.zhou@mail.com";
entry.Properties["description"].Value = "This is a test user.";
entry.CommitChanges();
以上代码演示了如何用DirectoryEntry对象创建新的Active Directory对象并设置属性。这里创建了一个新用户,指定属性如samAccountName、userAccountControl、displayName等。
2.修改对象属性
下面是DirectoryEntry类修改对象属性的示例代码:
DirectoryEntry rootEntry = new DirectoryEntry("LDAP://myserver.domain.com/dc=mydomain,dc=com");
DirectoryEntry de = rootEntry.Children.Find("CN=user01");
de.Properties["DisplayName"].Value = "New User Name";
de.CommitChanges();
以上代码演示了如何使用DirectoryEntry对象在Active Directory中修改对象的属性。我们找到Active Directory中名为“user01”的用户,然后把“DisplayName”修改为“New User Name”。
3.删除对象
下面是DirectoryEntry类删除对象的示例代码:
DirectoryEntry de = new DirectoryEntry("LDAP://myserver.domain.com/CN=user01,dc=mydomain,dc=com");
de.DeleteTree();
以上代码演示了如何使用DirectoryEntry对象在Active Directory中删除对象。我们找到Active Directory中名为“user01”的用户,并把该用户及其所有子对象从AD中删除。
4.查询对象
查询AD中的对象是DirectoryEntry较重要的功能之一,我们可以通过DirectorySearcher类或DirectoryEntry类的FindXXX方法进行查询操作。下面是DirectoryEntry类查询对象的示例代码:
DirectoryEntry rootEntry = new DirectoryEntry("LDAP://myserver.domain.com/dc=mydomain,dc=com");
DirectoryEntry userEntry = rootEntry.Children.Find("CN=user01");
以上代码演示了使用DirectoryEntry对象在Active Directory中查询对象。我们找到Active Directory中名为“user01”的用户并返回其目录项。
三、使用建议
DirectoryEntry类是一个非常强大的类,可以简单地管理Active Directory对象。但是,使用DirectoryEntry类时需要注意一些事项,以确保操作成功。
首先,要注意DirectoryEntry类的访问权限。如果要访问Active Directory,用户必须有足够的特权才能执行操作。例如,如果你试图操作一个受保护的对象,而你没有针对该对象的访问权限,就会产生错误。
其次,使用DirectoryEntry类时要谨慎操作。在修改或删除对象之前,请三思而后行,确保你知道自己在做什么。如果你不确定某个操作的影响,最好先在测试环境中进行操作。
另外,建议通过DirectorySearcher来查询AD目录,因为DirectorySearcher可以更好地避免域管理员权限的问题。而且DirectorySearcher类的搜索功能更加灵活和强大。
最后,如果需求比较复杂或需要执行更高级的操作,建议使用专门的AD管理工具(如ADSI Edit、AD Schema Analyzer等),这样更加安全和方便。
总之,DirectoryEntry类是.NET开发人员管理Active Directory的首选工具之一。如果你需要与Active Directory进行交互操作,那么DirectoryEntry类肯定是你不可或缺的工具。