針對 SQL Server 2000/2005/2008/2012/2014/2016/2017/2019/2022 版本的 SA 密碼重置方案,涵蓋 Windows 整合驗證、單用戶模式、註冊表修改等多種情境。
前提:目前登入 Windows 的帳號屬於本機 Administrators 群組,或為網域管理員。
. 或 (local) 或機器名稱-- 修改 SA 密碼為新密碼
ALTER LOGIN sa WITH PASSWORD = 'NewStrongPassword123!' UNLOCK;
-- 或舊版相容語法
EXEC sp_password NULL, 'NewStrongPassword123!', 'sa';
原理:Windows 管理員透過作業系統驗證自動映射為 SQL Server sysadmin 固定伺服器角色成員。
-m (單用戶模式) → 確定sqlcmd -S . -E -- Windows 驗證
-- 或
sqlcmd -S . -U sa -- 若知道 sa 密碼但要解鎖
ALTER LOGIN sa WITH PASSWORD = 'NewStrongPassword123!' UNLOCK;
GO
-m,重啟服務恢復正常模式啟動參數加入 -f (最小組態) + -m:
sqlcmd -S . -A -E (-A 參數指定 DAC)regeditHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServerLoginMode 值:
1 = Windows Authentication Only2 = Mixed Mode (SQL Server + Windows)# 下載 Sysinternals PsExec
psexec -s -i "C:\Program Files\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\Ssms.exe"
# 以 SYSTEM 帳號啟動 SSMS,擁有最高權限可重置任何登入密碼
| 版本 | 關鍵差異 | 建議方法 |
|---|---|---|
| 2000 | Enterprise Manager、sp_password、註冊表 LoginMode | 方法一、四 |
| 2005/2008/R2 | SSMS、sqlcmd、單用戶模式 -m、DAC -A | 方法一、二、三 |
| 2012/2014 | SQL Server 組態管理員、含 LocalDB/Express | 方法一、二 |
| 2016/2017/2019/2022 | 含 Linux 容器、AlwaysOn、可用性群組 | 方法一、二 (叢集需考慮容錯移轉) |
ALTER LOGIN sa WITH CHECK_POLICY = ON, CHECK_EXPIRATION = ON;ALTER LOGIN sa DISABLE; 建立專用 sysadmin 帳號替代ALTER LOGIN sa WITH NAME = [NewAdminName]; 降低暴力破解風險EVENTDATA() 的 ClientHost| 問題 | 原因 | 解決方案 |
|---|---|---|
| Windows 驗證登入失敗:Login failed for user 'DOMAIN\USER' | 使用者非 sysadmin 角色、UAC 阻擋、未以管理員執行 SSMS | 以管理員身分執行 SSMS、確認 Windows 群組成員資格、檢查 UAC 設定 |
| 單用戶模式無法連線:Login failed (已有一個連線) | SQL Server Agent、監控工具、應用程式搶先連線 | 停用 SQL Server Agent 服務、使用 -f 最小組態模式 + DAC 連線 |
| ALTER LOGIN 失敗:Cannot alter the login 'sa' | 權限不足、登入被鎖定、包含資料庫使用者衝突 | 以 sysadmin 身分執行、先 UNLOCK、檢查包含資料庫使用者 |
| Linux 容器版 SA 密碼重置 | 環境變數 MSSQL_SA_PASSWORD 僅初始化時生效 | docker exec -it container /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "old" -Q "ALTER LOGIN sa WITH PASSWORD='new'" |
param(
[string]$Server = ".",
[string]$NewPassword = $(Read-Host -AsSecureString "New SA Password" | ConvertFrom-SecureString),
[switch]$DisableSa
)
$cred = New-Object System.Management.Automation.PSCredential("sa", $NewPassword)
$conn = "Server=$Server;User ID=sa;Password=$([Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($NewPassword)))"
try {
Invoke-Sqlcmd -ServerInstance $Server -Query "ALTER LOGIN sa WITH PASSWORD = '$([Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($NewPassword)))' UNLOCK;" -Username "sa" -Password $NewPassword -ErrorAction Stop
if ($DisableSa) {
Invoke-Sqlcmd -ServerInstance $Server -Query "ALTER LOGIN sa DISABLE;" -Username "sa" -Password $NewPassword
}
Write-Host "SA 密碼重置成功" -ForegroundColor Green
}
catch {
Write-Error "重置失敗: $_"
}