18488 エラーをトラップするときは、独自の「パスワードの変更」ダイアログを表示し、プロバイダーとして接続文字列プロパティ"Old Password"
/ "Password"
viaを使用する必要があります (つまり、 または)。SQL 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;
私の答えは、これらの読みに基づいています。
これは、パスワードの有効期限を強制し、SQL サーバーで [ユーザーは次回ログイン時にパスワードの変更が必要] オプションを使用する場合に、クライアント側からパスワードを変更する公式の方法です。
ユーザーのマシンに SQL Server Native Client をインストールすることが問題である場合は、さらにいくつかのオプションを考えることができます。
- 古い/新しいパスワードが提供されたユーザーのパスワードを変更し、クライアントにステータスを返すことを担当する Web サービスを (サーバー上に) 作成します。
- 「スーパー ユーザー」( など
sa
) として接続し、ユーザーの/ログイン パスワードを変更します。クライアントマシンでそのユーザー名/パスワードを保持する必要があることを意味します(セキュリティの観点からは悪い考えですが、実行可能かもしれません)。- 未検証
- 「ユーザーは次のログイン時にパスワードを変更する必要があります」という SQL ログインを作成しないでください。これは私のお気に入りのソリューションです。