由于目錄對象的標識名可能在某些操作的影響下被改變,但目錄對象的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) 包容器對象的枚舉操作。
客戶程序通過上面的方法可以直接到達指定的目錄對象或者包容器對象,我們也可以從某個節(jié)點開始訪問目錄子樹,利用IADsContainer接口所提供的方法,我們可以實現(xiàn)枚舉操作,舉例如下:
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接口成員函數(shù),比如:
Dim MyUser as IADs
Dim MyCommonName as String
set MyUser = GetObject("WinNT://MyServer/MyName")
MyCommonName = MyUser.Get("Fullname")
當然如果我們已經(jīng)知道了目錄對象的其它接口,也可以用更直接的方法訪問屬性,比如:
Dim MyUser as IADsUser
Dim MyName as String
Set MyUser = GetObject("WinNT://MyServer/MyName")
MyName = MyUser.Fullname
客戶程序在訪問目錄對象時,通常ADSI已經(jīng)為對象的屬性作了緩存。當對象被創(chuàng)建時,其屬性緩存為空,如果客戶調(diào)用IADs::GetInfo從底層目錄服務(wù)裝載對象屬性,那么它就會填滿緩存,因為Get或者其它的Get_propertymethod函數(shù)都隱式調(diào)用了GetInfo函數(shù),所以客戶只要調(diào)用Get函數(shù)取一次屬性值,以后的Get函數(shù)就直接從緩存中讀取屬性值。如果客戶程序要刷新緩存中的屬性值,可以顯式調(diào)用IADs::GetInfo函數(shù)。使用緩存可以避免頻繁地從服務(wù)器讀取屬性數(shù)據(jù),從而降低網(wǎng)絡(luò)負擔。
如果客戶程序不希望在緩存狀態(tài)下讀取屬性值,可以使用目錄對象的另一個接口IDirectoryObject,它可以直接訪問底層目錄服務(wù)的對象屬性數(shù)據(jù),為了優(yōu)化性能,每次它可以取多個屬性值。
(4) 設(shè)置目錄對象的屬性。
與讀取屬性相對應(yīng),設(shè)置對象屬性可通過對象的IADs::Put或者IADs::PutEx接口成員函數(shù)實現(xiàn),但是這兩個函數(shù)只是把屬性值寫到緩存中,客戶程序必須顯式調(diào)用IADs::SetInfo成員函數(shù),以便使更新后的屬性值反映到底層目錄服務(wù)中。舉例如下:
Dim MyUser As IADsUser
Dim NewName As Variant
Set MyUser = GetObject("WinNT://MyServer/MyName")
NewName = "Pan Aimin"
User.Put "FullName", NewName
User.SetInfo
當客戶程序創(chuàng)建了一個新的目錄對象之后,只有在調(diào)用了IADs::SetInfo函數(shù)后,目錄對象才真正被永久創(chuàng)建,否則只是緩存中的對象而已。
(5) 表結(jié)構(gòu)的用法。
ADSI提供了用表結(jié)構(gòu)描述目錄對象屬性的機制,客戶程序可以在運行時刻訪問目錄對象表結(jié)構(gòu)信息,下面的代碼演示了表結(jié)構(gòu)的基本用法:
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
|