WEB开发网
开发学院软件开发Delphi 在Delphi中ADSI创建Windows用户帐号 阅读

在Delphi中ADSI创建Windows用户帐号

 2006-02-04 13:43:28 来源:WEB开发网   
核心提示: 在Delphi中可以使用微软的ADSI(活动目录服务接口)创建Windows用户帐号,可能是由于ADSI的名字,在Delphi中ADSI创建Windows用户帐号,许多人以为ADSI只能在Windows 2000下使用,实际上所有Win32平台都支持ADSI,... uses ActiveX, // 使用了COM
    在Delphi中可以使用微软的ADSI(活动目录服务接口)创建Windows用户帐号。可能是由于ADSI的名字,许多人以为ADSI只能在Windows 2000下使用,实际上所有Win32平台都支持ADSI。可能需要下载ADSI为不同的Windows版本。(更多详细资料http://www.microsoft.com/china/windows2000/library/howitworks/activedirectory/adsilinks.htm)。Windows 2000 包含ADSI。

   ADSI是一个很大的话题。在这篇文章中我只粗略的介绍一下。ADSI是一类为许多不同计算机服务(大部分基于目录)的通用接口。一些标准的ADSI提供者(PRovider就像可以在你的程序中使用的COM接口)有WinNT,IIS,LDAP和NDS。使用WinNT提供者(Provider)能创建、修改用户帐号,设置或修改组。

   下面的小程序展示了在NT/2000下使用ADSI创建用户帐号必要的步骤:

   首先你需要导入ADSI类库(Project/Import Type Library菜单)。该类库可以在system32子目录中找到(如 C:\WINNT\system32\activeds.tlb)。文件名必须是“ activeds.tlb”。如果找不到该文件,你需要正确的安装ADSI。在成功导入类库以后,可以在Delphi的Imports目录下找到activeds_tlb.pas这样一个文件(如 ..\Delphi6\Imports\activeds_tlb.pas)。还需要这个文件包含在你的Uses语句,让ADSI可以在Delphi程序中使用。

下面是ADSI创建用户的例子。需要用你将要创建用户的真正的计算机名称替换[computername]。同样[accountname]是要创建的用户帐号。在WindowNT 4.0和Windows 2000中测试通过。

...

uses ActiveX,     // 使用了COM Moniker实例
   ActiveDs_TLB,  // 已创建的类库
   ComObj;     // 使用了OleCheck和其他COM函数

implementation

procedure TForm1.BtnCreateUserClick(Sender: TObject);
var
  Usr:  IADsUser;
  Comp: IADsContainer;
begin
  try
   Comp := GetObject('WinNT://[computername],computer') as
    IADsContainer;
   Usr := Comp.Create('user', '[accountname]') as IADsUser;
   Usr.SetInfo;
  except
   on E: EOleException do begin
    ShowMessage(E.Message);
   end;
  end;
end;


procedure TForm1.BtnSetPassWordClick(Sender: TObject);
var
  Usr: IADsUser;
begin
  try
   Usr := GetObject('WinNT://[computername]/[accountname],user')
    as IADsUser;
   Usr.SetPassword('thenewpassword');
  except
   on E: EOleException do begin
    ShowMessage(E.Message);
   end;
  end;
end;


// GetObject是在Usenet上找到的VB代码(GetObject)。
//
// GetObject能使用“ADSipath”(如WinNT://....或IIS://localhost)
// 和现有的ADSI提供者捆绑在一起

function TForm1.GetObject(const Name: string): IDispatch;
var
  Moniker: IMoniker;
  Eaten: integer;
  BindContext: IBindCtx;
  Dispatch: IDispatch;
begin
  OleCheck(CreateBindCtx(0, BindContext));
  OleCheck(MkParseDisplayName(BindContext,
                PWideChar(WideString(Name)),
                Eaten,
                Moniker));
  OleCheck(Moniker.BindToObject(BindContext, NIL, IDispatch,
       Dispatch));

  Result := Dispatch;
end;

end.

   也可以使用ADSI修改用户帐号的设置。下列代码能改变任何帐号的“密码永不过期”选项。

procedure TFormMain.ButtonNeverExpiresClick(Sender: TObject);
var
  Usr: IADsUser;
begin
  try
   Usr := GetObject('WinNT://[computername]/[acccoutname],user') as IADsUser; 
                 // 检查Checkbox的状态
  if CheckBoxPasswordNeverExpires.Checked then
   Usr.Put('UserFlags', Usr.Get('UserFlags') OR 65536) 
 // 65536在微软ADSI SDK的iads.h中被定义为UF_DONT_EXPIRE_PASSWORD
  else
   Usr.Put('UserFlags', Usr.Get('UserFlags') XOR 65536); 
   Usr.SetInfo;

  except
   on E: EOleException do begin
    ShowMessage(E.Message);
   end;
  end;
end;

Tags:Delphi ADSI 创建

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接