Como adicionar sysadmin ao usuário no SQL Server 2008 quando não existem contas sysadmin

25

Eu tenho uma instância do SQL Server 2008 em execução. Infelizmente durante o teste, cancelei a seleção dos direitos sysadmin para o meu login e agora não consigo lê-lo (porque não tenho direitos sysadmin).

Não há outras contas sysadmin para a instância, exceto SA.

Fui configurada apenas para autenticação do Windows, então, hackeei o LoginMode no registro para 2, para poder fazer login como SA usando a autenticação SQL. Isso realmente define o modo de login como Misto, no entanto, o usuário do SA está desativado por padrão e não posso reativá-lo porque não tenho direitos de administrador de sistema.

Como habilito o login do SA para que eu possa entrar e reatribuir o sysadmin à minha conta normal? Também existe uma configuração de registro para isso ou ela é armazenada no banco de dados mestre?


fonte

Respostas:

11

Mesmo a opção de conexão mais uber-admin, DAC (Dedicated Administrator Connection ), que só pode ser usada como conexão local e permite desfazer todo tipo de dano, ainda requer credenciais de login. Então, acho que não há uma maneira oficial de fazer isso.

A maneira mais rápida de ressuscitar esse sistema pode ser desligar o SQL Server, copiar os arquivos do banco de dados do usuário em algum lugar seguro, desinstalar, reinstalar (certificando-se de que o service pack esteja no nível em que você estava anteriormente), copiar os arquivos novamente e anexar os bancos de dados. (Não sei se é necessário copiar / voltar, mas apenas para garantir ...).

Você ainda precisará recuperar manualmente os objetos no nível do servidor (por exemplo, logins)

Damien_The_Unbeliever
fonte
11
Obrigado - eu desinstalei a instância e reinstalei. Anexou novamente o banco de dados e tudo está bem novamente. Algumas coisas a serem observadas estavam usando o instalador completo do mecanismo de banco de dados para reinstalar a instância (eu tinha apenas um instalador de ferramentas de gerenciamento que me atrapalhou por um tempo). Também é necessário alterar as permissões nos arquivos do banco de dados, caso contrário, você receberá um erro ao anexar (erro 5). Fora isso - tudo funcionou bem.
Além disso, fiz uma cópia dos arquivos do banco de dados, mas isso não foi necessário. A desinstalação não removeu os bancos de dados. No entanto, eu ainda recomendaria copiar os arquivos do banco de dados, caso esse comportamento seja diferente em diferentes versões do SQL Server.
27

Existe um backdoor real no SQL Server que não requer reiniciar e / ou reiniciar nada no modo de usuário único. Eu fiz isso em sistemas onde eu não tinha acesso, mas precisava verificar as coisas.

Faça o download das ferramentas PSexec aqui . Coloque isso no servidor e, em um prompt de comando, execute este comando: psexec -i -s SSMS.exeou sqlwb.exe

Isso abrirá o SSMS como a conta do sistema que possui acesso sysadmin à instância do SQL Server. Isso é feito durante a instalação do SQL Server, no entanto, ouvi dizer que isso não acontecerá com o SQL 2012.

Shawn Melton
fonte
11
Não, ele não funciona no SQL Server 2012 RTM e acima. Para entrar, você deve reiniciar o serviço SQL Server no modo de usuário único como membro do grupo de administradores locais do servidor.
Shawn Melton
15

O SQL Server 2008 é diferente do SQL Server 2005, pois os administradores locais não herdam mais a função de servidor fixa sysadmin.

Quando o SQL Server 2008 é instalado, solicita que você designe uma conta a ser adicionada à função sysadmin. Se você receber a caixa após a instalação do software, isso não ajudará muito.

