プログラムによるSQL Server Native Clientパスワードの変更

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

重要

SQL Server Native Client (SNAC と略されることがよくあります) は、SQL Server 2022 (16.x) と SQL Server Management Studio 19 (SSMS) から削除されました。 SQL Server Native Client (SQLNCLI または SQLNCLI11) とレガシ Microsoft OLE DB Provider for SQL Server (SQLOLEDB) は、新しいアプリケーション開発には推奨されません。 今後、新しい Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server または最新の Microsoft ODBC Driver for SQL Server に切り替えてください。 SQL Server データベース エンジン (バージョン 2012 から 2019) のコンポーネントとして付属する SQLNCLI については、このサポート ライフサイクルの例外を参照してください。

SQL Server 2005 (9.x) より前のリリースでは、ユーザーのパスワードの有効期限が切れたとき、そのパスワードをリセットできるのは管理者だけでした。 SQL Server 2005 (9.x) 以降では、SQL Server Native Client では、SQL Server Native Client OLE DB プロバイダーとSQL Server Native Client ODBC ドライバーの両方を介して、および に対する変更を通じて、プログラムによるパスワードの有効期限の処理がサポートされます[SQL Server ログイン] ダイアログ ボックス。

Note

可能であれば、実行時にユーザーの資格情報を入力し、それらの資格情報を永続的な形式で保存しないように求めるメッセージが表示されます。 資格情報を保持する必要がある場合は、Win32 Crypto API を使用して暗号化してください。 パスワードの使用に関する詳細については、「強力なパスワード」を参照してください。

SQL Server ログイン エラー コード

認証の問題により接続できない場合、アプリケーションでは次のいずれかの SQL Server エラー コードを使用して、診断と復旧に役立てることができます。

SQL Server エラー コード エラー メッセージ
15113 ユーザー '%.*ls' はログインできませんでした。理由: パスワードの検証に失敗しました。 アカウントはロックアウトされています。
18463 ユーザー '%.*ls' はログインできませんでした。 理由: パスワードを変更できませんでした。 この時点ではパスワードを使用できません。
18464 ユーザー '%.*ls' はログインできませんでした。 理由: パスワードを変更できませんでした。 このパスワードは短すぎるので、Windows ポリシーの要件を満たしません。
18465 ユーザー '%.*ls' はログインできませんでした。 理由: パスワードを変更できませんでした。 パスワードは長すぎるため、ポリシー要件を満たしません。
18466 ユーザー '%.*ls' はログインできませんでした。 理由: パスワードを変更できませんでした。 このパスワードはあまり複雑ではないので、Windows のポリシー要件を満たしません。
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 を DBPROMPT_NOPROMPT 以外の値に設定している場合は、パスワードの有効期限が切れているかどうかに関係なく、 [SQL Server ログイン] ダイアログ ボックスが表示されます。 ユーザーは、 [オプション] をクリックし、 [パスワードの変更] チェック ボックスをオンにしてパスワードを変更できます。

パスワードの有効期限が切れている場合にユーザーが [OK] をクリックすると、SQL Server からユーザーに [パスワードの変更] ダイアログ ボックスを使用して新しいパスワードを入力し、確認することを要求されます。

OLE DB プロンプトの動作とロックされたアカウント

アカウントがロックされていることにより、接続に失敗することがあります。 [SQL Server ログイン] ダイアログ ボックスが表示された後にこの現象が発生する場合は、サーバー エラー メッセージが表示され、接続試行が中止されます。 また、 [パスワードの変更] ダイアログ ボックスが表示された後にユーザーが古いパスワードに無効な値を入力すると、この現象が発生することもあります。 この場合も同じエラー メッセージが表示され、接続試行が中止されます。

OLE DB 接続プーリング、パスワードの期限切れ、およびロックされたアカウント

接続プール内で接続がアクティブな状態になっている間に、アカウントがロックされたり、そのアカウントのパスワードの有効期限が切れたりすることがあります。 サーバーでは、期限切れのパスワードとロックされたアカウントを 2 回チェックします。 最初のチェックは、初回接続時に行われます。 2 回目のチェックは、接続のリセット時、接続がプールから取り除かれるときに行われます。

リセットの試行が失敗すると、その接続はプールから削除され、エラーが返されます。

OLE DB プログラムによるパスワード期限切れの処理

SQL Server Native Client OLE DB プロバイダーは、DBPROPSET_SQLSERVERDBINIT プロパティ セットに追加されたSSPROP_AUTH_OLD_PASSWORD (型VT_BSTR) プロパティを追加して、パスワードの有効期限をサポートします。

既存の "Password" プロパティは DBPROP_AUTH_PASSWORD を参照し、新しいパスワードを保存する場合に使用されます。

Note

接続文字列の "Old Password" プロパティは SSPROP_AUTH_OLD_PASSWORD に設定され、現在の (または期限切れの) パスワードが設定されます。このパスワードをプロバイダー文字列のプロパティ経由で使用することはできません。

プロバイダーでは、このプロパティの値が保存されません。 このプロパティを設定すると新しい接続が行われるので、プロバイダーでは最初の接続に接続プールが使用されません。 パスワード変更が正常に行われた場合でも、現在の接続にはまだ古いパスワードが含まれているので再利用できません。古いパスワードとは、変更後に無効になるパスワードのことです。 また、ログインに成功すると、このプロパティはクリアされます。 クリア後に古いパスワードを取得しようとすると、VT_EMPTY が返されます。

Note

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 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[パスワードの変更] ダイアログを使用して新しいパスワードの入力と確認を求めるメッセージSQL Server表示されます。

ODBC プロンプトの動作とロックされたアカウント

アカウントがロックされていることにより、接続に失敗することがあります。 [SQL Server ログイン] ダイアログ ボックスが表示された後にこの現象が発生する場合は、サーバー エラー メッセージが表示され、接続試行が中止されます。 また、 [パスワードの変更] ダイアログ ボックスが表示された後にユーザーが古いパスワードに無効な値を入力すると、この現象が発生することもあります。 この場合も同じエラー メッセージが表示され、接続試行が中止されます。

ODBC 接続プーリング、パスワードの期限切れ、およびロックされたアカウント

接続プール内で接続がアクティブな状態になっている間に、アカウントがロックされたり、そのアカウントのパスワードの有効期限が切れたりすることがあります。 サーバーでは、期限切れのパスワードとロックされたアカウントを 2 回チェックします。 最初のチェックは、初回接続時に行われます。 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 が呼び出されたときに、ユーザーに適切なエラー メッセージを返します。

参照

SQL Server Native Client の機能