在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') asIADsUser;
// 檢查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;