Delphi深度探索-活动目录开发


活动目录是 Windows NT 4.0 和 Windows 2000 使用的目录服务 。要想使用活动目录服务,需要调用 ADSI( 活动目录服务接口 )。ADSI 是一组以 COM 接口的形式提供目录服务的,程序员可以通过 ADSI 存取四种网络目录结构: WinNT (Microsoft SAM 数据库 ) 、 LDAP ( 轻量目录存取协议 ) 、 NDS (NetWare 目录服务 ) 和 NWCOMPAT (Novell NetWare 3.x)。
ADSI 可以使 Windows NT 管理员的工作变得轻松 。ADSI 支持管理员执行一些一般的管理任务,比如添加新用户、管理打印机、安全设定和控制 NT 域 。因为 ADSI 使用 COM 接口,任何支持 COM 的编程语言像 Delphi 、 BCB 、 VB 、 VC 等都可以调用 ADSI。
图 1.111
活动目录运行在 Windows NT 4.0 和 Windows 2000 上 。客户端程序可以运行在 Windows 95 、 Windows 98 、 Windows NT 4.0 和 Windows 2000 上 。为了使用 ADSI,必须安装 ADSI COM 接口 。ADSI 2.5 SDK 可以从 Microsoft ADSI 网址 http://www.microsoft.com/adsi 下载。SDK 包括文档、在线帮助和很多例子,不过不幸的是这些例子都是针对 VB 和 VC 的,这里我们将演示如何使用 Delphi 调用 ADSI。
程序演示
图 1.111 所示的程序演示了如何调用 WinNT provider 提供的功能 。演示程序用来连接到一个域,一旦连接到域,程序将会列出在 PDC 上找到的 NT 的用户和组以及域中的计算机 。同时这个程序还演示了如何察看域中计算机上的服务和察看、添加、删除 NT 组中的用户 。
使用 ADSI 控制 Windows NT/2000
ADSI 可以使我们控制用户、组、计算机、文件共享、打印任务、打印队列和服务等系统资源 。要想在 Delphi 中调用 ADSI,需要引入活动目录类型库,调用菜单 Project | Import Type Library 命令,选择 ActiveDs (Version 1.0) 点确认,Delphi 会生成相应的封装文件 。
绑定 Win NT 目录服务
连接 Win NT 目录服务就是找到域控制器然后绑定到相应的对象上 。绑定可以通过 ADsGetObject 或 ADsOpenObject 函数来实现 。ADsGetObject 函数声明如下:
function ADsGetObject(lpszPathName: PWideChar; const riid: TIID; out obj): HResult; stdcall; external "activeds.dll";
第一个参数是对象的路径名,第二个参数是对象的接口标识符,第三个参数用于返回得到的被请求的接口指针 。缺省条件下,函数根据当前用户进行安全认证 。
ADsOpenObject 函数在不同的安全认证机制下绑定 ADSI 对象,它主要是通过调用参数返回的用户名和口令来认证的 。函数声明如下:
function ADsOpenObject(lpszPathName: PWideChar; lpszUserName: PWideChar; lpszPassWord: PWideChar; dwReserved: LongInt; const riid: TIID; out obj): HResult; stdcall; external "activeds.dll";
第一个参数意义同上,第二、三个参数是调用者提供的用户名和口令,第四个参数是一个保留的 provider 标识,用来确定绑定的认证方法,第五个参数是请求接口的接口标识符,最后一个参数用来返回请求的接口指针 。
第一个函数使用登录用户缺省的信任级别,而第二个函数允许开发者指定特殊的安全信任机制来绑定 ADSI 对象 。下面代码演示了两种不同的绑定方式:
procedure TMainFrm.actOpenWinNTExecute(Sender: TObject);
var
UnknownObject: IUnknown;
DomainPath: WideString;
Domain: IADsContainer;
begin
// 指定域路径
DomainPath := "WinNT://"ADSIDomainName.Text;
// 如果使用用户登录了信息
if cbUseLogin.Checked then
// 使用用户登录的信息创建域对象
OleCheck(AdsOpenObject(PWideChar(DomainPath),
PWideChar(ADSIUsername.Text),
PWideChar(ADSIPassword.Text), 0, IID_IADsContainer,
UnknownObject));
else
OleCheck(ADsGetObject(PWideChar(DomainPath),
IID_IADsContainer, UnknownObject));

推荐阅读