共用方式為


以程式設計方式變更密碼

在 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 登入 ] 對話方塊。 使用者可以按下 [ 選項 ] 按鈕,然後核取 [ 變更密碼 ] 來變更密碼。

如果使用者按兩下 [確定],且密碼已過期,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) 属性,支持密碼到期。

現有的「密碼」屬性是指DBPROP_AUTH_PASSWORD,並用來儲存新密碼。

備註

在連接字串中,「Old Password」 屬性會設定 SSPROP_AUTH_OLD_PASSWORD,這是目前無法透過提供者字串屬性使用的密碼。

提供者不會保存這個屬性的值。 設定這個屬性時,提供者不會針對第一個連接使用連接集區,因為會發生新的連線。 如果密碼變更成功,則無法重複使用目前的連線,因為它仍然包含舊密碼,密碼變更之後將會無效。 此外,如果登入成功,提供者會清除這個屬性。 後續嘗試擷取舊密碼傳回VT_EMPTY。

備註

SSPROP_AUTH_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 是由後續 SQLErrorSQLGetDiagRec 呼叫所傳回。

如果 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 時,驅動程式會將適當的錯誤訊息傳回給使用者。

另請參閱

SQL Server Native Client 功能