26 sql-server
在测试期间,我取消了登录的系统管理员权限,现在无法重新添加它(因为我没有系统管理员权限)。
除[sa]帐户外,实例没有其他系统管理员帐户。
我只设置了 Windows 身份验证,所以我LoginMode在注册表中破解了2以便我可以sa使用 SQL 身份验证登录。这确实将登录模式设置为Mixed,但是sa默认情况下用户被禁用,我无法重新启用它,因为我没有系统管理员权限。
如何启用sa登录以便我可以进入并将系统管理员重新分配给我的普通帐户?是否也有一个注册表设置,或者它是否存储在主数据库中?
小智 28
确实存在进入 SQL Server 的实际后门,不需要重新启动和/或重新启动任何东西到单用户模式。我在我无权访问但需要检查内容的系统上完成了此操作。
从这里下载 PSexec 工具。将其放在服务器上,然后在命令提示符下执行此命令:psexec -i -s SSMS.exe或 sqlwb.exe
这将打开 SSMS 作为对 SQL Server 实例具有 sysadmin 访问权限的系统帐户。这是在安装 SQL Server 期间完成的,但是我听说 SQL 2012 不会这样。
小智 14
SQL Server 2008 和更新版本不会自动将本地管理员 Windows 组添加到 sysadmin 固定服务器角色中。
安装 SQL Server 2008 时,它会提示您指定要添加到 sysadmin 角色的帐户。但是,如果您在安装软件后收到盒子,这对您没有多大帮助。
幸运的是,当 SQL Server 在单用户模式下运行时,Microsoft 保留了 2005 年的功能。这是你要做的:
小智 10
此答案中提供的详细信息是正确的 - 但是其他答案确实提供了允许 SQL Server 在特殊模式下启动的变通方法,该模式允许服务器管理员以 sysadmin 角色的成员身份访问 SQL Server。
即使是最超级管理员类型的连接选项专用管理员连接 ( DAC ),它只能用作本地连接,并让您撤消各种邪恶,仍然需要登录凭据。所以我认为没有官方的方法可以做到这一点。
恢复此系统的最快方法可能是关闭 SQL Server,将用户数据库文件复制到安全的地方,卸载,重新安装(确保 Service Pack 至少达到您之前所在的级别),将文件复制回并附加数据库。(不确定是否需要复制/复制,但只是为了安全......)。
您仍然需要手动恢复服务器级对象(例如登录)
这是一个很好的问题,有人会遇到这种情况,需要救援。
如果您是服务器上的 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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
100074 次 |
| 最近记录: |