sysadmin 계정이 없을 때 SQL Server 2008에서 사용자에게 sysadmin을 추가하는 방법


25

SQL Server 2008 인스턴스가 실행 중입니다. 불행히도 테스트 중에는 로그인에 대한 sysadmin 권한을 선택 해제했으며 이제 sysadmin 권한이 없기 때문에 읽을 수 없습니다.

SA를 제외하고 인스턴스에 대한 다른 sysadmin 계정이 없습니다.

나는 Windows 인증 만 설정하여 레지스트리의 LoginMode를 2로 해킹하여 SQL 인증을 사용하여 SA로 로그인 할 수있었습니다. 이것은 실제로 로그인 모드를 혼합으로 설정하지만 SA 사용자는 기본적으로 비활성화되어 있으며 sysadmin 권한이 없기 때문에 다시 활성화 할 수 없습니다.

SA 로그인을 활성화하여 sysadmin을 일반 계정에 다시 할당하려면 어떻게해야합니까? 이것에 대한 레지스트리 설정이 있거나 마스터 데이터베이스에 저장되어 있습니까?

답변:


11

로컬 연결로만 사용할 수 있으며 모든 종류의 악의를 취소 할 수 있는 대부분의 uber-admin 유형 연결 옵션 인 DAC (Dedicated Administrator Connection )도 로그인 자격 증명이 필요합니다. 따라서 공식적인 방법은 없다고 생각합니다.

이 시스템을 부활시키는 가장 빠른 방법은 SQL Server를 종료하고 안전한 위치에 사용자 데이터베이스 파일을 복사 한 다음 제거하고 다시 설치 (최소한 수준의 서비스 팩을 유지)하고 파일을 다시 복사하여 첨부하는 것입니다. 데이터베이스. (복사 / 뒤로 복사가 필요한지 확실하지 않지만 안전을 위해 ...).

여전히 서버 수준 개체 (예 : 로그인)를 수동으로 복구해야합니다.


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 서비스를 다시 시작해야합니다.
Shawn Melton

15

로컬 관리자가 더 이상 sysadmin 고정 서버 역할을 상속하지 않는다는 점에서 SQL Server 2008은 SQL Server 2005와 다릅니다.

SQL Server 2008이 설치되면 sysadmin 역할에 추가 할 계정을 지정하라는 메시지가 나타납니다. 그러나 소프트웨어를 설치 한 후 상자가 표시되면 크게 도움이되지 않습니다.

다행히도 Microsoft는 SQL Server가 단일 사용자 모드에서 실행될 때 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

5

이것은 좋은 질문이며 누군가는 이런 상황에 처하게 될 것이며 그로부터 구조가 필요합니다 ..

모든 크레딧은 codykonior갑니다.

서버Windows 관리자 인 경우 PowerShell v2 스크립트를 사용하여 중단없이 알려진 위험없이 액세스 할 수 있습니다. AD 서비스 계정, 가상 계정으로 실행되거나 서비스 별 SID로 보호되는 경우에도 SQL Server 서비스의 로그인 토큰을 복제하여이를 수행합니다.

아래 스크립트는 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)의 Principal Data Engineer가 아래 SQL Server Tips & Trick을 작성했습니다.

테스트 시스템의 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을 포함하지 않음)을 사용하여 로그인합니다. 따라서 여전히 관리자 유형을 변경할 수 없습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.