论坛风格切换
正版合作和侵权请联系 sd173@foxmail.com
 
  • 帖子
  • 日志
  • 用户
  • 版块
  • 群组
帖子
购买邀请后未收到邀请联系sdbeta@qq.com
  • 1954阅读
  • 5回复

[求助-系统问题]教你运用注册表给系统应用程序加口令 [复制链接]

上一主题 下一主题
离线quen2008
 
发帖
*
今日发帖
最后登录
1970-01-01
只看楼主 倒序阅读 使用道具 楼主  发表于: 2010-05-04 08:23:38

    几乎每个应用系统都有相应的权限管理功能。对于大型多用户应用系统,一般是将权限设置保存在数据库中。但是对于小型的单用户应用系统和非数据库应用系统,就没有必要将权限设置保存在数据库中,但是用文件来保存既不方便又不安全,因为文件很可能被删除或毁坏。其实,灵活地利用Windows注册表的特点,可以很方便地为应用系统设置用户名和口令,这种方法不但编程简便,而且安全性比较高。下面举例说明,该例程在Windows98,Delphi4环境下调试通过。

    设计流程为:先判断是否为第一次使用,如果为第一次使用,则要求设置新的用户名和口令,系统将用户名和口令保存起来;如果不是第一次使用,则要求输入用户名和口令才能登录。

    在Delphi开发环境中,新建一个工程Project1,在Project1中增加一个窗体Form1;在Form1上增加两个按纽,一个为确定,另一个为取消;再在Form1上增加两个Text框EditUser和EditPass,分别为用户名和口令输入框。定义窗体级全局变量RegF:TRegistry。并在interface的Uses中加上Registry。
增加函数Wsz_IfFirst,判断是否是第一次使用;增加过程Wsz_SaveUse,保存用户名和口令;增加函数Wsz_CheckUser,判断用户名和口令是否正确。然后在Form1的FormShow事件和确定按纽事件中分别调用这三个函数和过程,达到设计要求。


//判断是否是第一次使用
function Wsz_IfFirst:Boolean;
var
 sUser:string;
 sPass:string;
begin
 result := false;
 RegF:=TRegistry.Create;
 RegF.RootKey :=HKEY_LOCAL_MACHINE;
 RegF.OpenKey("SOFTWARE\MicroSoft\whh726",TRUE);
 sUser := RegF.ReadString("user");
 sPass := RegF.ReadString("pass");
 if ((length(sUser)<=0) and (length(sPass)<=0)) then
result := true ;
RegF.Free;
 end;
file://判断用户名和口令是否正确
function Wsz_CheckUser(MyUser:string;MyPass :string):Boolean;
var
 sUser:string;
 sPass:string;
begin
 result:= false;
 RegF:=TRegistry.Create;
 RegF.RootKey :=HKEY_LOCAL_MACHINE;
 RegF.OpenKey("SOFTWARE\MicroSoft\whh726",TRUE);
 sUser := RegF.ReadString("user");
 sPass := RegF.ReadString("pass");
 if (sUser=MyUser) and (sPass=MyPass) then
result := true;
RegF.Free;
 end;
file://保存用户名和口令
procedure Wsz_SaveUser(MyUser:string;MyPass :string);
begin
 RegF:=TRegistry.Create;
 RegF.RootKey :=HKEY_LOCAL_MACHINE;
 RegF.OpenKey("SOFTWARE\MicroSoft\whh726",TRUE);
 RegF.WriteString("user",MyUser);
 RegF.WriteString("pass",MyPass);
 RegF.Free;
end;
file://取消按纽事件
procedure TWszLoginForm.BitBtnCloseClick(Sender: TObject);
begin
 Close;
end;
file://确定按纽事件
procedure TWszLoginForm.BitBtnYesClick(Sender: TObject);
var
 suser:string;
 spass:string;
begin
 suser := trim(edituser.text);
 spass := trim(editpass.text);
 if (length(suser)<=0) or (length(spass)<=0) then
 begin
Application.MessageBox("用户名和口令都必须输入!",
  "系统提示",
 MB_OK + MB_ICONINFORMATION);
 edituser.SetFocus ;
exit;
 end;
 if Wsz_IfFirst then
 begin
file://处理第一次登录的用户名和口令
if Application.MessageBox(
 "您是第一次使用本软件,请记住您的用户名和口令,
 以便下次登录。现在进入系统吗?",
 "系统提示",
 MB_OKCANCEL + MB_ICONQUESTION) = IDOK then
 begin
file://保存
Wsz_SaveUser(suser,spass);
 end
else
 begin
 edituser.SetFocus ;
 exit;
 end;
end else
 begin
if not Wsz_CheckUser(suser,spass) then
begin
Application.MessageBox
 ("对不起,用户名和口令输入不正确!", "系统提示",
MB_OK + MB_ICONINFORMATION);
 edituser.setfocus ;
exit;
end;
 end;
 file://全局变量
 GB_Wsz_User := suser;
 GB_Wsz_PASS := spass;
 Close;
 end;
 file://窗体的Show事件
procedure TWszLoginForm.FormShow(Sender: TObject);
 begin
if Wsz_IfFirst then
 begin
Application.MessageBox(
"您是第一次使用本软件,您可以随便输入用户名和口令。",
"系统提示",
MB_OK + MB_ICONINFORMATION);
end;
 end;

离线sjp1800
发帖
*
今日发帖
最后登录
1970-01-01
只看该作者 沙发  发表于: 2010-05-04 08:33:06
好难~~
离线竹无心
发帖
*
今日发帖
最后登录
1970-01-01
只看该作者 板凳  发表于: 2010-05-04 13:25:30
慢慢看,很多
离线ykgcs
发帖
*
今日发帖
最后登录
1970-01-01
只看该作者 地板  发表于: 2010-05-04 18:21:13
看起来很复杂,不敢这样设置的
离线gaisiyaq
发帖
*
今日发帖
最后登录
1970-01-01
只看该作者 地下室  发表于: 2010-05-04 22:38:01
98的机器,98好像设了密码和没设一样,安全性低下
离线无忧春殇
发帖
*
今日发帖
最后登录
1970-01-01
只看该作者 5 发表于: 2010-05-05 11:15:14
同意地下室…