用ADSI實(shí)現(xiàn)自動(dòng)化的活動(dòng)目錄操作方法
ADSI是什么?如何用ADSI實(shí)現(xiàn)自動(dòng)化的活動(dòng)目錄操作,下文給出了詳細(xì)的描述。
網(wǎng)管們都應(yīng)該知道,腳本對(duì)于減輕工作量來說是非常有用的。通過腳本,以前需要手工數(shù)小時(shí)才能完成的工作,現(xiàn)在只需要完全交給電腦自動(dòng)處理就可以了。比如建立一個(gè)Visual Basic Scripting Edition (VBS),Windows Management Instrumentation (WMI)就可以自動(dòng)完成Windows系統(tǒng)中的多種任務(wù)。
而我們今天介紹的另一種腳本技術(shù)可以實(shí)現(xiàn)活動(dòng)目錄的自動(dòng)化操作,這就是活動(dòng)目錄訪問接口(Active Directory Service Interfaces ,ADSI)。使用ADSI,你可以完成任何通過Active Directory GUI界面可以完成的工作,比如創(chuàng)建、刪除、修改目錄對(duì)象(容器、用戶、組,等等)。另外,ADSI可以通過查詢目錄來快速獲得目錄信息。
下面我就來介紹一下ADSI以及它對(duì)活動(dòng)目錄的基本操作。
綁定到目錄
和使用Visual Basic 的GetObject方法綁定到WMI一樣,你也可以基于Lightweight Directory Access Protocol (LDAP)使用GetObject方法綁定目錄。在ADSI腳本中,首先需要指定一個(gè)LDAP驅(qū)動(dòng),這實(shí)際上是一個(gè)名為adsldp.dll的文件,只不過我們要加一個(gè)“LDAP:”作為前綴。這和我們使用WMI腳本的方法類似,只不過在WMI腳本中前綴變成了“Winmgmts:”。另外,你必須指定目錄對(duì)象的路徑,比如域、部門單元、用戶組或者用戶。LDAP驅(qū)動(dòng)和目錄路徑結(jié)合起來被稱為AdsPath。在這段代碼中,我們會(huì)將LDAP和acme.com 域的Marketing單元綁定在一起。
在代碼中我們會(huì)注意到,第一,AdsPath是被引號(hào)和括號(hào)包圍的。我們?cè)诰庉婣DSI腳本或其他任何腳本時(shí),都應(yīng)該使用純文本編輯器,比如Notepad,因?yàn)樵贛icrosoft Word中帶有智能標(biāo)記功能,由它編寫出來的腳本代碼不會(huì)被主機(jī)識(shí)別出來。第二,注意我們是如何設(shè)計(jì)對(duì)象路徑的。所有域名都采用了兩個(gè)字符來標(biāo)識(shí),而這兩個(gè)字符并不是隨便寫的,它們被稱為Attribute Type。它與Object Class一起使用,用來標(biāo)明是屬于容器對(duì)象還是葉子對(duì)象。表A列出了這種表示方法的含義。
舉個(gè)例子,假如我們希望綁定westcoast.acme.com域中Finance OU里面Managers組的成員Mary,我們可以使用這段代碼。
另外,對(duì)于用戶和組來說,cn屬性類型也表示容器,比如"Users"、"Computers"、"Domain Controllers"等。
綁定之后
正如我們所期望的,當(dāng)我們將對(duì)象綁定到活動(dòng)目錄后,就可以執(zhí)行四種基本的操作了。每種操作都由一種方法實(shí)現(xiàn),如表B所示。
如果打算使用其中任何一種方法,還需要在語句中以參數(shù)的形式提供相應(yīng)的信息,比如“創(chuàng)建什么內(nèi)容?”之類的。假設(shè)現(xiàn)在我們要在acme.com的Marketing OU中創(chuàng)建一個(gè)名為MSmith的用戶,我們可以使用這段代碼 。
代碼中前兩行表示告訴腳本要綁定到活動(dòng)目錄,然后建立一個(gè)名為MSmith 的User對(duì)象類。接下去兩行看起來可能會(huì)有些陌生,下面我就來解釋一下。對(duì)于一個(gè)用戶,他具有多種屬性可以進(jìn)入存儲(chǔ)在活動(dòng)目錄的數(shù)據(jù)庫(kù)(查看User屬性就能看到了),比如電話號(hào)碼、姓名、辦公室位置等。在這些屬性中,只有用戶名即代碼中的“sAMAccountName”是建立用戶所必須的。因此第三行使用Put方法修改第二行所建立的用戶的屬性。當(dāng)然,我們也可以再添加一些別的屬性。
第四行是用來將修改(創(chuàng)建對(duì)象或修改屬性等動(dòng)作)提交給活動(dòng)目錄的,它使用了一個(gè)叫做SetInfo的方法。如果沒有這最后一行代碼,腳本不會(huì)對(duì)活動(dòng)目錄產(chǎn)生任何影響。
我們還可以使用Get方法獲取活動(dòng)目錄對(duì)象的屬性。通過這段代碼,我們顯示了Marketing OU中的description屬性。
rootDSE
在上面任何一個(gè)代碼范例中,我們都沒有指定服務(wù)器名,這是由于ADSI支持“無服務(wù)器綁定”,也就是我們不需要輸入域控制器的名稱。借由這種特性,我們其實(shí)也不必輸入AdsPath。當(dāng)然我們可以將腳本綁定到根目錄,也就是所謂的Root Directory Service Entry (rootDSE),然后利用它的屬性綁定到當(dāng)前的域。
具體的做法是通過rootDSE中一個(gè)被稱作defaultNamingContext的屬性找到AdsPath,然后再利用AdsPath綁定到當(dāng)前域。這里的“當(dāng)前域”是指用戶登錄的域。假設(shè)當(dāng)前域?yàn)閣estcoast.acme.com,這段代碼 顯示了如何不注明AdsPath即可進(jìn)行綁定。
在代碼中,我們首先綁定到rootDSE,然后利用Get方法獲得了defaultNamingContext屬性并將其賦值給一個(gè)字符串變量。最后我們使用這個(gè)字符串變量作為域名的引用。在這個(gè)例子中,字符串變量strADsPath的實(shí)際值應(yīng)該是LDAP://DC=westcoast, DC=acme, DC=com 。
綁定變量到rootDSE的好處在于,不管當(dāng)前的域是什么都可以使用同一腳本。為了顯示這種方法的實(shí)用價(jià)值,我們?cè)谧约旱幕顒?dòng)目錄實(shí)驗(yàn)室中進(jìn)行了測(cè)試,目標(biāo)是在三個(gè)不同的域中各建立500個(gè)用戶,其用戶名分別為User1、User2......以此類推。你可以想象,假如采用活動(dòng)目錄的GUI界面,我們需要花費(fèi)多長(zhǎng)的時(shí)間才能創(chuàng)建完這些用戶。而當(dāng)我們?cè)诿總€(gè)域中都采用這段腳本,你會(huì)發(fā)現(xiàn)完成這個(gè)任務(wù)是一件相當(dāng)簡(jiǎn)單的事情。
實(shí)際上,有關(guān)ADSI的內(nèi)容遠(yuǎn)不止我們?cè)谶@篇文章中所涉及到的。想獲取更多有關(guān) ADSI的知識(shí),請(qǐng)?jiān)L問微軟MSDN網(wǎng)站上的 "Using Active Directory Service Interfaces" 。
用ADSI實(shí)現(xiàn)自動(dòng)化的活動(dòng)目錄操作方法希望能夠?qū)ψx者有所幫助。
【編輯推薦】