首页 文章

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

提问于
浏览
5

我遇到了在我的Delphi 7应用程序中的特定情况下出现的问题 .

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

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

有人可以帮忙吗?

2 回答

  • 0

    当您捕获18488错误时,您需要显示自己的"change password"对话框,并使用连接字符串属性 "Old Password" / "Password" 来自 SQL 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是一个问题,我可以考虑更多选项:

    • 创建一个Web服务(在您的服务器上),负责更改用户密码,提供旧/新密码并将状态返回给您的客户端 .

    • 以"super user"(例如 sa )连接,并更改用户的/登录密码 . 这意味着您需要在客户端计算机上保留该用户名/密码(从安全角度来看,恕我直言,但可能是可行的) . - 未经测试

    • do NOT 使用"User must change password at next login"创建SQL登录 . 这是我最喜欢的解决方案 .

  • 3

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

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

    如果您不希望用户进行设置,请自行设置 .

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

相关问题