当不存在sysadmin帐户时,如何在SQL Server 2008中向用户添加sysadmin


25

我有一个正在运行的SQL Server 2008实例。不幸的是,在测试过程中,我取消了登录名的sysadmin权限,但现在无法读取(因为我没有sysadmin权限)。

除SA外,该实例没有其他sysadmin帐户。

我仅针对Windows身份验证进行了设置,因此将注册表中的LoginMode修改为2,以便可以使用Sql身份验证以SA身份登录。确实确实将登录模式设置为“混合”,但是默认情况下SA用户被禁用,由于我没有sysadmin权限,因此我无法重新启用它。

如何启用SA登录,以便进入系统管理员并将其重新分配给我的普通帐户?是否也有一个注册表设置,或者它存储在master数据库中?

Answers:


11

即使是最uber-admin类型的连接选项“专用管理员连接”(DAC)也只能用作本地连接,并允许您撤消各种恶意,但仍需要登录凭据。因此,我认为没有官方的方法可以做到这一点。

恢复该系统的最快方法是关闭SQL Server,将用户数据库文件复制到安全的地方,然后卸载,重新安装(确保将Service Pack打包到至少您以前使用的级别),将文件复制回并附加数据库。(不确定是否需要复制/返回,但是为了安全起见...)。

您仍然需要手动恢复服务器级别的对象(例如登录名)


1
谢谢-我卸载了实例并重新安装。重新连接数据库,一切恢复正常。需要注意的几件事是使用完整的数据库引擎安装程序来重新安装实例(我只有一个管理工具安装程序使我感到困惑)。此外,您还需要更改数据库文件的权限,否则在附加时会出现错误(错误5)。除此之外-一切正常。

另外,我确实制作了数据库文件的副本,但事实证明这不是必需的。卸载未删除数据库。但是,我仍然建议复制数据库文件,以防万一此行为在不同版本的SQL Server上有所不同。

27

确实存在SQL Server的实际后门,不需要重新启动和/或将任何内容重新引导到单用户模式。我在没有访问权限但需要检查内容的系统上完成了此操作。

此处下载PSexec工具。将此放置在服务器上,然后在命令提示符下执行以下命令:psexec -i -s SSMS.exe或sqlwb.exe

这将打开SSMS作为具有sysadmin访问SQL Server实例的系统帐户的权限。这是在安装SQL Server的过程中完成的,但是我听说SQL 2012并非如此。


1
不,它在SQL Server 2012 RTM及更高版本中不起作用。为了进入,您必须以服务器的本地管理组成员的单用户模式重新启动SQL Server服务。
肖恩·梅尔顿

15

SQL Server 2008与SQL Server 2005的不同之处在于,本地管理员不再继承sysadmin固定服务器角色。

安装SQL Server 2008后,它会提示您指定要添加到sysadmin角色的帐户。但是,如果在安装软件后收到包装盒,则对您没有太大帮助。

