SQL Server 2005 より前では、ユーザーのパスワードの有効期限が切れたとき、管理者のみがパスワードをリセットできました。 SQL Server 2005 以降、SQL Server Native Client では、SQL Server Native Client OLE DB プロバイダーと SQL Server Native Client ODBC ドライバーの両方、および SQL Server ログイン ダイアログ ボックスの変更を通じて、プログラムによるパスワードの有効期限 の 処理がサポートされています。
注
可能な場合は、実行時に資格情報を入力するようにユーザーに求め、永続化された形式で資格情報を保存しないようにします。 資格情報を保持する必要がある場合は、 Win32 暗号化 API を使用して暗号化する必要があります。 パスワードの使用の詳細については、「 強力なパスワード」を参照してください。
SQL Server ログイン エラー コード
認証の問題が原因で接続できない場合は、診断と回復を支援するために、次のいずれかの SQL Server エラー コードをアプリケーションで使用できます。
SQL Server エラー コード | エラーメッセージ |
---|---|
15113 | ユーザー '%.*ls' のログインに失敗しました。理由: パスワードの検証に失敗しました。 アカウントがロックアウトされています。 |
18463 | ユーザー '%.*ls' はログインできませんでした。 理由: パスワードを変更できませんでした。 この時点ではパスワードを使用できません。 |
18464 | ユーザー '%.*ls' はログインできませんでした。 理由: パスワードを変更できませんでした。 パスワードが短すぎるため、ポリシー要件を満たしていません。 |
18465 | ユーザー '%.*ls' はログインできませんでした。 理由: パスワードを変更できませんでした。 パスワードが長すぎるため、ポリシー要件を満たしていません。 |
18466 | ユーザー '%.*ls' はログインできませんでした。 理由: パスワードを変更できませんでした。 パスワードは十分に複雑ではないため、ポリシー要件を満たしていません。 |
18467 | ユーザー '%.*ls' はログインできませんでした。 理由: パスワードを変更できませんでした。 パスワードがパスワード フィルター DLL の要件を満たしていません。 |
18468 | ユーザー '%.*ls' はログインできませんでした。 理由: パスワードを変更できませんでした。 パスワードの検証で予期しないエラーが発生しました。 |
18487 | ユーザー '%.*ls' はログインできませんでした。 理由: アカウントのパスワードの有効期限が切れています。 |
18488 | ユーザー '%.*ls' はログインできませんでした。 理由: アカウントのパスワードを変更する必要があります。 |
SQL Server Native Client OLE DB プロバイダー
SQL Server Native Client OLE DB プロバイダーは、ユーザー インターフェイスとプログラムを使用してパスワードの有効期限をサポートします。
OLE DB ユーザー インターフェイスのパスワードの有効期限
SQL Server Native Client OLE DB プロバイダーは、 SQL Server ログイン ダイアログ ボックスに加えられた変更によるパスワードの有効期限をサポートします。 DBPROP_INIT_PROMPTの値が DBPROMPT_NOPROMPT に設定されている場合、パスワードの有効期限が切れている場合、最初の接続試行は失敗します。
DBPROP_INIT_PROMPT他の値に設定されている場合、パスワードの有効期限が切れているかどうかに関係なく、 SQL Server ログイン ダイアログが表示されます。 ユーザーは、[ オプション] ボタンをクリックし、[ パスワードの変更 ] をオンにしてパスワードを変更できます。
ユーザーが [OK] をクリックし、パスワードの有効期限が切れている場合、SQL Server は、[ SQL Server パスワードの変更] ダイアログを使用して新しいパスワードの入力と確認を求めるメッセージを表示します。
OLE DB プロンプトの動作とロックされたアカウント
アカウントがロックされているため、接続の試行が失敗する可能性があります。 SQL Server ログイン ダイアログの表示後にこれが発生した場合、サーバー エラー メッセージがユーザーに表示され、接続の試行が中止されます。 また、ユーザーが古いパスワードに不適切な値を入力した場合は、[ SQL Server パスワードの変更 ] ダイアログの表示の後にも発生する可能性があります。 この場合、同じエラー メッセージが表示され、接続の試行が中止されます。
OLE DB 接続プール、パスワードの有効期限、ロックされたアカウント
接続プールで接続がまだアクティブな間は、アカウントがロックされているか、パスワードの有効期限が切れる可能性があります。 サーバーは、期限切れのパスワードとロックされたアカウントを 2 回チェックします。 1 つ目は、接続が最初に作成されたときです。 2 回目は、接続がプールから取得されるときに、接続のリセット時です。
リセットの試行が失敗すると、接続がプールから削除され、エラーが返されます。
OLE DB プログラムによるパスワードの有効期限
SQL Server 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は、パスワードの有効期限が切れたときにのみ使用されるため、永続化しないでください。
"古いパスワード" プロパティが設定されるたびに、プロバイダーは、Windows 認証も指定されていない限り、パスワードの変更が試行されていると見なします。その場合は常に優先されます。
Windows 認証を使用する場合、古いパスワードを指定すると、古いパスワードが REQUIRED と OPTIONAL のどちらとして指定されたかに応じて、DB_E_ERRORSOCCURREDまたはDB_S_ERRORSOCCURREDになり、DBPROPSTATUS_CONFLICTINGBADVALUEの状態値は dwStatus で返されます。 これは、 IDBInitialize::Initialize が呼び出されたときに検出されます。
パスワードの変更が予期せず失敗した場合、サーバーはエラー コード 18468 を返します。 接続試行から標準の OLEDB エラーが返されます。
DBPROPSET_SQLSERVERDBINIT プロパティ セットの詳細については、「 初期化プロパティと承認プロパティ」を参照してください。
SQL Server Native Client ODBC ドライバー
SQL Server Native Client OLE DB プロバイダーは、ユーザー インターフェイスとプログラムを使用してパスワードの有効期限をサポートします。
ODBC ユーザー インターフェイスのパスワードの有効期限
SQL Server Native Client ODBC ドライバーは、 SQL Server ログイン ダイアログ ボックスに加えられた変更によるパスワードの有効期限をサポートします。
SQLDriverConnect が呼び出され、DriverCompletion の値が SQL_DRIVER_NOPROMPT に設定されている場合、パスワードの有効期限が切れている場合、最初の接続試行は失敗します。 SQLSTATE 値 28000 とネイティブ エラー コード値 18487 は、 SQLError または SQLGetDiagRec の後続の呼び出しによって返されます。
DriverCompletion が他の値に設定されている場合、パスワードの有効期限が切れているかどうかに関係なく、ユーザーに SQL Server ログイン ダイアログが表示されます。 ユーザーは、[ オプション] ボタンをクリックし、[ パスワードの変更 ] をオンにしてパスワードを変更できます。
ユーザーが [OK] をクリックし、パスワードの有効期限が切れている場合は、[SQL Server パスワードの 変更 ] ダイアログを使用して新しいパスワードの入力と確認を求められます。
ODBC プロンプトの動作とロックされたアカウント
アカウントがロックされているため、接続の試行が失敗する可能性があります。 SQL Server ログイン ダイアログの表示後にこれが発生した場合、サーバー エラー メッセージがユーザーに表示され、接続の試行が中止されます。 また、ユーザーが古いパスワードに不適切な値を入力した場合は、[ SQL Server パスワードの変更 ] ダイアログの表示の後にも発生する可能性があります。 この場合、同じエラー メッセージが表示され、接続の試行が中止されます。
ODBC 接続プール、パスワードの有効期限、ロックされたアカウント
接続プールで接続がまだアクティブな間は、アカウントがロックされているか、パスワードの有効期限が切れる可能性があります。 サーバーは、期限切れのパスワードとロックされたアカウントを 2 回チェックします。 1 つ目は、接続が最初に作成されたときです。 2 回目は、接続がプールから取得されるときに、接続のリセット時です。
リセットの試行が失敗すると、接続がプールから削除され、エラーが返されます。
ODBC プログラムによるパスワードの有効期限
SQL Server Native Client ODBC ドライバーは、 SQLSetConnectAttr 関数を使用してサーバーに接続する前に設定されたSQL_COPT_SS_OLDPWD属性を追加することにより、パスワードの有効期限をサポートします。
接続ハンドルのSQL_COPT_SS_OLDPWD属性は、期限切れのパスワードを参照します。 接続プールに干渉するため、この属性の接続文字列属性はありません。 ログインに成功すると、ドライバーはこの属性をクリアします。
SQL Server Native Client ODBC ドライバーは、この機能の 4 つのケースでSQL_ERRORを返します。パスワードの有効期限、パスワード ポリシーの競合、アカウントロックアウト、Windows 認証の使用中に古いパスワード プロパティが設定されたときです。 ドライバーは、 SQLGetDiagField が呼び出されたときに、ユーザーに適切なエラー メッセージを返します。