Sur*_*ate 5 sql-server delphi delphi-7 adoconnection
我遇到了在我的Delphi 7应用程序中的特定情况下出现的问题.
我有一个ADOConnection,它通过一些用户名和pass-SQL身份验证进入我的MS SQL服务器.问题是MS SQL登录是使用"用户必须在下次登录时更改传递"标志创建的,这使得ADO连接无法连接错误消息"18488 - 用户登录失败'%.*ls'.原因:密码帐户必须更改."
通常,在MS SQL Management Studio中会显示更改密码提示,并且用户可以输入新密码.问题是我应该怎么做才能在我的应用程序中强制更改此用户的密码?我能够捕获错误号并提示登录更改,但是那么呢?连接字符串中没有可用于将pass/reset更改为new的标志(如旧密码和新密码).那我该怎么办?
有人可以帮忙吗?
当您捕获 18488 错误时,您需要显示自己的“更改密码”对话框,并使用连接字符串属性"Old Password"/ "Password"viaSQL Native Client作为您的提供程序(即Provider=SQLNCLI10或SQLNCLI.1)。
这是我用来测试这个的一个小代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
// 12345 is the "old password"
ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Password=12345;User ID=test;Initial Catalog=test;Data Source=127.0.0.1;Persist Security Info=True;';
try
ADOConnection1.Open;
except
if Assigned(ADOConnection1.Errors) and (ADOConnection1.Errors.Count > 0) and
(ADOConnection1.Errors.Item[0].NativeError = 18488) then
begin
// show your "change password" dialog... new password is 67890
ADOConnection1.ConnectionString := 'Provider=SQLNCLI10.1;Old Password=12345;Password=67890;User ID=test;Initial Catalog=test;Data Source=127.0.0.1;Persist Security Info=True;';
ADOConnection1.Open; // this will login and change the password
// OPTIONAL (unless you use SQLNCLI10.1 anyway)
// you may close the connection and re-open with your original provider and new password
ADOConnection1.Close;
ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Password=67890;User ID=test;Initial Catalog=test;Data Source=127.0.0.1;Persist Security Info=True;';
ADOConnection1.Open;
end
else
raise;
end;
ShowMessage('Login OK');
end;
Run Code Online (Sandbox Code Playgroud)
我的回答基于这些阅读:
当您强制密码过期并在 SQL Server 上使用“用户下次登录时必须更改密码”选项时,这是从客户端更改密码的官方方法。
如果在用户计算机上安装 SQL Server Native Client 是一个问题,我可以想到更多选项:
sa),并更改用户/登录密码。这意味着您需要在客户端计算机上保存该用户名/密码(恕我直言,从安全角度来看,这是个坏主意,但可能可行)。- 未测试| 归档时间: |
|
| 查看次数: |
2194 次 |
| 最近记录: |