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