在 SQL Server 2005/2008 中,當登入帳號建立時勾選了「強制執行密碼原則」與「使用者必須在下次登入時變更密碼」(MUST_CHANGE = ON),後續若嘗試取消勾選「強制執行密碼原則」(CHECK_POLICY = OFF),會報錯 錯誤 15128:
當 MUST_CHANGE 為 ON (開) 時,不能將 CHECK_POLICY 和 CHECK_EXPIRATION 選項設為 OFF (關)。
MUST_CHANGE = ON 表示該登入下次登入必須變更密碼。此狀態下,密碼原則檢查 (CHECK_POLICY) 與到期檢查 (CHECK_EXPIRATION) 必須保持啟用,否則無法保證新密碼符合原則。因此直接在屬性視窗取消勾選會被阻擋。
使用 ALTER LOGIN 陳述式指定新密碼,執行後 MUST_CHANGE 會自動變為 OFF,即可在屬性視窗自由調整原則選項。
sa 或具備 ALTER ANY LOGIN 權限的帳號開啟新查詢視窗。登入名 與 新密碼 替換為實際值):ALTER LOGIN [登入名] WITH PASSWORD = N'新密碼';
SQL Server 登入不像 Windows 帳號支援「登入時強制變更密碼」的互動式提示。若 MUST_CHANGE = ON,使用者嘗試登入時會收到錯誤 18488: 登入失敗,密碼必須變更,但無法在同一連線中完成變更,導致無法登入進而修改密碼,形成死結。
若該登入無關聯資料庫使用者/權限/物件擁有權,最快方式是:
注意:刪除登入會移除其對應的資料庫使用者與權限,請確認影響範圍後再執行。
-- 1. 查看目前登入狀態
SELECT name, is_policy_checked, is_expiration_checked, password_hash IS NOT NULL AS has_password
FROM sys.sql_logins
WHERE name = N'登入名';
-- 2. 變更密碼 (自動將 MUST_CHANGE 設為 OFF)
ALTER LOGIN [登入名] WITH PASSWORD = N'NewStr0ng!P@ss';
-- 3. 再次查看狀態確認
SELECT name, is_policy_checked, is_expiration_checked
FROM sys.sql_logins
WHERE name = N'登入名';