自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Delphi深度探索:活動(dòng)目錄開發(fā)一

系統(tǒng) Windows
ADSI 可以使 Windows NT 管理員的工作變得輕松,而ADSI即活動(dòng)目錄服務(wù)接口是想要使用活動(dòng)目錄服務(wù)的必要途徑,本文就是介紹了對(duì)活動(dòng)目錄的使用。

活動(dòng)目錄是 Windows NT 4.0 和 Windows 2000 使用的目錄服務(wù)。要想使用活動(dòng)目錄服務(wù),需要調(diào)用 ADSI( 活動(dòng)目錄服務(wù)接口 ) 。 ADSI 是一組以 COM 接口的形式提供目錄服務(wù)的,程序員可以通過 ADSI 存取四種網(wǎng)絡(luò)目錄結(jié)構(gòu): WinNT (Microsoft SAM 數(shù)據(jù)庫 ) 、 LDAP ( 輕量目錄存取協(xié)議 ) 、 NDS (NetWare 目錄服務(wù) ) 和 NWCOMPAT (Novell NetWare 3.x) 。

ADSI 可以使 Windows NT 管理員的工作變得輕松。 ADSI 支持管理員執(zhí)行一些一般的管理任務(wù),比如添加新用戶、管理打印機(jī)、安全設(shè)定和控制 NT 域。因?yàn)?ADSI 使用 COM 接口,任何支持 COM 的編程語言像 Delphi 、 BCB 、 VB 、 VC 等都可以調(diào)用 ADSI 。

Delphi深度探索:活動(dòng)目錄開發(fā)一

圖 1.111

 

活動(dòng)目錄運(yùn)行在 Windows NT 4.0 和 Windows 2000 上??蛻舳顺绦蚩梢赃\(yùn)行在 Windows 95 、 Windows 98 、 Windows NT 4.0 和 Windows 2000 上。為了使用 ADSI ,必須安裝 ADSI COM 接口。 ADSI 2.5 SDK 可以從 Microsoft ADSI 網(wǎng)址 http://www.microsoft.com/adsi 下載 。 SDK 包括文檔、在線幫助和很多例子,不過不幸的是這些例子都是針對(duì) VB 和 VC 的,這里我們將演示如何使用 Delphi 調(diào)用 ADSI 。

程序演示

圖 1.111 所示的程序演示了如何調(diào)用 WinNT provider 提供的功能。演示程序用來連接到一個(gè)域,一旦連接到域,程序?qū)?huì)列出在 PDC 上找到的 NT 的用戶和組以及域中的計(jì)算機(jī)。同時(shí)這個(gè)程序還演示了如何察看域中計(jì)算機(jī)上的服務(wù)和察看、添加、刪除 NT 組中的用戶。

使用 ADSI 控制 Windows NT/2000

ADSI 可以使我們控制用戶、組、計(jì)算機(jī)、文件共享、打印任務(wù)、打印隊(duì)列和服務(wù)等系統(tǒng)資源。要想在 Delphi 中調(diào)用 ADSI ,需要引入活動(dòng)目錄類型庫,調(diào)用菜單 Project | Import Type Library 命令,選擇 ActiveDs (Version 1.0) 點(diǎn)確認(rèn), Delphi 會(huì)生成相應(yīng)的封裝文件。

1.綁定 Win NT 目錄服務(wù)

連接 Win NT 目錄服務(wù)就是找到域控制器然后綁定到相應(yīng)的對(duì)象上。綁定可以通過 ADsGetObject 或 ADsOpenObject 函數(shù)來實(shí)現(xiàn)。 ADsGetObject 函數(shù)聲明如下:

function ADsGetObject(lpszPathName: PWideChar; const riid: TIID; out obj): HResult; stdcall; external 'activeds.dll';

第一個(gè)參數(shù)是對(duì)象的路徑名,第二個(gè)參數(shù)是對(duì)象的接口標(biāo)識(shí)符,第三個(gè)參數(shù)用于返回得到的被請(qǐng)求的接口指針。缺省條件下,函數(shù)根據(jù)當(dāng)前用戶進(jìn)行安全認(rèn)證。

ADsOpenObject 函數(shù)在不同的安全認(rèn)證機(jī)制下綁定 ADSI 對(duì)象,它主要是通過調(diào)用參數(shù)返回的用戶名和口令來認(rèn)證的。函數(shù)聲明如下:

function ADsOpenObject(lpszPathName: PWideChar; lpszUserName: PWideChar; lpszPassword: PWideChar; dwReserved: LongInt; const riid: TIID; out obj): HResult; stdcall; external 'activeds.dll';

