今天看到這篇文章:沒有了SA密碼,沒法Windows集成身份登陸,DBA怎麼辦?html
想起來以前着急哥問個人一個問題,一個DBA刪除了Windows登陸用戶,並且SQLSERVER服務器的驗證方式是Windows身份驗證sql
怎麼辦??shell
我當時給他的答覆是:重裝系統數據庫master數據庫
今天看到這篇文章沒有了SA密碼,沒法Windows集成身份登陸,DBA怎麼辦?,有思路了服務器
假設咱們遇到很糟糕的狀況ide
sa被禁用,服務器身份驗證爲Windows身份驗證模式,Windows登陸用戶被刪,沒有其餘sysadmin角色的登陸用戶sqlserver
步驟一:網站
停掉SQLSERVER:在命令行 net stop mssqlserverspa
步驟二:命令行
轉到SQLSERVER的安裝目錄
而後加上/m /f 參數
步驟三:覺得單用戶模式啓動SQLSERVER
步驟四:打開SSMS
這時候必定不要立刻進行鏈接,須要點擊取消,而後在左上角的點擊新建查詢,這個步驟跟DAC(專用管理員鏈接)的步驟是同樣的
你會發現用Windows登陸用戶這時候能夠登陸
步驟五:執行下面的SQL腳本
1 --打開xp_cmdshell功能 2 EXEC [sys].[sp_configure] @configname = 'xp_cmdshell', -- varchar(35) 3 @configvalue = 1 -- int 4 RECONFIGURE WITH override 5 6 7 --修改註冊表,修改身份驗證爲混合驗證方式 8 USE [master] 9 GO 10 EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'LoginMode', REG_DWORD, 2 11 GO 12 13 --建立登陸名 14 CREATE LOGIN [計算機名\Administrator] FROM WINDOWS; 15 GO 16 17 --賦予登陸名的權限爲sysadmin 18 USE master 19 GO 20 EXEC [sys].[sp_addsrvrolemember] @loginame = '計算機名\Administrator', -- sysname 21 @rolename = sysadmin -- sysname 22 23 --關閉xp_cmdshell功能 24 EXEC [sys].[sp_configure] @configname = 'xp_cmdshell', -- varchar(35) 25 @configvalue = 0 -- int 26 RECONFIGURE WITH override
這時候身份驗證方式已經改成混合驗證方式
步驟六:關掉SQLSERVER,再從新啓動
打開SQLSERVER配置管理器,啓動SQLSERVER
步驟七:登陸SQLSERVER
回到SSMS,能夠看到這時候恢復正常了
總結
感謝博客園裏的i6first,以前一直覺得沒法子了,想不到他想到了用單用戶模式啓動的方法來進入SQLSERVER
參考文章:GRANT 服務器權限 (Transact-SQL)
若有不對的地方,歡迎你們拍磚o(∩_∩)o
2014-2-26補充:
在進行上面操做以前,SQL BROSWER服務必定要開啓,不然在進行步驟四的時候會提示數據庫處於單用戶模式,不能登陸!!
2014-11-20補充:
今晚某童鞋找到我,說他禁用了Windows登陸用戶和sa,無辦法再登陸SQLSERVER,服務器上跑着百萬PV的網站
停機的話電話就會打爆,他使用了本文的方法,惋惜不奏效
詳細講解:
若是禁用了sa和禁用了Windows登陸用戶(注意:是禁用不是刪除)
那麼使用上述方法的時候,在啓動SQLSERVER的時候會報錯:Windows賬戶 計算機名/Administrator 已被禁用
解決方法:在Windows上新建一個 Administrator組的Windows賬戶 好比 test賬戶,隸屬於Administrator組
而後切換Windows登陸用戶到test ,使用上面的方法,用「管理員身份運行」 CMD,以/m /f 啓動sqlserver
用sqlcmd 進入命令行就能夠了
原理:sqlserver裏的Windows賬戶是跟Windows的賬戶用SID綁定映射的
SQL首先使用你當前登陸的Windows賬戶來登陸sqlserver,這樣就致使了當Windows賬戶被禁用的話他不會使用sa來登陸(也就是其餘擁有sysadmin權限的
登陸用戶來登陸,不考慮SQL登陸驗證)
我這裏的方法是切換到別的Windows賬戶下,這樣SQL就找不到當前Windows賬戶跟SQL裏面的登陸用戶的SID登陸映射
SQLSERVER就會使用sa來登陸