今天看到这篇文章:没有了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来登陆