第一個(gè)參數(shù)意義同上,第二、三個(gè)參數(shù)是調(diào)用者提供的用戶名和口令,第四個(gè)參數(shù)是一個(gè)保留的 provider 標(biāo)識(shí),用來確定綁定的認(rèn)證方法,第五個(gè)參數(shù)是請(qǐng)求接口的接口標(biāo)識(shí)符,最后一個(gè)參數(shù)用來返回請(qǐng)求的接口指針。

第一個(gè)函數(shù)使用登錄用戶缺省的信任級(jí)別,而第二個(gè)函數(shù)允許開發(fā)者指定特殊的安全信任機(jī)制來綁定 ADSI 對(duì)象。下面代碼演示了兩種不同的綁定方式:

  1. procedure TMainFrm.actOpenWinNTExecute(Sender: TObject);   
  2.  
  3. var   
  4.  
  5. UnknownObject: IUnknown;   
  6.  
  7. DomainPath: WideString;   
  8.  
  9. Domain: IADsContainer;   
  10.  
  11. begin   
  12.  

// 指定域路徑

  1. DomainPath :'WinNT://' + ADSIDomainName.Text;   
  2.  

// 如果使用用戶登錄了信息

  1. if cbUseLogin.Checked then   
  2.  

// 使用用戶登錄的信息創(chuàng)建域?qū)ο?/p>

  1. OleCheck(AdsOpenObject(PWideChar(DomainPath),   
  2.  
  3. PWideChar(ADSIUsername.Text),   
  4.  
  5. PWideChar(ADSIPassword.Text), 0, IID_IADsContainer,   
  6.  
  7. UnknownObject));   
  8.  
  9. else   
  10.  
  11. OleCheck(ADsGetObject(PWideChar(DomainPath),   
  12.  
  13. IID_IADsContainer, UnknownObject));   
  14.  
  15. // 設(shè)定域?qū)ο?nbsp;  
  16.  
  17. Domain :UnknownObject as IADsContainer;   
  18.  
  19. // 從域中獲得信息列表   
  20.  
  21. GetDomainInformation(Domain);   
  22.  
  23. end;   
  24.  

下面我們需要聲明三個(gè)變量 :

第一個(gè)是接口變量 , 用來綁定由指定的對(duì)象路徑返回的函數(shù)。

UnknownObject: IUnknown;

第二個(gè)參數(shù)是 WideString 類型的變量 , 用來在綁定函數(shù)中產(chǎn)生一個(gè)對(duì)象路徑。

DomainPath: WideString;

第三是一個(gè) IADsContainer 接口類型變量 , 用來保存返回的接口變量。

Domain: IADsContainer;

IADsContainer 變量將被用來從指定的 ADSI 對(duì)象中獲得全部用戶、組和計(jì)算機(jī)。當(dāng)然也可以使用 IADsDomain 類型的變量,但它不適合枚舉域中的子對(duì)象。

下面指定想要獲得的對(duì)象路徑 , 如果域名是 "PRISMA" , 要想獲得 ADSI 對(duì)象 , 就需要指定路徑為 "WinNT://PRISMA" :

// 設(shè)定域名路徑

DomainPath := 'WinNT://' + ADSIDomainName.Text;

下面代碼使用不同的安全認(rèn)證方式:

// 如果使用登錄信息

if cbUseLogin.Checked then

// 使用登錄并創(chuàng)建域?qū)ο?/p>

  1. OleCheck(AdsOpenObject(PWideChar(DomainPath),   
  2.  
  3. PWideChar(ADSIUsername.Text),   
  4.  
  5. PWideChar(ADSIPassword.Text), 0, IID_IADsContainer,   
  6.  
  7. UnknownObject));   
  8.  
  9. else   
  10.  
  11. // 創(chuàng)建域?qū)ο?nbsp;  
  12.  
  13. OleCheck(ADsGetObject(PWideChar(DomainPath),   
  14.  
  15. IID_IADsContainer, UnknownObject));   
  16.  
  17. 然后我們獲取 IADsContainer 指針,以便查詢域中的子對(duì)象:   
  18.  
  19. // 獲取域?qū)ο?nbsp;  
  20.  
  21. Domain :UnknownObject as IADsContainer;   
  22.  
  23. 最后 , 把 IADsContainer 接口指針作為參數(shù)調(diào)用來獲得域中的子對(duì)象 :   
  24.  
  25. GetDomainInformation(Domain);   
  26.  

在域中查找

要想在域中查找子對(duì)象 , 可以使用 GetDomainInformation 過程 , 代碼如下 :

