由于目录对象的标识名可能在某些操作的影响下被改变,但目录对象的objectGUID属性永远不会改变,所以我们可以直接在LDAP路径中指定此GUID,客户程序直接绑定到此对象,下面的代码显示了这种用法:
IADs *pADs;
LPWSTR pszFilter = L"LDAP://MyServer/<GUID=63560110f7e1d111a6bfaaaf842b9cfa>";
hr = ADsGetObject( pszFilter, IID_IADs, (void**)&pADs);
等价的VB代码如下:
Dim myObject as IADs
Set myObject = GetObject("LDAP://<GUID=63560110f7e1d111a6bfaaaf842b9cfa>")
(2) 包容器对象的枚举操作。
客户程序通过上面的方法可以直接到达指定的目录对象或者包容器对象,我们也可以从某个节点开始访问目录子树,利用IADsContainer接口所提供的方法,我们可以实现枚举操作,举例如下:
Dim MyObject as IADs
Dim Child as IADs
Dim Container as IADsContainer
On Error Resume Next
Set MyObject = GetObject("LDAP://MyServer")
Set Container = MyObject
If Err = 0 Then
For Each Child in Container
Debug.Print Child.Name
Next Child
EndIf
通过这种枚举操作,我们可以访问目录子树中的所有包容器对象和目录对象。
(3) 读取目录对象的属性。
读取对象属性最简单的方法莫过于直接通过对象的IADs::Get或者IADs::GetEx接口成员函数,比如:
Dim MyUser as IADs
Dim MyCommonName as String
set MyUser = GetObject("WinNT://MyServer/MyName")
MyCommonName = MyUser.Get("Fullname")
当然如果我们已经知道了目录对象的其它接口,也可以用更直接的方法访问属性,比如:
Dim MyUser as IADsUser
Dim MyName as String
Set MyUser = GetObject("WinNT://MyServer/MyName")
MyName = MyUser.Fullname
客户程序在访问目录对象时,通常ADSI已经为对象的属性作了缓存。当对象被创建时,其属性缓存为空,如果客户调用IADs::GetInfo从底层目录服务装载对象属性,那么它就会填满缓存,因为Get或者其它的Get_propertymethod函数都隐式调用了GetInfo函数,所以客户只要调用Get函数取一次属性值,以后的Get函数就直接从缓存中读取属性值。如果客户程序要刷新缓存中的属性值,可以显式调用IADs::GetInfo函数。使用缓存可以避免频繁地从服务器读取属性数据,从而降低网络负担。
如果客户程序不希望在缓存状态下读取属性值,可以使用目录对象的另一个接口IDirectoryObject,它可以直接访问底层目录服务的对象属性数据,为了优化性能,每次它可以取多个属性值。
(4) 设置目录对象的属性。
与读取属性相对应,设置对象属性可通过对象的IADs::Put或者IADs::PutEx接口成员函数实现,但是这两个函数只是把属性值写到缓存中,客户程序必须显式调用IADs::SetInfo成员函数,以便使更新后的属性值反映到底层目录服务中。举例如下:
Dim MyUser As IADsUser
Dim NewName As Variant
Set MyUser = GetObject("WinNT://MyServer/MyName")
NewName = "Pan Aimin"
User.Put "FullName", NewName
User.SetInfo
当客户程序创建了一个新的目录对象之后,只有在调用了IADs::SetInfo函数后,目录对象才真正被永久创建,否则只是缓存中的对象而已。
(5) 表结构的用法。
ADSI提供了用表结构描述目录对象属性的机制,客户程序可以在运行时刻访问目录对象表结构信息,下面的代码演示了表结构的基本用法:
Dim Computer As IADsComputer
Dim Class As IADsClass
Dim V As Variant
Set Computer = GetObject("WinNT://MyDomain/MyMachine")
Set Class = GetObject(c.Schema)
Debug.Print "Properties in this Class: "
For Each V In Class.MandatoryProperties
Debug.Print " "; V
Next V
For Each V In Class.OptionalProperties
Debug.Print " "; V
Next V
……