5

Delphi 7 アプリケーションで特定の状況で発生した問題があります。

ユーザー名とパスを使用してMS SQLサーバーに接続するADOConnectionがあります-SQL認証。問題は、MS SQL ログインが "User must change pass at next login" フラグで作成され、ADO 接続がエラー メッセージ "18488 - Login failed for user '%.*ls'. Reason: The password of the user'%.*ls' で接続できなくなることです。アカウントを変更する必要があります。」

通常、MS SQL Management Studio ではパスワード変更プロンプトが表示され、ユーザーは新しいパスワードを入力できます。問題は、アプリケーションでこのユーザーにパスワードの変更を強制するにはどうすればよいですか? エラー番号をキャッチし、ログインの変更を求めるプロンプトを表示することはできますが、その後はどうなるでしょうか? 接続文字列には、パス/リセットを新しいものに変更するために使用できるフラグはありません (古いパスワードや新しいパスワードなど)。じゃあどうすればいいの?

誰でも助けることができますか?

4

2 に答える 2

3

18488 エラーをトラップするときは、独自の「パスワードの変更」ダイアログを表示し、プロバイダーとして接続文字列プロパティ"Old Password"/ "Password"viaを使用する必要があります (つまり、 または)。SQL Native ClientProvider=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 に答える