目錄服務技術介紹——ADSI(七)
了解了客戶程序的編程方法以及ADSI提供者的基本內容之后,現在我們來看看從客戶程序到ADSI提供者組件的交互過程(如圖4所示),以便加深讀者對ADSI的理解。

圖4 客戶程序與ADSI提供者的交互過程
客戶程序首先向ADSI發一個對象綁定請求(圖中步驟1),ADSI組件根據客戶給出的ADSI對象路徑,提取出標識提供者ProgID的字符串,比如“WinNT”、“LDAP”或者自定義的提供者ProgID,進一步在注冊表中找到此ProgID所對應的CLSID(圖中步驟2)。然后裝入提供者組件程序(圖中步驟3),接下去的任務就交給提供者組件,由它創建對象并返回給ADSI組件(圖中步驟4),進一步返回給客戶程序(圖中步驟5)。以后客戶與目錄對象直接進行通訊(圖中步驟6)。這是客戶綁定ADSI目錄對象的實現過程。
四、ADSI例程序
這一部分我們將介紹一個ADSI例程序dsbrowse,它是一個VB表單窗口程序,此程序可以對當前機器上的所有ADSI提供者進行瀏覽,圖5分別給出了dsbrowse運行的初始狀態以及打開NT域之后的目錄對象列表圖。


(a) 初始運行狀態 (b) 打開WinNT域之后的狀態
圖5 例程序dsbrowse運行示意圖
dsbrowse例程序非常簡單,在表單窗口的初始化函數中,根據程序指定的根路徑,對它所包容的對象進行枚舉。缺省情形是,我們在初始路徑中指定“ADS:”,它是ADSI的總根,包容了當前機器上的所有名字空間,如圖5(a)所示,dsbrowse列出了當前機器上的5個名字空間:IIS、LDAP、NDS、NWCOMPAT和WinNT。有的名字空間需要指定相應的服務器,不能進行無服務器枚舉,所以我們不能直接用dsbrowse進行枚舉,但有的名字空間可以進行無服務器枚舉,對這種名字空間我們可以點擊名字空間前的加號即可列出它所包容的目錄對象或者子包容器對象。比如,我們在“WinNT”名字空間點擊可列出當前網絡環境下所有的NT域,進一步在某個NT域名上點擊可列出此域中所有的目錄對象,包括此域的用戶、計算機、用戶組、服務等對象。
我們在窗口的樹狀控制中選中某個對象,再點擊右上角的“Properties”按鈕,dsbrowse程序會用一個對話框顯示被選中對象的屬性信息,如圖6所示。屬性對話框列出了相應對象的名字、路徑、是否為包容器對象、以及它的屬性表,用戶可以通過下部的控制修改對象的屬性。

圖6 例程序dsbrowse的屬性對話框
讀者可以從Visual Studio的Visual C++ Sample中得到dsbrowse程序的主要源代碼,源代碼位于Samplessdketdsadsisampappdsbrowse目錄下。在sampapp目錄下還有一個Visual C++的例程序AdsCmd,它可以直接通過命令行參數訪問指定目錄對象,也可以列出包容器對象的所有子對象。比如,我們可以通過AdsCmd列出Microsoft Exchange Server的郵箱信息:
AdsCmd list LDAP://MailServer/cn=Recipients,ou=MySite,o=MyOrganization
我們也可以讓AdsCmd程序直接給出指定路徑的目錄對象的屬性信息,例如:
AdsCmd dump LDAP://MailServer/cn=PanAimin,cn=Recipients,ou=MySite,o=MyOrganization
當然,AdsCmd不僅可以訪問Microsoft Exchange Server的用戶信息,也可以訪問其它任意名字空間的目錄服務信息。
五、結束語
ADSI是一項正在發展中的技術,它體現了網絡時代訪問和管理信息的基本思想。Microsoft正逐步把它標準化,ADSI也將成為Windows 2000操作系統的一項新特性,雖然我們在Windows NT 4.0以及一些應用軟件中已經看到了ADSI的應用,但無論是WinNT或者是用于Microsoft Exchange Server用戶訪問的LDAP協議,ADSI的支持都是不完全的,我們還無法通過WinNT名字空間添加NT用戶。雖然ADSI支持Windows NT的安全特性,但實際上這種特性還有待于進一步完善。
ADSI技術的全面應用必須要等到Windows 2000發布之后才有可能。隨著Windows 2000發布日的臨近,ADSI最終必將統一目錄服務接口。作為Windows程序員,我們必須對此作好準備。本文對ADSI作了基本的介紹,文中提到的接口或者基本原則不會再變化,但個別細節有可能在新的版本中有所不同。請讀者在使用中注意這一點。

