载自:ZDNet China
目录树的每个节点包括一系列能够被检索和操控的属性。下面的术语在使用活动目录时很有用。
- 目录:用来保存信息的信息源。
- 活动目录架构:用来定义目录对象的属性。它类似于用来定义数据库结构的数据库架构。
现在让我们把主要精力转到如何使用活动目录上吧。
通过代码访问目录
.NET框架为访问活动目录提供了System.DirectoryServices命名空间。它使用活动目录服务接口(Active Directory Services Interfaces,ADSI)技术,微软也向其他很多网络提供商提供这个接口。这个命名空间包括两个组件类:
- DirectoryEntry:用来使用活动目录层次里单独的节点或者对象。它要与helper类一起使用才能操控目录资源和浏览资源树。你可以创建、删除、重命名、移动子节点,并枚举子节点。
- DirectorySearcher:让你使用轻型目录访问协议(Lightweight Directory Access Protocol,LDAP),它是唯一能够支持目录搜索的ADSI提供程序。你可以用DirectoryEntry类来使用搜索的结果。
尽管上面不是命名空间所包含的所有类,但是它们是最重要和最常用的两个。下面列表A里的C#代码用来访问我网络上的活动目录:
DirectoryEntry de = new DirectoryEntry();de.Path = "LDAP://192.168.1.1/CN=Users;DC=DomainName";
de.Username = @"DomainName\UserName";
de.Password = "Password";
下面列表B里是相应的VB.NET代码:
Dim de As DirectoryEntrySet de = New DirectoryEntry()
de.Path = "LDAP://192.168.1.1/CN=Users;DC=DomainName"
de.Username = @"DomainName\UserName"
de.Password = "Password"
这些代码让你能够访问活动目录,这样你就可以使用目录对象。你可能注意到路径用的是LDAP。ADSI包括下面这四个目录服务提供程序(我还提供了每个程序的句法):
- Windows 2000或Windows XP:WinNT://path
- LDAP:LDAP://path
- Novell NetWare目录服务:NDS://path
- Novell NetWare 3.x:NWCOMPAT://path
注意:使用活动目录一定要求安装好ADSI SDK或者ADSI运行库之后,才能够创建使用这一功能的应用程序。Windows 2000和XP默认就已经安装了它们。我们把上面的示例代码进行了扩展,以访问对象的所有属性,见下面的列表C:
DirectoryEntry de = new DirectoryEntry("LDAP://192.168.1.1/CN=Users;DC=DomainName");foreach(string key in de.Properties.PropertyNames) {
Console.WriteLine(key + " = ");
foreach(Object obj in de.Properties[key])
Console.WriteLine(obj);
}
列表D是相应的VB.NET代码:
Dim de As DirectoryEntry = New DirectoryEntry
("LDAP://192.168.1.1/CN=Users;DC=DomainName")
Dim key As String
Dim obj As Object
For Each Key In de.Properties.PropertyNames
Console.WriteLine(key & " = ")
For Each obj In de.Properties(key)
Console.WriteLine(CStr(obj))
Next obj
Next Key
由于可以访问目录,我们可以定位和操控已有的项目,还可以添加新的对象。
在使用目录的时候,你可能需要更改对象的一个或者多个属性。例如,保存在目录下的用户的电话号码可能会发生改变。下面列表E里的代码用到了前面提到的类来改变这个属性:
DirectoryEntry de = new
DirectoryEntry("LDAP://192.168.1.1/CN=Users;DC=DomainName");
de.Properties["HomeNumber"])[0] = "111-999-9999";
de.CommitChanges();
必须调用CommitChanges方法来进行永久的更改。如果你不使用这个方法,所进行的改变就不会被保存。相应的VB.NET见列表F:
Dim de As DirectoryEntry = New
DirectoryEntry("LDAP://192.168.1.1/CN=Users;DC=DomainName")
objDirEnt.Properties("HomeNumber")(0) = "111-999-9999"
你可以用这种方式来处理所有的属性。你可能会碰到新对象需要被加到目录里的情况。
添加新对象
添加新对象很简单。你先要使用DirectoryEntry对象,再用其Children属性的Add方法添加新的对象。它使用目录的多层次结构,所以你是正在向项目加入节点。列表G的C#代码加入了一个新的目录项(一个用户):
DirectoryEntry de = new
DirectoryEntry("LDAP://192.168.1.1/CN=Users;DC=DomainName");
de.Children.Add("Joe Blow", "user");
de.CommitChanges();
列表H里是相应的VB.NET代码:
Dim de As DirectoryEntry = New
DirectoryEntry("LDAP://192.168.1.1/CN=Users;DC=DomainName")
de.Children.Add("Joe Blow", "user")
de.CommitChanges()
这是一个非常基本的例子,因为(实际工作中)肯定会加入更多的用户信息。你可能还需要确保用户在被添加之前并不存在。
搜索目录
DirectorySearcher类使得搜索目录里的已有对象变得很容易。列表I的C#代码会进行一次检索并显示结果:
DirectoryEntry de= new
DirectoryEntry("LDAP://192.168.1.1/CN=Users;DC=DomainName");
DirectorySearcher srch = new DirectorySearcher(de);
srch.Filter = ("(HomeNumber=999-000-0000)");
foreach(SearchResult se in srch.FindAll()) {
Console.WriteLine( se.GetDirectoryEntry().Path );
}
这段代码使用已有的DirectoryEntry对象创建了DirectorySearcher类的一个实例。DirectorySearcher类的Filter属性定义了搜索的标准。FindAll方法用来返回符合搜索标准的所有对象,循环用来显示到达符合标准的项目的路径。列表J是相应的VB.NET代码:
Dim de As New DirectoryEntry("LDAP://192.168.1.1/CN=Users;DC=DomainName")
Dim srch As New DirectorySearcher(de)
Dim re As SearchResult
srch.Filter = ("(HomeNumber=999-000-0000)")
For Each re In srch.FindAll()
Console.WriteLine(re.GetDirectoryEntry().Path)
Next re
又一种数据源
活动目录为网络数据提供了一个多层次数据结构。此外,DirectoryEntry和DirectorySearcher这两个类通过开发人员熟悉的语言为访问目录内容提供了一条便捷的途径。你可以访问目录里的数据,也可以向里面保存新的数据。这是手头又一种数据存储区。
Tony Patton的职业生涯开始于应用程序开发员,并已经获得了Java、VB、Lotus和XML的认证,以证明其专业知识水平。