5

我的 Delphi 7 应用程序在特定情况下出现问题。

我有 ADOConnection,它使用一些用户名连接到我的 MS SQL 服务器并通过 - SQL 身份验证。问题是 MS SQL 登录是使用“用户必须在下次登录时更改通过”标志创建的,这使得 ADO 连接无法连接,并出现错误消息“18488 - 用户 '%.*ls' 登录失败。原因:必须更改帐户。”

通常,在 MS SQL Management Studio 中会显示更改密码提示,用户可以输入新密码。问题是我应该怎么做才能在我的应用程序中强制更改此用户的密码?我能够捕捉到错误号并提示更改登录,但那又如何呢?连接字符串中没有可用于将通过/重置更改为新密码的标志(如旧密码和新密码)。那我该怎么办?

任何人都可以帮忙吗?

4

2 回答 2

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;

我的回答是基于这些读数:

当您强制密码过期并在 SQL 服务器上使用“用户必须在下次登录时更改密码”选项时,这是从客户端更改密码的官方方法。


如果在用户机器上安装 SQL Server Native Client 是一个问题,我可以考虑更多选项:

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

如果您很高兴可以捕获此特定消息,则可以显示您自己的表单,说明必须更改 SQL 登录密码并要求用户输入新密码。然后使用ALTER LOGIN命令更改密码。

为了安全起见,我会使用 OLD_PASSWORD 选项来确保该用户知道旧密码,因此可以设置新密码。

如果您不希望用户设置它,那么您自己设置它。

请注意,您的用户必须设置 ALTER ANY LOGIN 权限才能执行此操作。

于 2014-08-04T14:31:55.003 回答