// 獲取域信息

  1. procedure TMainFrm.GetDomainInformation(   
  2.  
  3. Domain: IADsContainer);   
  4.  
  5. var   
  6.  
  7. Enum: IEnumVariant;   
  8.  
  9. ADsTempObj: OLEVariant;   
  10.  
  11. ADsObj: IADs;   
  12.  
  13. Value: LongWord;   
  14.  
  15. begin   
  16.  
  17. // 清空用戶、組和計(jì)算機(jī)列表   
  18.  
  19. UserListView.Items.Clear;   
  20.  
  21. GroupListView.Items.Clear;   
  22.  
  23. ComputerListView.Items.Clear;   
  24.  
  25. // 獲取枚舉對(duì)象   
  26.  
  27. Enum := (Domain._NewEnum) as IEnumVariant;   
  28.  
  29. // 利用枚舉對(duì)象查找   
  30.  
  31. while (Enum.Next(1, ADsTempObj, Value) = S_OK) do begin   
  32.  
  33. // 獲得臨時(shí)對(duì)象   
  34.  
  35. ADsObj :IUnknown(ADsTempObj) as IADs;   
  36.  
  37. // 如果是用戶對(duì)象   
  38.  
  39. if AdsObj.Class_ = 'User' then   
  40.  
  41. AddUserToList(ADsObj);   
  42.  
  43. // 如果是組對(duì)象   
  44.  
  45. if AdsObj.Class_ = 'Group' then   
  46.  
  47. AddGroupToList(ADsObj);   
  48.  
  49. // 如果是計(jì)算機(jī)對(duì)象   
  50.  
  51. if AdsObj.Class_ = 'Computer' then   
  52.  
  53. AddComputerToList(ADsObj);   
  54.  
  55. end;   
  56.  
  57. end;   
  58.  

下面是對(duì)程序流程的詳細(xì)說明,首先獲得枚舉對(duì)象,并賦值給 Enum 變量:

Enum := (Domain._NewEnum) as IEnumVariant;

然后利用枚舉變量進(jìn)行查找并把每個(gè)子對(duì)象賦值給臨時(shí)的 OLEVariant 對(duì)象:

while (Enum.Next(1, ADsTempObj, Value) = S_OK) do begin

OLEVariant 變量賦值給 ADSI 對(duì)象

ADsObj := IUnknown(ADsTempObj) as IADs;

獲得 ADSI 對(duì)象后,開始檢查對(duì)象類,根據(jù)對(duì)象類別把 ADSI 分別處理,并把不同 ADSI 對(duì)象的屬性添加到各自的列表視圖中去:

// 如果是用戶對(duì)象

if AdsObj.Class_ = 'User' then

AddUserToList(ADsObj);

// 如果是組對(duì)象

if AdsObj.Class_ = 'Group' then

AddGroupToList(ADsObj);

// 如果是計(jì)算機(jī)對(duì)象

Delphi深度探索:活動(dòng)目錄開發(fā)一

圖 1.112 

if AdsObj.Class_ = 'Computer' then AddComputerToList(ADsObj);

運(yùn)行結(jié)果如 圖 1.112 所示。

更多內(nèi)容點(diǎn)擊Delphi深度探索:活動(dòng)目錄開發(fā)二

【編輯推薦】

  1. 活動(dòng)目錄用戶如何管理?
  2. 活動(dòng)目錄中的對(duì)象如何操作?
  3. 活動(dòng)目錄災(zāi)難管理員應(yīng)該如何應(yīng)對(duì)
  4. 讓活動(dòng)目錄在復(fù)制過程中更好地運(yùn)行
  5. 用ADSI實(shí)現(xiàn)自動(dòng)化的活動(dòng)目錄操作方法
責(zé)任編輯:韓亞珊 來源: 中科軟件園
相關(guān)推薦

2011-07-19 16:34:21

活動(dòng)目錄ADSI

2010-11-01 05:54:41

2010-04-15 11:39:22

微軟活動(dòng)目錄基礎(chǔ)

2011-08-08 09:17:32

活動(dòng)目錄ActiveDirec

2011-08-18 09:46:40

活動(dòng)目錄驗(yàn)證原理

2024-07-20 00:00:00

2017-10-25 11:17:18

數(shù)據(jù)

2011-07-12 16:22:31

活動(dòng)目錄

2010-04-15 11:47:37

微軟活動(dòng)目錄邏輯結(jié)構(gòu)

2011-06-27 09:42:46

2011-07-15 10:20:34

活動(dòng)目錄

2010-04-25 23:13:26

活動(dòng)目錄物理結(jié)構(gòu)

2011-01-05 10:30:42

活動(dòng)目錄Powershell

2010-10-22 11:01:42

Windows Pow

2012-03-20 14:17:33

活動(dòng)目錄

2010-08-30 15:57:25

2011-07-15 13:35:52

Windows 200

2009-07-16 09:48:29

數(shù)據(jù)庫連接

2009-02-19 17:01:35

Windows 200數(shù)據(jù)挖掘活動(dòng)目錄

2011-11-04 09:35:58

活動(dòng)目錄
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)