Delphi深度探索:活动目录开发二

系统 Windows
ADSI 可以使 Windows NT 管理员的工作变得轻松,而ADSI即活动目录服务接口是想要使用活动目录服务的必要途径,本文就是介绍了对活动目录的使用。

继上文Delphi深度探索:活动目录开发一,本文接着介绍活动目录的开发。

创建或删除计算机用户

通过 WinNT provider ,可以创建或删除域中任意一台计算机的用户,要想创建一个域中指定的计算机的用户,需要绑定到指定的计算机上。一旦要绑定到计算机对应的 ADSI 容器对象,就需要调用 Create 方法。容器对象的 Create 方法需要两个参数,一个是要创建的 ADSI 对象的类别,一个是要用来描述 ADSI 对象的名字。调用 Create 方法后会返回新的 ADSI 对象的引用参考,下面代码演示了如何创建一个用户:

var

ComputerObj: IADsContainer;

TempUserObj: IUnknown;

UserObj: IADsUser;

PDCName: WideString;

NewUserName: WideString;

AdsPath: WideString;

begin

// 获取用户信息

PDCName := InputBox(' 创建新用户 ', ' 请输入域名 : ', '');

NewUserName := InputBox(' 创建新用户 ', ' 请输入用户名 : ', '');

// 指定域名路径

AdsPath := 'WinNT://' + PDCName + ',computer';

// 创建计算机对象

OleCheck(AdsGetObject(PWideChar(AdsPath),

IID_IADsContainer, ComputerObj));

// 创建新用户

TempUserObj := ComputerObj.Create('user', NewUserName);

UserObj := TempUserObj as IADsUser;

// 设定目录信息

UserObj.SetInfo;

// 刷新列表

actOpenWinNT.Execute;

删除用户也非常类似 , 只不过不需要创建任何的用户对象 , 可直接调用容器对象 IADsContainer 接口的 Delete 方法 , Delete 方法需要两个参数 , 第一个是要删除的对象类别 , 第二个是对象名称 , 代码示意如下 :

var

ComputerObj: IADsContainer;

PDCName: WideString;

UserName: WideString;

AdsPath: WideString;

begin

// 获取用户信息

PDCName := InputBox(' 删除用户 ', ' 请输入域名 ', '');

UserName := InputBox(' 删除用户 ', ' 请输入要删除的用户名 : ', '');

