最棘手的 SQL Server 存取失效情境:sa 停用、僅允許 Windows 驗證、Windows 登入被誤刪、無其他 sysadmin 成員。本文提供經實測可行的單一使用者模式(-m/-f)緊急修復流程,可重獲系統管理員存取權並修正驗證模式。
sa 登入:停用BUILTIN\Administrators 或特定 Windows 登入:已被刪除sysadmin 固定伺服器角色成員結果:SSMS 無法連線,OSQL -E 亦失敗。
啟動參數加入 -m(或 -f)後,本機 Administrators 群組任何成員均可透過 Windows 驗證以 sysadmin 身分連線,不檢查 syslogins 是否存在該登入。Microsoft 官方文件明確說明:
"Any member of the computer's local Administrators group can then connect to the instance of SQL Server as a member of the sysadmin fixed server role."
net stop MSSQLSERVER -- 預設執行個體
-- 或
net stop MSSQL$INSTANCE_NAME -- 命名執行個體
-m → 新增 → 確定。或使用命令列暫時啟動(不修改永久參數):
cd "C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn"
sqlservr.exe -m -s MSSQLSERVER
-- 1. 啟用 xp_cmdshell(修改登錄需用)
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE WITH OVERRIDE;
GO
-- 2. 修改登錄將驗證模式改為混合模式 (2 = Mixed)
USE master;
GO
EXEC xp_instance_regwrite
N'HKEY_LOCAL_MACHINE',
N'Software\Microsoft\MSSQLServer\MSSQLServer',
N'LoginMode', REG_DWORD, 2;
GO
-- 3. 建立本機管理員 Windows 登入並授予 sysadmin
-- 假設電腦名為 SERVER01,帳號為 Administrator
CREATE LOGIN [SERVER01\Administrator] FROM WINDOWS;
GO
EXEC sp_addsrvrolemember @loginame = 'SERVER01\Administrator', @rolename = 'sysadmin';
GO
-- 4. (可選)重設 sa 密碼並啟用
ALTER LOGIN sa WITH PASSWORD = 'NewStrongP@ssw0rd', CHECK_POLICY = OFF;
ALTER LOGIN sa ENABLE;
GO
-- 5. 關閉 xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 0; RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'show advanced options', 0; RECONFIGURE;
GO
-m。sa + 新密碼連線 → 成功。若僅修改電腦名稱,原 Windows 登入格式 OLDNAME\User 失效。同樣可用 -m 模式進入,執行:
CREATE LOGIN [NEWNAME\User] FROM WINDOWS;
EXEC sp_addsrvrolemember 'NEWNAME\User', 'sysadmin';
或直接修改現有登入名稱(SQL Server 2005+):
ALTER LOGIN [OLDNAME\User] WITH NAME = [NEWNAME\User];
-m → 啟動服務。LoginMode=2 → 建立/修正 Windows 登入 → 授予 sysadmin → (可選)重設 sa → 關閉 xp_cmdshell。-m → 正常重啟 → 驗證雙模式登入。此法為官方支援的緊急存取機制,無需重裝 Master 資料庫,可在數分鐘內恢復控制權。