客戶程序也可以利用IADsClass、IADsProperty和IADsSyntax接口在運行時刻確定目錄對象的詳細屬性信息。操作步驟如下:
a.先綁定到目錄對象的表結構對象,可以直接訪問目錄對象的“schema”屬性。
b.用枚舉的辦法從表結構對象中找到強制屬性或者可選屬性,如果客戶知道要訪問的屬性名則可以跳過這一步。
c.綁定到表結構對象的包容器對象。
d.從表結構對象的包容器對象獲得屬性的定義對象。
e.從屬性定義對象獲取屬性信息,包括屬性的語法信息等。
下面的代碼演示了如何從獲得表結構對象到訪問“Owner”屬性的細節信息的過程:
Dim obj As IADs
Dim cl As IADsClass
Dim pr As IADsProperty
Dim sy As IADsSyntax
Dim sc As IADsContainer
Set obj = GetObject("WinNT://MyDomain/myMachine")
Set cl = GetObject(obj.Schema)
Set sc = GetObject(cl.Parent)
Set pr = sc.GetObject("Property","Owner")
MsgBox "Attribute: " & pr.Name
MsgBox "Syntax:" & pr.Syntax
Set sy = GetObject(sc.AdsPath & "/" & pr.Syntax)
MsgBox "Syntax object: " & sy.Name & " of OleAutoDataType: " & sy.OleAutoDataType
(6) 增加或者刪除目錄對象。
利用包容器對象的IADsContainer接口的方法(見表4),我們可以很方便地增加或者刪除目錄對象,舉例如下:
Dim Container as IADsContainer
Dim NewUser as IADsUser
Set Container = GetObject("WinNT://MyDomain")
' Create the new wrapper.
Set NewUser = Container.Create("user", "PanAimin")
' Write it back to the DS
NewUser.SetInfo
' Set Jane's password.
NewUser.SetPassword("123")
' Delete the user.
Call Container.Delete("user","Mary")
ADSI的各種操作比較簡單,只要我們能夠理解ADSI的基本結構,并且對核心的幾個接口以及常用提供者的一些接口有所了解,就可以用一致的方法訪問目錄服務,這也說明了ADSI作為通用目錄服務標準為程序員帶來的最大益處。
實現ADSI提供者要比使用ADSI復雜得多,通常情況下,我們只需使用系統已經定義的ADSI提供者。但如果確實應用需要,我們可以實現自定義的ADSI提供者。為了實現一個ADSI提供者,有一些特性是必須要支持的,而其它的特性則是可選的。下面是一些必須要實現的特性:
(1) 路徑解析使用COM的命名規范(moniker),其中名字空間對象必須要實現IParseDisplayName::ParseDisplayName函數以及IADsOpenDSObject接口。
(2) IADs接口必須實現屬性的緩存技術,只有IADs::GetInfo函數和IADs::SetInfo函數才刷新緩存或提交到底層目錄服務。
(3) 每一個包容器對象必須實現IADsContainer接口。
(4) 所有的ADSI對象都支持IDispatch接口,以便自動化客戶訪問屬性和方法。
(5) 對于非自動化客戶通過IDirectoryObject訪問ADSI目錄對象,而不是IADs接口。
(6) ADSI至少實現一個表結構包容器對象,以及相應的語法、屬性和類別對象,分別支持接口IADsSyntax、IADsProperty或IADsClass,每個根節點必須包含它自己的表結構包容器對象。
為了讓ADSI能夠找到自定義的提供者,我們必須在實現了ADSI提供者之后,把它注冊到系統注冊表中。在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ADs\Providers鍵下添加新的提供者項(指向提供者組件的ProgID),如果讀者感興趣,可以檢查該鍵項,以便確定當前系統已經安裝了哪些提供者。
|