目錄服務技術介紹 ADSI(五)

2022-01-16 02:04:55 字數 2561 閱讀 5536

由於目錄物件的標識名可能在某些操作的影響下被改變,但目錄物件的objectguid屬性永遠不會改變,所以我們可以直接在ldap路徑中指定此guid,客戶程式直接繫結到此物件,下面的**顯示了這種用法:

iads *pads;

lpwstr pszfilter = l"ldap://myserver/";

hr = adsgetobject( pszfilter, iid_iads, (void**)&pads); 

等價的vb**如下:

dim myobject as iads 

set myobject = getobject("ldap://")

(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

目錄服務技術介紹 ADSI(五)

由於目錄物件的標識名可能在某些操作的影響下被改變,但目錄物件的objectguid屬性永遠不會改變,所以我們可以直接在ldap路徑中指定此guid,客戶程式直接繫結到此物件,下面的 顯示了這種用法 iads pads lpwstr pszfilter l ldap myserver hr adsge...

目錄服務技術介紹 ADSI(一)

目錄服務技術介紹 adsi 潘愛民 北京大學計算機科學技術研究所 100871 摘要 本文介紹了microsoft提出的活動目錄服務介面 adsi 技術。文章首先講述了adsi的結構,然後介紹了adsi的 程式設計 方法,最後通過例子簡單說明了adsi的用法。一 adsi簡介 adsi active...

目錄服務技術介紹 ADSI(二)

下面列出目前已經實現的adsi目錄服務 1 windows nt域使用者管理。2 ldap exchange server 目錄服務。3 internet information server 4 nds novell netware directory services 目前,在乙個企業內部存在多...