由于目录对象的标识名可能在某些操作的影响下被改变,但目录对象的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函数。使用缓存可以避免频繁地从服务器读取属性数据,从而降低网络负担。