if MessageDlg(' 你是否确信要删除用户 : ' +UserName + ' ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then

begin

// 指定域名路径

AdsPath := 'WinNT://' + PDCName + ',computer';

// 创建计算机对象

OleCheck(AdsGetObject(PWideChar(AdsPath),

IID_IADsContainer, ComputerObj));

// 删除用户

ComputerObj.Delete('user', UserName);

// 刷新列表

actOpenWinNT.Execute;

end;

end

查看组中的用户

通过 WinNT provider ,我们还可以执行各种用户组的维护任务,比如从组中添加或删除用户。下面就来演示如何枚举组中的用户并察看用户相关信息。首先让下面代码获得一个 IADsGroup 对象,然后使用 IADsMember 对象来枚举 IADsGroup 对象中所有用户对象,列出不同组中的所有用户:

var

GroupObj: IADsGroup;

Members: IADsMembers;

AdsPath: WideString;

Enum: IEnumVariant;

TempUserObj: OLEVariant;

UserObj: IADsUser;

TempListObj: TListItem;

Value: LongWord;

begin

// 清空列表

GroupListView.Items.Clear;

// 指定域名路径

AdsPath := 'WinNT://' + MainFrm.ADSIDomainName.Text +'/' + GroupName;

// 创建组对象

OLECheck(AdsGetObject(PWideChar(AdsPath), IID_IADsGroup,

GroupObj));

// 获得 members 对象

Members := GroupObj.Members;

// 获取枚举对象

Enum := (Members._NewEnum) as IEnumVariant;

// 使用枚举对象进行查找

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

try

// 保存临时对象

UserObj := IUnknown(TempUserObj) as IADsUser;

// 创建新的列表项

TempListObj := GroupListView.Items.Add;

// 指定属性

TempListObj.Caption := UserObj.Name;

except

on E:Exception do

Delphi深度探索:活动目录开发二

图 1.113
 

end;

IADsGroup 接口是用来管理 NT 组信息的接口,而它的 Members 属性是一个管理组中用户或 ADSI 对象列表的接口。最后使用 IADsUser 接口变量 UserObj 来获得 NT 组中的用户信息。

程序运行结果如图 1.113 所示。

控制 NT 服务

WinNT provider 还可以用来控制 NT 服务、服务器和工作站 , 下面的代码遍历 NT 服务 , 并根据相应的计算机添加服务到相应列表中 :

var

UnknownObject: IUnknown;

Computer: IADsContainer;

ComputerPath: WideString;

Enum: IEnumVariant;

AdsTempObj: OLEVariant;

AdsObj: IADs;

Value: LongWord;

begin

if Item.Caption = '' then

Exit;

// 指定域名路径

ComputerPath := 'WinNT://' + ADSIDomainName.Text +'/' + Item.Caption;

// 创建计算机对象

OleCheck(ADsGetObject(PWideChar(ComputerPath),

IID_IADsComputer, UnknownObject));

// 获得计算机容器接口

Computer := UnknownObject as IADsContainer;

// 清空服务视图列表

ServiceListView.Items.Clear;

// 获取枚举对象用于遍历

Enum := (Computer._NewEnum) as IEnumVariant;

// 用枚举对象进行查找

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

// 保存临时对象

ADsObj := IUnknown(ADsTempObj) as IADs;

// 如果对象为服务的话 ,添加到视图中

if AdsObj.Class_ = 'Service' then

AddServiceToList(ADsObj);

end;

end.

要想获得 NT 服务的信息,需要绑定服务对应的 ADSI 对象, ADSI 提供了 IADsService 对象来维护 NT 服务的信息,下面代码演示了如何绑定 NT 服务,并显示服务名:

var

ServiceObj: IADsService;

AdsPath: WideString;

begin

// 指定域名路径

AdsPath := 'WinNT://' + ComputerName + '/' + ServiceName;

// 获得服务对象

OLECheck(ADsGetObject(PWideChar(AdsPath),

IID_IADsService, ServiceObj));

// 获得服务名

lblServiceName.Caption := ' 服务名 : ' + ServiceName;

lblDisplayName.Caption := ' 服务显示名称 : ' +

ServiceObj.Get_DisplayName;

要想启动或停止 NT 服务 , 可以使用 IADsServiceOperations ADSI 对象。同上面一样需要先绑定到 NT 服务上去,而同前面不一样的是,这回不是获得 IADsService ADSI 对象,而是获得 IADsServiceOperations ADSI 对象:

// 创建计算机对象

OleCheck(AdsGetObject(PWideChar(AdsPath),

IID_IADsServiceOperations, Result));

然后使用 GetServiceObj 函数来绑定到 IADsServiceOperations ADSI 对象上 , 并返回 IADsServiceOperations 接口 :

// 获得服务对象

ServiceObj := GetServiceObj;

启动服务需要调用 IADsServiceOperations 接口的 Start 方法:

Delphi深度探索:活动目录开发二

图 1.114
 

// 启动服务 , Get_Status = 1 表明服务正处于停止状态

if ServiceObj.Get_Status = 1 then

ServiceObj.Start;

要停止服务需要调用 IADsServiceOperations ADSI 对象的 Stop 方法 , 运行结果如图 1.114 所示。

结论

毫无疑问,通过 ADSI 目录服务,调用 WinNT provider 可以更容易实现 NT 的管理功能,但它也是一个庞大的系统,光 Windows 的活动目录编程参考就有上千页,说明我们必须花费大量时间才能真正掌握它的精髓。

希望本系列Delphi深度探索—活动目录开发的内容能够对读者有所帮助。

【编辑推荐】

  1. 活动目录用户如何管理?
  2. 活动目录中的对象如何操作?
  3. 活动目录灾难管理员应该如何应对
  4. 让活动目录在复制过程中更好地运行
  5. 用ADSI实现自动化的活动目录操作方法
责任编辑:韩亚珊 来源: 中科软件园
相关推荐

2011-07-19 16:28:55

活动目录ADSI

2010-11-01 05:54:41

2011-08-18 09:46:40

活动目录验证原理

2011-08-08 09:17:32

活动目录ActiveDirec

2010-04-15 11:39:22

微软活动目录基础

2017-10-25 11:17:18

数据

2010-04-15 11:47:37

微软活动目录逻辑结构

2011-07-12 16:22:31

活动目录

2012-03-20 14:17:33

活动目录

2011-07-15 13:35:52

Windows 200

2010-08-30 15:57:25

2011-06-27 09:42:46

2010-10-22 11:01:42

Windows Pow

2011-01-05 10:30:42

活动目录Powershell

2011-07-15 10:20:34

活动目录

2010-04-25 23:13:26

活动目录物理结构

2009-07-16 09:48:29

数据库连接

2021-09-01 14:45:08

服务器数据PostgreSQL

2010-09-29 11:10:35

活动目录AD

2011-07-19 09:30:58

活动目录复制
点赞
收藏

51CTO技术栈公众号