幸运的是,当SQL Server以单用户模式运行时,Microsoft保留了2005年的功能。这是您的工作:

  • 以Windows本地管理员身份登录到服务器
  • 停止SQL Server
  • 在命令提示符下,在sqlservr.exe所在的目录中,键入sqlservr.exe -m,然后按Enter键-这将以单用户模式启动SQL Server。
  • 打开SQL Server EM,并将您的帐户添加到sysadmin固定服务器角色
  • 停止SQL Server,重新启动(在命令行或在SQL Server EM中

该解决方案效果很好。只是想补充一点,当您需要通过SSMS或osql或其他方式登录时,不必以本地管理员身份登录即可在单用户模式下运行sqlservr.exe。
AbeyMarquez '18

5

这是一个很大的问题,有人会处在这种情况下,需要采取补救措施..

所有功劳归于codykonior

如果您是服务器上的Windows管理员,则可以使用PowerShell v2脚本来获得访问,而不会发生中断且没有已知风险。它通过复制SQL Server服务的登录令牌来做到这一点,即使该服务在AD服务帐户,虚拟帐户下运行或受每个服务的SID保护

下面的脚本将迭代SQL Server服务,并将您添加到sysadmin角色,无论您在何处丢失:

#GITHUB Link : https://github.com/codykonior/HackSql
$userName = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name

$services = Get-Service | Where { ($_.Name -eq 'MSSQLSERVER' -or $_.Name -like 'MSSQL$*') -and $_.Status -eq "Running" }
foreach ($service in $services) {
    if ($service.Name -eq "MSSQLSERVER") {
        $sqlName = ".\"
    } else {
        $sqlName = ".\$($service.Name.Substring(6))"
    }

    Write-Host "Attempting $sqlName"
    $serviceProcess = Get-WmiObject -Class Win32_Service -Filter "Name = '$($service.Name)'"

    Invoke-TokenManipulation -ProcessId $serviceProcess.ProcessID -ImpersonateUser | Out-Null
    $impersonatedUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
    Write-Host "Service $($service.Name) on PID $($serviceProcess.ProcessID) will connect to $sqlName as $impersonatedUser"

    $sqlConnection = New-Object System.Data.SqlClient.SqlConnection("Data Source=$sqlName;Trusted_Connection=True")
    $sqlConnection.Open()
    $sqlCommand = New-Object System.Data.SqlClient.SqlCommand("If Not Exists (Select Top 1 0 From sys.server_principals Where name = '$userName')
Begin
    Create Login [$userName] From Windows
End

If Not Exists (Select Top 1 0 From master.sys.server_principals sp Join master.sys.server_role_members srp On sp.principal_id = srp.member_principal_id Join master.sys.server_principals spr On srp.role_principal_id = spr.principal_id Where sp.name = '$userName' And spr.name = 'sysadmin')
Begin
    Exec sp_addsrvrolemember '$userName', 'sysadmin'
End", $sqlConnection)
    $sqlCommand.ExecuteNonQuery() | Out-Null
    $sqlConnection.Close()
    Invoke-TokenManipulation -RevToSelf | Out-Null
}

2

您仍然可以创建具有“ sysadmin”访问权限的登录名。感谢Microsoft的首席数据工程师(Saleem Hakani)编写了以下SQL Server技巧与窍门。

我在忘记测试机器的sa密码时处于类似状态时发现了这一点。

链接:https//blogs.technet.microsoft.com/sqlman/2011/06/14/tips-tricks-you-have-lost-access-to-sql-server-now-what/

这是您将需要执行的步骤:

  1. 使用单用户模式(或最少的配置,这也会使SQL Server进入单用户模式)启动SQL Server实例

在命令提示符下,键入:SQLServr.Exe –m(或SQLServr.exe –f)

注意:如果Binn文件夹不在您的环境路径中,则需要导航到Binn文件夹。

(通常,Binn文件夹位于:C:\ Program Files \ Microsoft SQL Server \ MSSQL10.MSSQLSERVER \ MSSQL \ Binn)

  1. 一旦以单用户模式或最小配置启动SQL Server服务,您现在可以使用命令提示符中的SQLCMD命令连接到SQL Server,并执行以下操作以将自己重新添加为SQL Server实例的管理员。

SQLCMD –S

现在,您将以管理员身份登录到SQL Server。

  1. 使用SQLCMD登录到SQL Server之后,发出以下命令来创建新帐户或向SYSADMIN服务器角色添加现有登录名。

要创建新的登录名并将该登录名添加到SYSADMIN服务器角色中:

1>使用PASSWORD =''创建登录''

2>走

1> SP_ADDSRVROLEMEMBER'','SYSADMIN'

2>开始

要将现有登录名添加到SYSADMIN服务器角色,请执行以下操作:

1> SP_ADDSRVROLEMEMBER'','SYSADMIN'

上面的操作将为现有的登录名或新的登录名授予SYSADMIN特权。

  1. 成功完成上述步骤后,下一步就是使用常规启动选项停止和启动SQL Server服务。(这一次您将不需要–f或–m)

0

您可以执行以下操作:
1)创建具有管理特权的Windows用户帐户
2)使用新的管理帐户在Windows中登录
3)使用Windows身份验证打开Sql Server Mangement Studio
4)现在您以sysadmin 身份登录SQL Server,因此您可以创建新帐户或更新sa用户


2
尝试了一下,它没有用。我在该计算机上创建了一个新的管理员登录帐户。SQL Server使用BUILTIN \ Users角色(不包括sysadmin)登录我。因此,我仍然无法更改admin类型。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.