Delphi 7 - 由于SQL"必须更改密码"标志,ADOConnection无法连接

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的标志(如旧密码和新密码).那我该怎么办?

有人可以帮忙吗?

kob*_*bik 3

当您捕获 18488 错误时,您需要显示自己的“更改密码”对话框,并使用连接字符串属性"Old Password"/ "Password"viaSQL Native Client作为您的提供程序(即Provider=SQLNCLI10SQLNCLI.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 是一个问题,我可以想到更多选项:

  1. 创建一个 Web 服务(在您的服务器上),负责更改提供旧/新密码的用户密码并将状态返回给您的客户端。
  2. 以“超级用户”身份连接(例如sa),并更改用户/登录密码。这意味着您需要在客户端计算机上保存该用户名/密码(恕我直言,从安全角度来看,这是个坏主意,但可能可行)。- 未测试
  3. 不要创建带有“用户下次登录时必须更改密码”的 SQL 登录。这是我最喜欢的解决方案。