Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Delphi 開發實戰:透過 ADSI 存取與管理 Active Directory

編輯:Windows Server 教學

ADSI 技術架構與 Delphi 整合

Active Directory Service Interfaces (ADSI) 提供統一的 COM 介面存取多種目錄服務:WinNT (SAM)、LDAP、NDS (NetWare)、NWCOMPAT (NetWare 3.x)。Delphi 作為支援 COM 的開發工具,可透過匯入 Active DS Type Library (ActiveDs.tlb) 直接呼叫 ADSI 介式,實現網域使用者、群組、電腦、服務等資源的程式化管理。

核心開發步驟

1. 匯入類型庫建立封裝單元

專案 → 匯入類型庫 → 選擇 Active DS Type Library 1.0 → 產生 ActiveDs_TLB.pas 封裝單元,包含 IADsContainer、IADsUser、IADsGroup、IADsServiceOperations 等關鍵介面定義。

2. 綁定目錄物件:兩種認證模式

// 使用目前登入身分 (ADsGetObject)
OleCheck(ADsGetObject(PWideChar('WinNT://' + DomainName), 
  IID_IADsContainer, UnknownObject));

// 指定認證身分 (ADsOpenObject)
OleCheck(ADsOpenObject(PWideChar('WinNT://' + DomainName),
  PWideChar(UserName), PWideChar(Password), 0,
  IID_IADsContainer, UnknownObject));

3. 列舉網域子物件:使用者、群組、電腦

Enum := (Domain._NewEnum) as IEnumVariant;
while Enum.Next(1, ADsTempObj, Value) = S_OK do begin
  ADsObj := IUnknown(ADsTempObj) as IADs;
  case ADsObj.Class_ of
    'User':    AddUserToList(ADsObj);
    'Group':   AddGroupToList(ADsObj);
    'Computer': AddComputerToList(ADsObj);
  end;
end;

進階管理功能實作

建立/刪除本機使用者帳號

// 建立使用者
ComputerObj := GetComputerContainer(PDCName);
TempUserObj := ComputerObj.Create('user', NewUserName);
UserObj := TempUserObj as IADsUser;
UserObj.SetInfo;  // 送交變更

// 刪除使用者
ComputerObj.Delete('user', UserName);

群組成員管理

GroupObj := GetGroupObject(DomainName, GroupName);
Members := GroupObj.Members;
Enum := (Members._NewEnum) as IEnumVariant;
while Enum.Next(1, TempUserObj, Value) = S_OK do begin
  UserObj := IUnknown(TempUserObj) as IADsUser;
  // 列出成員屬性
end;
// 新增成員
GroupObj.Add(UserObj.ADsPath);
// 移除成員
GroupObj.Remove(UserObj.ADsPath);

Windows 服務控制

// 取得服務操作介面
ServiceObj := GetServiceObject(ComputerName, ServiceName) as IADsServiceOperations;

// 啟動服務
if ServiceObj.Get_Status = 1 then  // 1 = 停止狀態
  ServiceObj.Start;

// 停止服務
if ServiceObj.Get_Status = 2 then  // 2 = 執行狀態
  ServiceObj.Stop;

實戰注意事項

  • 錯誤處理:所有 ADSI 呼叫需包裹在 try..except 區塊,捕捉 EOleException 解析 HRESULT 錯誤碼
  • 介面查詢:善用 QueryInterface / as 運算子在不同介面間轉換
  • 效能優化:大量列舉時使用分頁搜尋 (paged search) 或 LDAP 篩選條件縮小範圍
  • 安全性:生產環境建議使用 LDAP 提供者 (LDAP://) 搭配 SSL/TLS 加密傳輸
  • 版本相容:WinNT 提供者不支援巢狀群組、通用群組等 AD 原生功能,完整功能請改用 LDAP 提供者

擴展應用方向

掌握 ADSI 基礎後,可進一步開發:自動化帳號佈建/離職流程、群組原則報表產生器、權限稽核工具、跨平台目錄同步方案等企業級身分管理應用。

Copyright © Windows教程網 All Rights Reserved