プログラムによる SQL Server ネイティブ クライアント パスワードの変更
適用対象: SQL Server
Azure SQL データベース
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
重要
SQL Server Native Client (SNAC) は同梱されていません。
- SQL Server 2022 (16.x) 以降のバージョン
- SQL Server Management Studio 19 以降のバージョン
SQL Server Native Client (SQLNCLI または SQLNCLI11) と従来の Microsoft OLE DB Provider for SQL Server (SQLOLEDB) は、新しいアプリケーション開発には推奨されません。
新しいプロジェクトの場合は、次のいずれかのドライバーを使用します。
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 サーバー ログイン ダイアログ ボックスに加えられた変更によるパスワードの有効期限をサポートします。 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 サーバー ログイン ダイアログ ボックスに加えられた変更によるパスワードの有効期限をサポートします。
SQLDriverConnectが呼び出され、DriverCompletionの値がSQL_DRIVER_NOPROMPTに設定されている場合、パスワードの有効期限が切れている場合、最初の接続試行は失敗します。 SQLSTATE 値 28000 とネイティブ エラー コード値 18487 は、後続の SQLError または SQLGetDiagRec の呼び出しによって返されます。
DriverCompletionが他の値に設定されている場合、パスワードの有効期限が切れているかどうかに関係なく、SQL Server Login ダイアログが表示されます。 ユーザーは、 [オプション] をクリックし、 [パスワードの変更] チェック ボックスをオンにしてパスワードを変更できます。
ユーザーが [OK] をクリックし、パスワードの有効期限が切れている場合、SQL Server は Change 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 が呼び出されたときに、ユーザーに適切なエラー メッセージを返します。