以程式設計方式變更密碼
在 SQL Server 2005 之前,當使用者密碼到期時,只有系統管理員可以重設密碼。 從 SQL Server 2005 開始,SQL Server Native Client 支援同時透過 SQL Server Native Client OLE DB 提供者與 SQL Server Native Client ODBC 驅動程式,以及透過變更 [SQL Server 登入] 對話方塊,以程式設計方式處理密碼逾期。
[!附註]
如果可能的話,請在執行階段提示使用者輸入其認證,並避免以保存的格式儲存其認證。 如果您必須保存其認證,則應該用 Win32 crypto 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 登入] 對話方塊。 使用者可以按一下 [選項] 按鈕,然後核取 [變更密碼] 來變更密碼。
如果使用者按一下 [確定],而且密碼已到期,SQL Server 就會使用 [變更 SQL Server 密碼] 對話方塊提示使用者輸入並確認新密碼。
OLE DB 提示行為與鎖定帳戶
連接嘗試可能會因為帳戶遭到鎖定而失敗。 如果在顯示 [SQL Server 登入] 對話方塊後發生這個情形,就會向使用者顯示伺服器錯誤訊息,並中止連接嘗試。 如果使用者輸入錯誤的舊密碼值,也可能在顯示 [變更 SQL Server 密碼] 對話方塊後發生這個狀況。 在此情況下,會顯示相同的錯誤訊息,並中止連接嘗試。
OLE DB 連接共用、密碼逾期與鎖定帳戶
當連接在連接共用中仍處於作用中狀態時,帳戶可能會遭到鎖定,或者其密碼可能會過期。 伺服器會在兩種時機下檢查過期的密碼與鎖定的帳戶。 第一個時機是首次建立連接時。 第二個時機則是在連接取自集區而重設連接時。
當重設嘗試失敗後,連接便會從集區移除並傳回錯誤。
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,因為只有在密碼到期時才會使用它。
請注意,每當設定 "Old Password" 屬性時,除非同時指定優先順序永遠最高的 Windows 驗證,否則提供者會假設有嘗試變更密碼。
如果使用 Windows 驗證,指定舊密碼會導致 DB_E_ERRORSOCCURRED 或 DB_S_ERRORSOCCURRED,這取決於舊密碼是否分別指定為 REQUIRED 或 OPTIONAL,以及 dwStatus 中是否傳回 DBPROPSTATUS_CONFLICTINGBADVALUE 的狀態值而定。 在呼叫 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,則密碼到期時,初始連接嘗試將會失敗。 之後呼叫 SQLError 或 SQLGetDiagRec 時,會傳回 SQLSTATE 值 28000 與原生錯誤碼值 18487。
如果 DriverCompletion 已設定為其他任何值,不管密碼是否到期,使用者都會看到 [SQL Server 登入] 對話方塊。 使用者可以按一下 [選項] 按鈕,然後核取 [變更密碼] 來變更密碼。
如果使用者按一下 [確定],而且密碼已到期,SQL Server 就會使用 [變更 SQL Server 密碼] 對話方塊提示輸入並確認新密碼。
ODBC 提示行為與鎖定帳戶
連接嘗試可能會因為帳戶遭到鎖定而失敗。 如果在顯示 [SQL Server 登入] 對話方塊後發生這個情形,就會向使用者顯示伺服器錯誤訊息,並中止連接嘗試。 如果使用者輸入錯誤的舊密碼值,也可能在顯示 [變更 SQL Server 密碼] 對話方塊後發生這個狀況。 在此情況下,會顯示相同的錯誤訊息,並中止連接嘗試。
ODBC 連接共用、密碼逾期與鎖定帳戶
當連接在連接共用中仍處於作用中狀態時,帳戶可能會遭到鎖定,或者其密碼可能會過期。 伺服器會在兩種時機下檢查過期的密碼與鎖定的帳戶。 第一個時機是首次建立連接時。 第二個時機則是在連接取自集區而重設連接時。
當重設嘗試失敗後,連接便會從集區移除並傳回錯誤。
ODBC 程式設計密碼逾期
SQL Server Native Client ODBC 驅動程式支援透過加入使用 SQLSetConnectAttr 函數連接到伺服器之前所設定的 SQL_COPT_SS_OLDPWD 屬性,處理密碼逾期。
連接控制代碼的 SQL_COPT_SS_OLDPWD 屬性指的是過期的密碼。 此屬性沒有任何連接字串屬性,因為這會干擾連接共用。 如果登入成功,驅動程式會清除這個屬性。
針對這個功能,SQL Server Native Client ODBC 驅動程式在四種情況下會傳回 SQL_ERROR:密碼逾期、密碼原則衝突、帳戶鎖定,以及使用 Windows 驗證時設定舊密碼屬性。 叫用 SQLGetDiagField 時,此驅動程式會傳回適當的錯誤訊息給使用者。