Felizmente, a Microsoft preservou a funcionalidade de 2005 quando o SQL Server está sendo executado no modo de usuário único. Aqui está o que você faz:

  • faça login no servidor como administrador local do Windows
  • parar o servidor sql
  • no prompt de comando, no diretório em que reside o sqlservr.exe, digite sqlservr.exe -m e pressione enter - isso iniciará o SQL Server no modo de usuário único
  • abra o SQL Server EM e adicione sua conta à função de servidor fixa sysadmin
  • interrompa o servidor sql, reinicie (na linha de comando ou no SQL Server EM

fonte
Esta solução funciona lindamente. Só queria acrescentar que você não precisa estar logado como administrador local para executar o sqlservr.exe no modo de usuário único, apenas quando você precisar fazer login através do SSMS ou osql ou qualquer outra coisa.
AbeyMarquez #
5

Essa é uma ótima pergunta e alguém estará nessa situação e precisará de um resgate.

Todo o crédito vai para codykonior

Se você for um administrador do Windows no servidor , poderá usar um script do PowerShell v2 para obter acesso sem interrupções nem riscos conhecidos. Isso é feito duplicando o token de logon do serviço SQL Server, mesmo que esteja sendo executado em uma conta de serviço AD, conta virtual ou protegido com um SID por serviço

O script abaixo iterará os serviços do SQL Server e o adicionará à função sysadmin onde quer que você esteja ausente:

#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
}
Kin Shah
fonte
2

Você ainda pode criar um logon com acesso 'sysadmin'. Os agradecimentos ao Principal Data Engineer da Microsoft (Saleem Hakani) criaram as Dicas e Truques do SQL Server abaixo.

Descobri isso enquanto eu estava preso em um estado semelhante quando esqueci a senha sa da minha máquina de teste.

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

Aqui estão as etapas que você precisará executar:

  1. Inicie a instância do SQL Server usando o modo de usuário único (ou configuração mínima que também colocará o SQL Server no modo de usuário único)

No prompt de comando, digite: SQLServr.Exe –m (ou SQLServr.exe –f)

Nota: Se a pasta Binn não estiver no seu caminho ambiental, você precisará navegar até a pasta Binn.

(Geralmente, a pasta Binn está localizada em: C: \ Arquivos de Programas \ Microsoft SQL Server \ MSSQL10.MSSQLSERVER \ MSSQL \ Binn)

  1. Depois que o serviço SQL Server for iniciado no modo de usuário único ou com configuração mínima, agora você poderá usar o comando SQLCMD no prompt de comando para se conectar ao SQL Server e executar as seguintes operações para se adicionar novamente como administrador na instância do SQL Server.

SQLCMD –S

Agora você estará conectado ao SQL Server como administrador.

  1. Depois de fazer login no SQL Server usando SQLCMD, emita os seguintes comandos para criar uma nova conta ou adicione um logon existente à função de servidor SYSADMIN.

Para criar um novo logon e adicionar esse logon à função de servidor SYSADMIN:

1> CREATE LOGIN '' com PASSWORD = ''

2> ir

1> SP_ADDSRVROLEMEMBER '', 'SYSADMIN'

2> ir

Para adicionar um logon existente à função de servidor SYSADMIN, execute o seguinte:

1> SP_ADDSRVROLEMEMBER '', 'SYSADMIN'

A operação acima cuidará da concessão de privilégios SYSADMIN para um logon existente ou para um novo logon.

  1. Depois que as etapas acima forem executadas com êxito, a próxima etapa é parar e iniciar os serviços do SQL Server usando opções regulares de inicialização. (Desta vez, você não precisará de –f ou –m)
Ramakant Dadhichi
fonte
0

Você pode fazer o seguinte:
1) Crie uma conta de usuário do Windows com privilégios administrativos
2) Entre no Windows com a nova conta administrativa
3) Abra o Sql Server Mangement Studio usando a autenticação do Windows
4) Agora você está logado no SQL Server como sysadmin, portanto você pode criar novas contas ou atualizar o usuário sa

Juan Carlos Velez
fonte
2
Tentei isso e não funcionou. Criei uma nova conta de login de administrador nessa máquina. O servidor SQL usa as funções BUILTIN \ Users (que não incluem o sysadmin) para efetuar login. Portanto, ainda não consigo fazer alterações no tipo de administrador.