在Delphi中使用ADSI需要导入活动目录类型库,具体操作如下:在IDE中选择菜单“Project->Import Type Library”,在弹出的对话框中选择“Active Ds Type Libarary(version 1.0)”,单击“Create Unit”,Delphi会自动产生封装单元文件。只要在相应文件中引用该单元文件即可使用ADSI了。下面给出一个在Delphi6中使用ADSI访问Windows Server活动目录信息的示例代码。
unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ActiveDs_TLB, ActiveX, ComObj, ComCtrls, StdCtrls; type TForm2 =class(TForm) GroupBox1: TGroupBox; lvGroup: TListView; GroupBox2: TGroupBox; lvUser: TListView; Button1: TButton; procedure Button1Click(Sender: TObject); private ...{ Private declarations } function GetObject(const Name: String): IDispatch; procedure EnumerateUsers(Container: IAdsContainer); procedure AddGroupToListView(AGroup: IADsGroup); procedure AddUserToListView(AUser: IAdsUser); public ...{ Public declarations } end; var Form2: TForm2; implementation ...{$R *.dfm} ...{ TForm2 } procedure TForm2.AddGroupToListView(AGroup: IADsGroup); begin lvGroup.Items.Add.Caption := AGroup.Name; end; procedure TForm2.AddUserToListView(AUser: IAdsUser); begin with lvUser.Items.Add do begin Caption := AUser.FullName; SubItems.Add(VarToStr(AUser.Get('sAMAccountName'))); end; end; procedure TForm2.EnumerateUsers(Container: IAdsContainer); var ADsObj: IADs; Value: LongWord; Enum: IEnumVariant; ADsTempOjb: OleVariant; begin Enum :=(Container._NewEnum) as IEnumVariant; while (Enum.Next(1, ADsTempOjb, Value) = S_OK) do begin ADsObj := IUnknown(ADsTempOjb) as IADs; try if SameText(ADsObj.Class_, 'Group') then begin AddGroupToListView(ADsObj as IADsGroup); EnumerateUsers(ADsObj as IAdsContainer); end elseif SameText(ADsObj.Class_, 'User') then AddUserToListView(ADsObj as IADsUser); except end; end; end; function TForm2.GetObject(const Name: String): IDispatch; var Eaten: Integer; Moniker: IMoniker; BindContext: IBindCtx; begin OleCheck(CreateBindCtx(0, BindContext)); OleCheck(MkParseDisplayName(BindContext, PWideChar(WideString(Name)), Eaten, Moniker)); OleCheck(Moniker.BindToObject(BindContext, Nil, IDispatch, Result)); end; procedure TForm2.Button1Click(Sender: TObject); var Container: IADsContainer; begin Container := GetObject('LDAP://OU=Suzhou,OU=root,DC=ap,DC=emersonclimate,DC=org') as IADsContainer; lvGroup.Items.BeginUpdate; lvUser.Items.BeginUpdate; try Button1.Enabled := False; EnumerateUsers(Container); Button1.Enabled := True; finally lvGroup.Items.EndUpdate; lvUser.Items.EndUpdate; end; Container._Release; end; end.