圖4 客戶程序與ADSI提供者的交互過程
客戶程序首先向ADSI發一個對象綁定請求(圖中步驟1),ADSI組件根據客戶給出的ADSI對象路徑,提取出標識提供者ProgID的字符串,比如“WinNT”、“LDAP”或者自定義的提供者ProgID,進一步在注冊表中找到此ProgID所對應的CLSID(圖中步驟2)。然后裝入提供者組件程序(圖中步驟3),接下去的任務就交給提供者組件,由它創建對象并返回給ADSI組件(圖中步驟4),進一步返回給客戶程序(圖中步驟5)。以后客戶與目錄對象直接進行通訊(圖中步驟6)。這是客戶綁定ADSI目錄對象的實現過程。
四、ADSI例程序
這一部分我們將介紹一個ADSI例程序dsbrowse,它是一個VB表單窗口程序,此程序可以對當前機器上的所有ADSI提供者進行瀏覽,圖5分別給出了dsbrowse運行的初始狀態以及打開NT域之后的目錄對象列表圖。


(a) 初始運行狀態 (b) 打開WinNT域之后的狀態
圖5 例程序dsbrowse運行示意圖
dsbrowse例程序非常簡單,在表單窗口的初始化函數中,根據程序指定的根路徑,對它所包容的對象進行枚舉。缺省情形是,我們在初始路徑中指定“ADS:”,它是ADSI的總根,包容了當前機器上的所有名字空間,如圖5(a)所示,dsbrowse列出了當前機器上的5個名字空間:IIS、LDAP、NDS、NWCOMPAT和WinNT。有的名字空間需要指定相應的服務器,不能進行無服務器枚舉,所以我們不能直接用dsbrowse進行枚舉,但有的名字空間可以進行無服務器枚舉,對這種名字空間我們可以點擊名字空間前的加號即可列出它所包容的目錄對象或者子包容器對象。比如,我們在“WinNT”名字空間點擊可列出當前網絡環境下所有的NT域,進一步在某個NT域名上點擊可列出此域中所有的目錄對象,包括此域的用戶、計算機、用戶組、服務等對象。
我們在窗口的樹狀控制中選中某個對象,再點擊右上角的“Properties”按鈕,dsbrowse程序會用一個對話框顯示被選中對象的屬性信息,如圖6所示。屬性對話框列出了相應對象的名字、路徑、是否為包容器對象、以及它的屬性表,用戶可以通過下部的控制修改對象的屬性。

圖6 例程序dsbrowse的屬性對話框
讀者可以從Visual Studio的Visual C++ Sample中得到dsbrowse程序的主要源代碼,源代碼位于Samplessdketdsadsisampappdsbrowse目錄下。在sampapp目錄下還有一個Visual C++的例程序AdsCmd,它可以直接通過命令行參數訪問指定目錄對象,也可以列出包容器對象的所有子對象。比如,我們可以通過AdsCmd列出Microsoft Exchange Server的郵箱信息:
AdsCmd list LDAP://MailServer/cn=Recipients,ou=MySite,o=MyOrganization
我們也可以讓AdsCmd程序直接給出指定路徑的目錄對象的屬性信息,例如:
AdsCmd dump LDAP://MailServer/cn=PanAimin,cn=Recipients,ou=MySite,o=MyOrganization
當然,AdsCmd不僅可以訪問Microsoft Exchange Server的用戶信息,也可以訪問其它任意名字空間的目錄服務信息。
五、結束語
ADSI是一項正在發展中的技術,它體現了網絡時代訪問和管理信息的基本思想。Microsoft正逐步把它標準化,ADSI也將成為Windows 2000操作系統的一項新特性,雖然我們在Windows NT 4.0以及一些應用軟件中已經看到了ADSI的應用,但無論是WinNT或者是用于Microsoft Exchange Server用戶訪問的LDAP協議,ADSI的支持都是不完全的,我們還無法通過WinNT名字空間添加NT用戶。雖然ADSI支持Windows NT的安全特性,但實際上這種特性還有待于進一步完善。
ADSI技術的全面應用必須要等到Windows 2000發布之后才有可能。隨著Windows 2000發布日的臨近,ADSI最終必將統一目錄服務接口。作為Windows程序員,我們必須對此作好準備。本文對ADSI作了基本的介紹,文中提到的接口或者基本原則不會再變化,但個別細節有可能在新的版本中有所不同。請讀者在使用中注意這一點。