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


// 设定域对象
Domain := UnknownObject as IADsContainer;
// 从域中获得信息列表
GetDomainInformation(Domain);
end;
下面我们需要声明三个变量 :
第一个是接口变量 , 用来绑定由指定的对象路径返回的函数 。
UnknownObject: IUnknown;
第二个参数是 WideString 类型的变量,用来在绑定函数中产生一个对象路径 。
DomainPath: WideString;
第三是一个 IADsContainer 接口类型变量,用来保存返回的接口变量 。
Domain: IADsContainer;
IADsContainer 变量将被用来从指定的 ADSI 对象中获得全部用户、组和计算机 。当然也可以使用 IADsDomain 类型的变量,但它不适合枚举域中的子对象 。
下面指定想要获得的对象路径,如果域名是 "PRISMA",要想获得 ADSI 对象,就需要指定路径为 "WinNT://PRISMA" :
// 设定域名路径
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));
然后我们获取 IADsContainer 指针,以便查询域中的子对象:
// 获取域对象
Domain := UnknownObject as IADsContainer;
最后,把 IADsContainer 接口指针作为参数调用来获得域中的子对象 :
GetDomainInformation(Domain);
在域中查找
要想在域中查找子对象,可以使用 GetDomainInformation 过程,代码如下 :
// 获取域信息
procedure TMainFrm.GetDomainInformation(
Domain: IADsContainer);
var
Enum: IEnumVariant;
ADsTempObj: OLEVariant;
ADsObj: IADs;
Value: LongWord;
begin
// 清空用户、组和计算机列表
UserListView.Items.Clear;
GroupListView.Items.Clear;
ComputerListView.Items.Clear;
// 获取枚举对象
Enum := (Domain._NewEnum) as IEnumVariant;
// 利用枚举对象查找
while (Enum.Next(1, ADsTempObj, Value) = S_OK) do begin
// 获得临时对象
ADsObj := IUnknown(ADsTempObj) as IADs;
// 如果是用户对象
if AdsObj.Class_ = "User" then
AddUserToList(ADsObj);
// 如果是组对象
if AdsObj.Class_ = "Group" then
AddGroupToList(ADsObj);
// 如果是计算机对象
if AdsObj.Class_ = "Computer" then
AddComputerToList(ADsObj);
end;
end;
下面是对程序流程的详细说明,首先获得枚举对象,并赋值给 Enum 变量:
Enum := (Domain._NewEnum) as IEnumVariant;
然后利用枚举变量进行查找并把每个子对象赋值给临时的 OLEVariant 对象:
【Delphi深度探索-活动目录开发】while (Enum.Next(1, ADsTempObj, Value) = S_OK) do begin
OLEVariant 变量赋值给 ADSI 对象
ADsObj := IUnknown(ADsTempObj) as IADs;
获得 ADSI 对象后,开始检查对象类,根据对象类别把 ADSI 分别处理,并把不同 ADSI 对象的属性添加到各自的列表视图中去:
// 如果是用户对象
if AdsObj.Class_ = "User" then
AddUserToList(ADsObj);
// 如果是组对象
if AdsObj.Class_ = "Group" then
AddGroupToList(ADsObj);
// 如果是计算机对象
图 1.112
if AdsObj.Class_ = "Computer" then AddComputerToList(ADsObj);
运行结果如 图 1.112 所示 。
创建或删除计算机用户
通过 WinNT provider,可以创建或删除域中任意一台计算机的用户,要想创建一个域中指定的计算机的用户,需要绑定到指定的计算机上 。一旦要绑定到计算机对应的 ADSI 容器对象,就需要调用 Create 方法 。容器对象的 Create 方法需要两个参数,一个是要创建的 ADSI 对象的类别,一个是要用来描述 ADSI 对象的名字 。调用 Create 方法后会返回新的 ADSI 对象的引用参考,下面代码演示了如何创建一个用户:

推荐阅读