プログラムによるパスワードの変更
SQL Server 2005 では、パスワードの期限切れの処理が変更されました。以前のバージョンの SQL Server では、ユーザーのパスワードの有効期限が切れたとき、そのパスワードをリセットできるのは管理者だけでした。SQL Native Client では、SQL Native Client OLE DB プロバイダと SQL Native Client ODBC ドライバの両方でプログラムから、また [SQL Server ログイン] ダイアログ ボックスに行われた変更に基づいてパスワードの期限切れを処理できます。
メモ : |
---|
可能であれば、実行時にユーザーの資格情報を入力し、それらの資格情報を永続的な形式で保存しないように求めるメッセージが表示されます。資格情報を保存する必要がある場合は、Win32 Crypto API を使用して暗号化してください。パスワードの使用に関する詳細については、「強力なパスワード」を参照してください。 |
SQL Server ログイン エラー コード
認証の問題により接続できない場合、アプリケーションでは次のいずれかの SQL Server エラー コードを使用して、診断と復旧に役立てることができます。
SQL Server エラー コード | エラー メッセージ |
---|---|
15113 |
ユーザー '%.*ls' はログインできませんでした。理由: パスワードの検証に失敗しました。アカウントはロックアウトされています。 |
18463 |
ユーザー '%.*ls' はログインできませんでした。理由: パスワードを変更できませんでした。この時点ではパスワードを使用できません。 |
18464 |
ユーザー '%.*ls' はログインできませんでした。理由: パスワードを変更できませんでした。このパスワードは短すぎるので、Windows ポリシーの要件を満たしません。 |
18465 |
ユーザー '%.*ls' はログインできませんでした。理由: パスワードを変更できませんでした。パスワードの文字数が長すぎ、Windows のポリシーで指定された基準を満たしていません。 |
18466 |
ユーザー '%.*ls' はログインできませんでした。理由: パスワードを変更できませんでした。このパスワードはあまり複雑ではないので、Windows のポリシー要件を満たしません。 |
18467 |
ユーザー '%.*ls' はログインできませんでした。理由: パスワードを変更できませんでした。パスワードがパスワード フィルタ DLL の要件を満たしていません。 |
18468 |
ユーザー '%.*ls' はログインできませんでした。理由: パスワードを変更できませんでした。パスワードの検証で予期しないエラーが発生しました。 |
18487 |
ユーザー '%.*ls' はログインできませんでした。理由: このアカウントのパスワードの有効期限が切れています。 |
18488 |
ユーザー '%.*ls' はログインできませんでした。理由: このアカウントのパスワードを変更する必要があります。 |
SQL Server エラーの処理の詳細については、「アプリケーションでのエラーとメッセージの処理」を参照してください。
SQL Native Client OLE DB プロバイダ
SQL Native Client OLE DB プロバイダでは、パスワードの期限切れの処理がユーザー インターフェイスおよびプログラムからサポートされます。
OLE DB ユーザー インターフェイスによるパスワード期限切れの処理
SQL Native Client OLE DB プロバイダでは、[SQL Server ログイン] ダイアログ ボックスに行われた変更によって、パスワード期限切れの処理がサポートされます。DBPROP_INIT_PROMPT の値を DBPROMPT_NOPROMPT に設定すると、パスワードの有効期限が切れている場合に、最初の接続試行が失敗します。
DBPROP_INIT_PROMPT を DBPROMPT_NOPROMPT 以外の値に設定している場合は、パスワードの有効期限が切れているかどうかに関係なく、[SQL Server ログイン] ダイアログ ボックスが表示されます。ユーザーは、[オプション] をクリックし、[パスワードの変更] チェック ボックスをオンにしてパスワードを変更できます。
パスワードの有効期限が切れている場合にユーザーが [OK] をクリックすると、[パスワードの変更] ダイアログ ボックスを使用して新しいパスワードを入力し、確認することを要求されます。
OLE DB プロンプトの動作とロックされたアカウント
アカウントがロックされていることにより、接続に失敗することがあります。[SQL Server ログイン] ダイアログ ボックスが表示された後にこの現象が発生する場合は、サーバー エラー メッセージが表示され、接続試行が中止されます。また、[パスワードの変更] ダイアログ ボックスが表示された後にユーザーが古いパスワードに無効な値を入力すると、この現象が発生することもあります。この場合も同じエラー メッセージが表示され、接続試行が中止されます。
OLE DB 接続プーリング、パスワードの期限切れ、およびロックされたアカウント
接続プール内で接続がアクティブな状態になっている間に、アカウントがロックされたり、そのアカウントのパスワードの有効期限が切れたりすることがあります。サーバーでは、期限切れのパスワードとロックされたアカウントを 2 回チェックします。最初のチェックは、初回接続時に行われます。2 回目のチェックは、接続のリセット時、接続がプールから取り除かれるときに行われます。
リセットの試行が失敗すると、その接続はプールから削除され、エラーが返されます。
OLE DB プログラムによるパスワード期限切れの処理
SQL Native Client OLE DB プロバイダでは、DBPROPSET_SQLSERVERDBINIT プロパティ セットに追加された SSPROP_AUTH_OLD_PASSWORD (型 VT_BSTR) プロパティによって、パスワードの期限切れがサポートされます。
既存の "Password" プロパティは DBPROP_AUTH_PASSWORD を参照し、新しいパスワードを保存する場合に使用されます。
メモ : |
---|
接続文字列の "Old Password" プロパティは SSPROP_AUTH_OLD_PASSWORD に設定され、期限切れのパスワードが設定されます。接続プーリングに影響を与えることになるので、この期限切れのパスワードを接続文字列のプロパティ経由で使用することはできません。 |
プロバイダでは、このプロパティの値が保存されません。このプロパティを設定すると新しい接続が行われるので、プロバイダでは最初の接続に接続プールが使用されません。パスワード変更が正常に行われた場合でも、現在の接続にはまだ古いパスワードが含まれているので再利用できません。古いパスワードとは、変更後に無効になるパスワードのことです。また、ログインに成功すると、このプロパティはクリアされます。クリア後に古いパスワードを取得しようとすると、VT_EMPTY が返されます。
メモ : |
---|
SSPROP_AUTH_OLD_PASSWORD は、パスワードの有効期限が切れたときにしか使用されないので、保存しないでください。 |
"Old Password" プロパティが設定されると、プロバイダでは、パスワードの変更が試行されていることが想定されます。ただし、Windows 認証も指定されている場合は除きます。この場合は、常に Windows 認証が優先されるためです。
Windows 認証を使用している場合、古いパスワードを REQUIRED と指定するか OPTIONAL と指定するかによって、それぞれ DB_E_ERRORSOCCURRED または DB_S_ERRORSOCCURRED のいずれかが返され、dwStatus に状態値として DBPROPSTATUS_CONFLICTINGBADVALUE が返されます。これは、IDBInitialize::Initialize を呼び出したときに検出されます。
パスワード変更の試行が予期せず失敗すると、サーバーからエラー コード 18468 が返されます。接続試行からは標準の OLE DB エラーが返されます。
DBPROPSET_SQLSERVERDBINIT プロパティ セットの詳細については、「初期化プロパティと承認プロパティ」を参照してください。
SQL Native Client ODBC ドライバ
SQL Native Client ODBC ドライバでは、パスワードの期限切れの処理がユーザー インターフェイスおよびプログラムからサポートされます。
ODBC ユーザー インターフェイスによるパスワード期限切れの処理
SQL Native Client ODBC ドライバでは、[SQL Server ログイン] ダイアログ ボックスに行われた変更によって、パスワードの期限切れの処理がサポートされます。
DriverCompletion の値に SQL_DRIVER_NOPROMPT を設定して SQLDriverConnect を呼び出すと、パスワードの有効期限が切れている場合に、最初の接続試行が失敗します。その後 SQLError または SQLGetDiagRec を呼び出すと、SQLSTATE 値 28000 とネイティブ エラー コード値 18487 が返されます。
DriverCompletion を SQL_DRIVER_NOPROMPT 以外の値に設定している場合は、パスワードの有効期限が切れているかどうかに関係なく、[SQL Server ログイン] ダイアログ ボックスが表示されます。ユーザーは、[オプション] をクリックし、[パスワードの変更] チェック ボックスをオンにしてパスワードを変更できます。
パスワードの有効期限が切れている場合にユーザーが [OK] をクリックすると、[パスワードの変更] ダイアログ ボックスを使用して新しいパスワードを入力し、確認することを要求されます。
ODBC プロンプトの動作とロックされたアカウント
アカウントがロックされていることにより、接続に失敗することがあります。[SQL Server ログイン] ダイアログ ボックスが表示された後にこの現象が発生する場合は、サーバー エラー メッセージが表示され、接続試行が中止されます。また、[パスワードの変更] ダイアログ ボックスが表示された後にユーザーが古いパスワードに無効な値を入力すると、この現象が発生することもあります。この場合も同じエラー メッセージが表示され、接続試行が中止されます。
ODBC 接続プーリング、パスワードの期限切れ、およびロックされたアカウント
接続プール内で接続がアクティブな状態になっている間に、アカウントがロックされたり、そのアカウントのパスワードの有効期限が切れたりすることがあります。サーバーでは、期限切れのパスワードとロックされたアカウントを 2 回チェックします。最初のチェックは、初回接続時に行われます。2 回目のチェックは、接続のリセット時、接続がプールから取り除かれるときに行われます。
リセットの試行が失敗すると、その接続はプールから削除され、エラーが返されます。
ODBC プログラムによるパスワードの有効期限
SQL Native Client ODBC ドライバでは、SQL_COPT_SS_OLDPWD 属性の追加によってパスワード期限切れの処理がサポートされます。この属性は、サーバーへ接続する前に SQLSetConnectAttr 関数を使用して設定します。
接続ハンドルの SQL_COPT_SS_OLDPWD 属性は、期限切れのパスワードを表します。接続文字列の属性は接続プーリングに影響を与えることになるので、この属性に関する接続文字列属性はありません。ログインに成功すると、この属性はクリアされます。
SQL Native Client ODBC ドライバでは、この機能に関連する 4 つのケースが発生したときに、SQL_ERROR を返します。4 つのケースとは、パスワードの期限切れ、パスワード ポリシーの競合、アカウントのロックアウト、および Windows 認証を使用しているときに古いパスワードのプロパティが設定された場合です。SQLGetDiagField を呼び出すと、該当するエラー メッセージが表示されます。