我想写个程序定期更改密码以提高服务器的安全性,在网上看了这个文章,可是总是编译出错
--------------------------------------------------------------------------------------------
在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;
-------------------------------------------------------------------------------------------我用了如下代码
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; 总是出
[pascal error]unit1.pas(36):e2010 incompatible type:'HGDIOBJ'and'CHAR'
[pascal error]unit1.pas(38):e2035 Not enough actual parameters谁有能通过的代码,发我一份,分数好说[email protected]
--------------------------------------------------------------------------------------------
在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;
-------------------------------------------------------------------------------------------我用了如下代码
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; 总是出
[pascal error]unit1.pas(36):e2010 incompatible type:'HGDIOBJ'and'CHAR'
[pascal error]unit1.pas(38):e2035 Not enough actual parameters谁有能通过的代码,发我一份,分数好说[email protected]
解决方案 »
- 拖动几个圆形的问题
- 在新窗体中打开image,就会出错,为什么?
- 有谁用delphi做过ftp下载的例子呀? help me!
- 不规则窗体之线形窗体
- 请各位高手帮我看看SQL语句的书写格式有什麽问题?
- Linux2001(我想买手提电脑啊!) 到这里来取分。
- Create一个VCL对象时,会不会出现异常?
- 中国式报表(ereport)控件的小BUG,哪位大侠能帮助解决???
- 征集公司名称(有奖)
- 在delphi中能不能实现这样的功能?
- delphi 数据包 date:Sun, 04 Jan 2009 07:18:12 GMT
- 关于类的设计与实现的问题,帮看下这段代码问题在哪,自己写的,根本实现不了功能,刚学DELPHI 对类的理解还不那么深
[pascal error]unit1.pas(38):e2035 Not enough actual parameters 这句看看错误在哪一行,少参数
偶管理的用户及密码及文件服务器等均是自己写的API管理的
偶公司不用域,呵呵