本文为【Delphi深度探索-活动目录开发】的汉字拼音对照版显示拼音
活huo动dong目mu录lu是shi Windows NT 4.0 和he Windows 2000 使shi用yong的de目mu录lu服fu务wu。要yao想xiang使shi用yong活huo动dong目mu录lu服fu务wu,需xu要yao调tiao用yong ADSI( 活huo动dong目mu录lu服fu务wu接jie口kou ) 。 ADSI 是shi一yi组zu以yi COM 接jie口kou的de形xing式shi提ti供gong目mu录lu服fu务wu的de,程cheng序xu员yuan可ke以yi通tong过guo ADSI 存cun取qu四si种zhong网wang络luo目mu录lu结jie构gou: WinNT (Microsoft SAM 数shu据ju库ku ) 、 LDAP ( 轻qing量liang目mu录lu存cun取qu协xie议yi ) 、 NDS (NetWare 目mu录lu服fu务wu ) 和he NWCOMPAT (Novell NetWare 3.x) 。
ADSI 可ke以yi使shi Windows NT 管guan理li员yuan的de工gong作zuo变bian得de轻qing松song。 ADSI 支zhi持chi管guan理li员yuan执zhi行xing一yi些xie一yi般ban的de管guan理li任ren务wu,比bi如ru添tian加jia新xin用yong户hu、管guan理li打da印yin机ji、安an全quan设she定ding和he控kong制zhi NT 域yu。因yin为wei ADSI 使shi用yong COM 接jie口kou,任ren何he支zhi持chi COM 的de编bian程cheng语yu言yan像xiang Delphi 、 BCB 、 VB 、 VC 等deng都dou可ke以yi调tiao用yong ADSI 。
图tu 1.111
活huo动dong目mu录lu运yun行xing在zai Windows NT 4.0 和he Windows 2000 上shang。客ke户hu端duan程cheng序xu可ke以yi运yun行xing在zai Windows 95 、 Windows 98 、 Windows NT 4.0 和he Windows 2000 上shang。为wei了le使shi用yong ADSI ,必bi须xu安an装zhuang ADSI COM 接jie口kou。 ADSI 2.5 SDK 可ke以yi从cong Microsoft ADSI 网wang址zhi [url=http://www.pccode.net]下xia载zai"http://www.microsoft.com/adsi 下xia载zai 。 SDK 包bao括kuo文wen档dang、在zai线xian帮bang助zhu和he很hen多duo例li子zi,不bu过guo不bu幸xing的de是shi这zhe些xie例li子zi都dou是shi针zhen对dui VB 和he VC 的de,这zhe里li我wo们men将jiang演yan示shi如ru何he使shi用yong Delphi 调tiao用yong ADSI 。
程cheng序xu演yan示shi
图tu 1.111 所suo示shi的de程cheng序xu演yan示shi了le如ru何he调tiao用yong WinNT provider 提ti供gong的de功gong能neng。演yan示shi程cheng序xu用yong来lai连lian接jie到dao一yi个ge域yu,一yi旦dan连lian接jie到dao域yu,程cheng序xu将jiang会hui列lie出chu在zai PDC 上shang找zhao到dao的de NT 的de用yong户hu和he组zu以yi及ji域yu中zhong的de计ji算suan机ji。同tong时shi这zhe个ge程cheng序xu还huan演yan示shi了le如ru何he察cha看kan域yu中zhong计ji算suan机ji上shang的de服fu务wu和he察cha看kan、添tian加jia、删shan除chu NT 组zu中zhong的de用yong户hu。
使shi用yong ADSI 控kong制zhi Windows NT/2000
ADSI 可ke以yi使shi我wo们men控kong制zhi用yong户hu、组zu、计ji算suan机ji、文wen件jian共gong享xiang、打da印yin任ren务wu、打da印yin队dui列lie和he服fu务wu等deng系xi统tong资zi源yuan。要yao想xiang在zai Delphi 中zhong调tiao用yong ADSI ,需xu要yao引yin入ru活huo动dong目mu录lu类lei型xing库ku,调tiao用yong菜cai单dan Project | Import Type Library 命ming令ling,选xuan择ze ActiveDs (Version 1.0) 点dian确que认ren, Delphi 会hui生sheng成cheng相xiang应ying的de封feng装zhuang文wen件jian。
绑bang定ding Win NT 目mu录lu服fu务wu
连lian接jie Win NT 目mu录lu服fu务wu就jiu是shi找zhao到dao域yu控kong制zhi器qi然ran后hou绑bang定ding到dao相xiang应ying的de对dui象xiang上shang。绑bang定ding可ke以yi通tong过guo ADsGetObject 或huo ADsOpenObject 函han数shu来lai实shi现xian。 ADsGetObject 函han数shu声sheng明ming如ru下xia:
function ADsGetObject(lpszPathName: PWideChar; const riid: TIID; out obj): HResult; stdcall; external 'activeds.dll';
第di一yi个ge参shen数shu是shi对dui象xiang的de路lu径jing名ming,第di二er个ge参shen数shu是shi对dui象xiang的de接jie口kou标biao识shi符fu,第di三san个ge参shen数shu用yong于yu返fan回hui得de到dao的de被bei请qing求qiu的de接jie口kou指zhi针zhen。缺que省sheng条tiao件jian下xia,函han数shu根gen据ju当dang前qian用yong户hu进jin行xing安an全quan认ren证zheng。
ADsOpenObject 函han数shu在zai不bu同tong的de安an全quan认ren证zheng机ji制zhi下xia绑bang定ding ADSI 对dui象xiang,它ta主zhu要yao是shi通tong过guo调tiao用yong参shen数shu返fan回hui的de用yong户hu名ming和he口kou令ling来lai认ren证zheng的de。函han数shu声sheng明ming如ru下xia:
function ADsOpenObject(lpszPathName: PWideChar; lpszUserName: PWideChar; lpszPassword: PWideChar; dwReserved: LongInt; const riid: TIID; out obj): HResult; stdcall; external 'activeds.dll';
第di一yi个ge参shen数shu意yi义yi同tong上shang,第di二er、三san个ge参shen数shu是shi调tiao用yong者zhe提ti供gong的de用yong户hu名ming和he口kou令ling,第di四si个ge参shen数shu是shi一yi个ge保bao留liu的de provider 标biao识shi,用yong来lai确que定ding绑bang定ding的de认ren证zheng方fang法fa,第di五wu个ge参shen数shu是shi请qing求qiu接jie口kou的de接jie口kou标biao识shi符fu,最zui后hou一yi个ge参shen数shu用yong来lai返fan回hui请qing求qiu的de接jie口kou指zhi针zhen。
第di一yi个ge函han数shu使shi用yong登deng录lu用yong户hu缺que省sheng的de信xin任ren级ji别bie,而er第di二er个ge函han数shu允yuan许xu开kai发fa者zhe指zhi定ding特te殊shu的de安an全quan信xin任ren机ji制zhi来lai绑bang定ding ADSI 对dui象xiang。下xia面mian代dai码ma演yan示shi了le两liang种zhong不bu同tong的de绑bang定ding方fang式shi:
procedure TMainFrm.actOpenWinNTExecute(Sender: TObject);
var
UnknownObject: IUnknown;
DomainPath: WideString;
Domain: IADsContainer;
begin
// 指zhi定ding域yu路lu径jing
DomainPath := 'WinNT://' + ADSIDomainName.Text;
// 如ru果guo使shi用yong用yong户hu登deng录lu了le信xin息xi
if cbUseLogin.Checked then
// 使shi用yong用yong户hu登deng录lu的de信xin息xi创chuang建jian域yu对dui象xiang
OleCheck(AdsOpenObject(PWideChar(DomainPath),
PWideChar(ADSIUsername.Text),
PWideChar(ADSIPassword.Text), 0, IID_IADsContainer,
UnknownObject));
else
OleCheck(ADsGetObject(PWideChar(DomainPath),
IID_IADsContainer, UnknownObject));
// 设she定ding域yu对dui象xiang
Domain := UnknownObject as IADsContainer;
// 从cong域yu中zhong获huo得de信xin息xi列lie表biao
GetDomainInformation(Domain);
end;
下xia面mian我wo们men需xu要yao声sheng明ming三san个ge变bian量liang :
第di一yi个ge是shi接jie口kou变bian量liang , 用yong来lai绑bang定ding由you指zhi定ding的de对dui象xiang路lu径jing返fan回hui的de函han数shu。
UnknownObject: IUnknown;
第di二er个ge参shen数shu是shi WideString 类lei型xing的de变bian量liang , 用yong来lai在zai绑bang定ding函han数shu中zhong产chan生sheng一yi个ge对dui象xiang路lu径jing。
DomainPath: WideString;
第di三san是shi一yi个ge IADsContainer 接jie口kou类lei型xing变bian量liang , 用yong来lai保bao存cun返fan回hui的de接jie口kou变bian量liang。
Domain: IADsContainer;
IADsContainer 变bian量liang将jiang被bei用yong来lai从cong指zhi定ding的de ADSI 对dui象xiang中zhong获huo得de全quan部bu用yong户hu、组zu和he计ji算suan机ji。当dang然ran也ye可ke以yi使shi用yong IADsDomain 类lei型xing的de变bian量liang,但dan它ta不bu适shi合he枚mei举ju域yu中zhong的de子zi对dui象xiang。
下xia面mian指zhi定ding想xiang要yao获huo得de的de对dui象xiang路lu径jing , 如ru果guo域yu名ming是shi "PRISMA" , 要yao想xiang获huo得de ADSI 对dui象xiang , 就jiu需xu要yao指zhi定ding路lu径jing为wei "WinNT://PRISMA" :
// 设she定ding域yu名ming路lu径jing
DomainPath := 'WinNT://' + ADSIDomainName.Text;
下xia面mian代dai码ma使shi用yong不bu同tong的de安an全quan认ren证zheng方fang式shi:
// 如ru果guo使shi用yong登deng录lu信xin息xi
if cbUseLogin.Checked then
// 使shi用yong登deng录lu并bing创chuang建jian域yu对dui象xiang
OleCheck(AdsOpenObject(PWideChar(DomainPath),
PWideChar(ADSIUsername.Text),
PWideChar(ADSIPassword.Text), 0, IID_IADsContainer,
UnknownObject));
else
// 创chuang建jian域yu对dui象xiang
OleCheck(ADsGetObject(PWideChar(DomainPath),
IID_IADsContainer, UnknownObject));
然ran后hou我wo们men获huo取qu IADsContainer 指zhi针zhen,以yi便bian查cha询xun域yu中zhong的de子zi对dui象xiang:
// 获huo取qu域yu对dui象xiang
Domain := UnknownObject as IADsContainer;
最zui后hou , 把ba IADsContainer 接jie口kou指zhi针zhen作zuo为wei参shen数shu调tiao用yong来lai获huo得de域yu中zhong的de子zi对dui象xiang :
GetDomainInformation(Domain);
在zai域yu中zhong查cha找zhao
要yao想xiang在zai域yu中zhong查cha找zhao子zi对dui象xiang , 可ke以yi使shi用yong GetDomainInformation 过guo程cheng , 代dai码ma如ru下xia :
// 获huo取qu域yu信xin息xi
procedure TMainFrm.GetDomainInformation(
Domain: IADsContainer);
var
Enum: IEnumVariant;
ADsTempObj: OLEVariant;
ADsObj: IADs;
Value: LongWord;
begin
// 清qing空kong用yong户hu、组zu和he计ji算suan机ji列lie表biao
UserListView.Items.Clear;
GroupListView.Items.Clear;
ComputerListView.Items.Clear;
// 获huo取qu枚mei举ju对dui象xiang
Enum := (Domain._NewEnum) as IEnumVariant;
// 利li用yong枚mei举ju对dui象xiang查cha找zhao
while (Enum.Next(1, ADsTempObj, Value) = S_OK) do begin
// 获huo得de临lin时shi对dui象xiang
ADsObj := IUnknown(ADsTempObj) as IADs;
// 如ru果guo是shi用yong户hu对dui象xiang
if AdsObj.Class_ = 'User' then
AddUserToList(ADsObj);
// 如ru果guo是shi组zu对dui象xiang
if AdsObj.Class_ = 'Group' then
AddGroupToList(ADsObj);
// 如ru果guo是shi计ji算suan机ji对dui象xiang
if AdsObj.Class_ = 'Computer' then
AddComputerToList(ADsObj);
end;
end;
下xia面mian是shi对dui程cheng序xu流liu程cheng的de详xiang细xi说shuo明ming,首shou先xian获huo得de枚mei举ju对dui象xiang,并bing赋fu值zhi给gei Enum 变bian量liang:
Enum := (Domain._NewEnum) as IEnumVariant;
然ran后hou利li用yong枚mei举ju变bian量liang进jin行xing查cha找zhao并bing把ba每mei个ge子zi对dui象xiang赋fu值zhi给gei临lin时shi的de OLEVariant 对dui象xiang:
while (Enum.Next(1, ADsTempObj, Value) = S_OK) do begin
OLEVariant 变bian量liang赋fu值zhi给gei ADSI 对dui象xiang
ADsObj := IUnknown(ADsTempObj) as IADs;
获huo得de ADSI 对dui象xiang后hou,开kai始shi检jian查cha对dui象xiang类lei,根gen据ju对dui象xiang类lei别bie把ba ADSI 分fen别bie处chu理li,并bing把ba不bu同tong ADSI 对dui象xiang的de属shu性xing添tian加jia到dao各ge自zi的de列lie表biao视shi图tu中zhong去qu:
// 如ru果guo是shi用yong户hu对dui象xiang
if AdsObj.Class_ = 'User' then
AddUserToList(ADsObj);
// 如ru果guo是shi组zu对dui象xiang
if AdsObj.Class_ = 'Group' then
AddGroupToList(ADsObj);
// 如ru果guo是shi计ji算suan机ji对dui象xiang
图tu 1.112
if AdsObj.Class_ = 'Computer' then AddComputerToList(ADsObj);
运yun行xing结jie果guo如ru 图tu 1.112 所suo示shi。
创chuang建jian或huo删shan除chu计ji算suan机ji用yong户hu
通tong过guo WinNT provider ,可ke以yi创chuang建jian或huo删shan除chu域yu中zhong任ren意yi一yi台tai计ji算suan机ji的de用yong户hu,要yao想xiang创chuang建jian一yi个ge域yu中zhong指zhi定ding的de计ji算suan机ji的de用yong户hu,需xu要yao绑bang定ding到dao指zhi定ding的de计ji算suan机ji上shang。一yi旦dan要yao绑bang定ding到dao计ji算suan机ji对dui应ying的de ADSI 容rong器qi对dui象xiang,就jiu需xu要yao调tiao用yong Create 方fang法fa。容rong器qi对dui象xiang的de Create 方fang法fa需xu要yao两liang个ge参shen数shu,一yi个ge是shi要yao创chuang建jian的de ADSI 对dui象xiang的de类lei别bie,一yi个ge是shi要yao用yong来lai描miao述shu ADSI 对dui象xiang的de名ming字zi。调tiao用yong Create 方fang法fa后hou会hui返fan回hui新xin的de ADSI 对dui象xiang的de引yin用yong参shen考kao,下xia面mian代dai码ma演yan示shi了le如ru何he创chuang建jian一yi个ge用yong户hu:
var
ComputerObj: IADsContainer;
TempUserObj: IUnknown;
UserObj: IADsUser;
PDCName: WideString;
NewUserName: WideString;
AdsPath: WideString;
begin
// 获huo取qu用yong户hu信xin息xi
PDCName := InputBox(' 创chuang建jian新xin用yong户hu ', ' 请qing输shu入ru域yu名ming : ', '');
NewUserName := InputBox(' 创chuang建jian新xin用yong户hu ', ' 请qing输shu入ru用yong户hu名ming : ', '');
// 指zhi定ding域yu名ming路lu径jing
AdsPath := 'WinNT://' + PDCName + ',computer';
// 创chuang建jian计ji算suan机ji对dui象xiang
OleCheck(AdsGetObject(PWideChar(AdsPath),
IID_IADsContainer, ComputerObj));
// 创chuang建jian新xin用yong户hu
TempUserObj := ComputerObj.Create('user', NewUserName);
UserObj := TempUserObj as IADsUser;
// 设she定ding目mu录lu信xin息xi
UserObj.SetInfo;
// 刷shua新xin列lie表biao
actOpenWinNT.Execute;
删shan除chu用yong户hu也ye非fei常chang类lei似si , 只zhi不bu过guo不bu需xu要yao创chuang建jian任ren何he的de用yong户hu对dui象xiang , 可ke直zhi接jie调tiao用yong容rong器qi对dui象xiang IADsContainer 接jie口kou的de Delete 方fang法fa , Delete 方fang法fa需xu要yao两liang个ge参shen数shu , 第di一yi个ge是shi要yao删shan除chu的de对dui象xiang类lei别bie , 第di二er个ge是shi对dui象xiang名ming称cheng , 代dai码ma示shi意yi如ru下xia :
var
ComputerObj: IADsContainer;
PDCName: WideString;
UserName: WideString;
AdsPath: WideString;
begin
// 获huo取qu用yong户hu信xin息xi
PDCName := InputBox(' 删shan除chu用yong户hu ', ' 请qing输shu入ru域yu名ming ', '');
UserName := InputBox(' 删shan除chu用yong户hu ', ' 请qing输shu入ru要yao删shan除chu的de用yong户hu名ming : ', '');
if MessageDlg(' 你ni是shi否fou确que信xin要yao删shan除chu用yong户hu : ' +UserName + ' ?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
// 指zhi定ding域yu名ming路lu径jing
AdsPath := 'WinNT://' + PDCName + ',computer';
// 创chuang建jian计ji算suan机ji对dui象xiang
[1] [2] 下xia一yi页ye
【原文】