首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 忘記 SA 密碼重置完整解決方案

     編輯:關於SqlServer

SA 密碼遺失的多種重置方法

針對 SQL Server 2000/2005/2008/2012/2014/2016/2017/2019/2022 版本的 SA 密碼重置方案,涵蓋 Windows 整合驗證、單用戶模式、註冊表修改等多種情境。

方法一:Windows 整合驗證 (最簡單、適用 2000+)

前提:目前登入 Windows 的帳號屬於本機 Administrators 群組,或為網域管理員。

  1. 開啟「查詢分析器」/「SQL Server Management Studio (SSMS)」
  2. 伺服器名稱:. 或 (local) 或機器名稱
  3. 驗證模式:選擇 Windows 驗證
  4. 連線成功後,開啟新查詢視窗執行:
-- 修改 SA 密碼為新密碼
ALTER LOGIN sa WITH PASSWORD = 'NewStrongPassword123!' UNLOCK;
-- 或舊版相容語法
EXEC sp_password NULL, 'NewStrongPassword123!', 'sa';

原理:Windows 管理員透過作業系統驗證自動映射為 SQL Server sysadmin 固定伺服器角色成員。

方法二:單用戶模式啟動 (適用 2005+、無 Windows 管理員權限)

  1. 開啟 SQL Server 組態管理員 (SQLServerManager10.msc 等對應版本)
  2. 選擇 SQL Server 服務 → 右鍵目標執行個體 (MSSQLSERVER 或具名實體) → 內容
  3. 啟動參數 索引標籤 → 在現有參數後加入 -m (單用戶模式) → 確定
  4. 重啟 SQL Server 服務
  5. 以命令列連線 (單用戶模式只允許一個連線):
    sqlcmd -S . -E  -- Windows 驗證
    -- 或
    sqlcmd -S . -U sa  -- 若知道 sa 密碼但要解鎖
  6. 執行密碼重置:
ALTER LOGIN sa WITH PASSWORD = 'NewStrongPassword123!' UNLOCK;
GO
  1. 移除啟動參數 -m,重啟服務恢復正常模式

方法三:最小組態模式 (適用 2000/2005、單用戶模式被佔用)

啟動參數加入 -f (最小組態) + -m:

  • 只啟動核心服務,停用檢查點、寫入器、鎖管理器等
  • 預設只允許專用管理員連線 (DAC)
  • 連線方式:sqlcmd -S . -A -E (-A 參數指定 DAC)

方法四:註冊表修改驗證模式 (SQL Server 2000 專用)

  1. 開啟 regedit
  2. 瀏覽至:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer
  3. 修改 LoginMode 值:
    • 1 = Windows Authentication Only
    • 2 = Mixed Mode (SQL Server + Windows)
  4. 重啟 MSSQLServer 服務
  5. 使用 Windows 驗證登入重置 SA 密碼

方法五:PSExec 系統帳號提權 (無管理員權限時)

# 下載 Sysinternals PsExec
psexec -s -i "C:\Program Files\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\Ssms.exe"
# 以 SYSTEM 帳號啟動 SSMS,擁有最高權限可重置任何登入密碼

版本特定注意事項

版本關鍵差異建議方法
2000Enterprise Manager、sp_password、註冊表 LoginMode方法一、四
2005/2008/R2SSMS、sqlcmd、單用戶模式 -m、DAC -A方法一、二、三
2012/2014SQL Server 組態管理員、含 LocalDB/Express方法一、二
2016/2017/2019/2022含 Linux 容器、AlwaysOn、可用性群組方法一、二 (叢集需考慮容錯移轉)

安全性最佳實踐 (重置後必做)

  1. 啟用密碼原則:ALTER LOGIN sa WITH CHECK_POLICY = ON, CHECK_EXPIRATION = ON;
  2. 停用 SA 帳號 (若不使用):ALTER LOGIN sa DISABLE; 建立專用 sysadmin 帳號替代
  3. 重新命名 SA:ALTER LOGIN sa WITH NAME = [NewAdminName]; 降低暴力破解風險
  4. 審核登入失敗:伺服器屬性 → 安全性 → 登入稽核:失敗的登入
  5. 限制連線來源:登入觸發器檢查 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'"

自動化密碼輪換腳本 (PowerShell)

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 "重置失敗: $_"
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved