以程式設計方式變更 SQL Server Native Client 密碼
適用於: SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 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 登入對話框的變更,以程式設計方式處理密碼到期。
注意
如果可能的話,請在執行階段提示使用者輸入其認證,並避免以保存的格式儲存其認證。 如果您必須保存其認證,則應該用 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 (type 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 Driver
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 登入 ] 對話框。 使用者可以按一下 [選項] 按鈕,然後核取 [變更密碼] 來變更密碼。
如果使用者按兩下 [確定],且密碼已過期,SQL Server 會提示輸入並使用 [ 變更 SQL Server 密碼] 對話框確認新密碼 。
ODBC 提示行為和鎖定的帳戶
連接嘗試可能會因為帳戶遭到鎖定而失敗。 如果在顯示 [SQL Server 登入] 對話方塊後發生這個狀況,就會向使用者顯示伺服器錯誤訊息,並中止連接嘗試。 如果使用者輸入錯誤的舊密碼值,也可能在顯示 [變更 SQL Server 密碼] 對話方塊後發生這個狀況。 在此情況下,會顯示相同的錯誤訊息,並中止連接嘗試。
ODBC 連線共用、密碼到期和鎖定的帳戶
當連接在連接共用中仍處於作用中狀態時,帳戶可能會遭到鎖定,或者其密碼可能會過期。 伺服器會在兩種時機下檢查過期的密碼與鎖定的帳戶。 第一個時機是首次建立連接時。 第二個時機則是在連接取自集區而重設連接時。
當重設嘗試失敗後,連接便會從集區移除並傳回錯誤。
ODBC 程式設計密碼到期
SQL Server Native Client ODBC 驅動程式透過新增 SQL_COPT_SS_OLDPWD 屬性支持密碼到期,該屬性是在使用 SQLSetConnectAttr 函式連線到伺服器之前設定的。
線上句柄的 SQL_COPT_SS_OLDPWD 屬性是指過期的密碼。 此屬性沒有 連接字串 屬性,因為這會干擾連線共用。 如果登入成功,驅動程式會清除這個屬性。
SQL Server Native Client ODBC 驅動程式會針對這項功能傳回SQL_ERROR四種情況:密碼到期、密碼原則衝突、帳戶鎖定,以及使用 Windows 驗證時設定舊的密碼屬性。 叫用 SQLGetDiagField 時,驅動程式會將適當的錯誤訊息傳回給使用者。