Jak mogę przyznać sobie dostęp administracyjny do lokalnej instancji SQL Server?

94

Zainstalowałem SQL Server 2008 R2 na moim komputerze lokalnym. Ale nie mogę utworzyć nowej bazy danych ze względu na prawa (lub ich brak).

„ODMOWA UTWORZENIA BAZY DANYCH”

Dlatego próbowałem przypisać uprawnienia administratora do mojego obecnego loginu

„Użytkownik nie ma uprawnień do wykonania tej czynności”.

Próbowałem również utworzyć nowy login, który miałby uprawnienia administratora, ale bez powodzenia. Jak przyznać sobie uprawnienia administratora, aby móc utworzyć bazę danych? Mogę ponownie zainstalować, ale wolę tego nie robić.

SkonJeet
źródło
1
Czy próbujesz się połączyć za pomocą uwierzytelniania programu SQL Server lub uwierzytelniania systemu Windows?
Darren
Uwierzytelnianie systemu Windows (patrz tytuł). Łączę się pomyślnie. Błędy pochodzą z próby wykonania zadań administracyjnych.
SkonJeet

Odpowiedzi:

70

Tak - wygląda na to, że zapomniałeś dodać się do roli sysadmin podczas instalowania SQL Server. Jeśli jesteś administratorem lokalnym na swoim komputerze, ten wpis na blogu może pomóc w użyciu SQLCMD do przeniesienia konta do grupy administratorów systemu SQL Server bez konieczności ponownej instalacji. To trochę luka w zabezpieczeniach w SQL Server, jeśli o mnie chodzi, ale pomoże ci w tym przypadku.

Brian Knight
źródło
15
To nie jest luka w zabezpieczeniach, lokalni administratorzy muszą mieć uprawnienia do serwera sql, w rzeczywistości administrator lokalny i tak byłby w stanie uzyskać dostęp do danych serwera sql, kopiując pliki danych na inny komputer (a następnie kopiując z powrotem w razie potrzeby), więc jedynym sposobem na obejście tego
problemu
TO powinno być łatwiejsze niż odinstalowanie / ponowna instalacja? Prawie wcale! W moim przypadku przenieśliśmy się do innej domeny; wszystkie istniejące loginy są bezwartościowe.
dudeNumber4
8
Link jest martwy (a odpowiedzi zawierające tylko łącze są odradzane). stackoverflow.com/a/9889484/389424 zawiera te same instrukcje co oryginalny post na blogu
janv8000
82

Otwórz okno wiersza polecenia. Jeśli masz już uruchomione domyślne wystąpienie programu SQL Server, uruchom następujące polecenie w wierszu polecenia, aby zatrzymać usługę SQL Server:

net stop mssqlserver

Teraz przejdź do katalogu, w którym jest zainstalowany serwer SQL. Katalog może być na przykład jednym z następujących:

C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn
C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn

Znajdź swój katalog MSSQL i wejdź CDdo niego jako taki:

CD C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn

Teraz uruchom następujące polecenie, aby uruchomić SQL Server w trybie pojedynczego użytkownika. Jak SQLCMDokreślono, SQLCMDmożna nawiązać tylko jedno połączenie (z innego okna wiersza polecenia).

sqlservr -m"SQLCMD"

Teraz otwórz kolejne okno wiersza polecenia jako ten sam użytkownik, który uruchomił SQL Server w trybie pojedynczego użytkownika powyżej i uruchom w nim:

sqlcmd

I naciśnij Enter. Teraz możesz wykonywać instrukcje SQL względem instancji SQL Server działającej w trybie pojedynczego użytkownika:

create login [<<DOMAIN\USERNAME>>] from windows;

-- For older versions of SQL Server:
EXEC sys.sp_addsrvrolemember @loginame = N'<<DOMAIN\USERNAME>>', @rolename = N'sysadmin';

-- For newer versions of SQL Server:
ALTER SERVER ROLE [sysadmin] ADD MEMBER [<<DOMAIN\USERNAME>>];

GO

Źródło .

AKTUALIZACJA Nie zapomnij średnika po ALTER SERVER ROLE [sysadmin] ADD MEMBER [<<DOMAIN\USERNAME>>];i nie dodawaj dodatkowego średnika po GOlub polecenie nigdy nie zostanie wykonane.

Darren
źródło
Szybka uwaga, że ​​sp_addsrvrolemember został zastąpiony przez ALTER SERVER ROLE. np.ALTER SERVER ROLE [sysadmin] ADD MEMBER [domain\username]
Fermin
Nie zapomnij dodać GO;na końcu
NMrt
Biorąc pod uwagę, że wielu z nas korzysta teraz z SQL Server bez SSMS, uważam, że jest to znacznie lepsza odpowiedź.
Chaim Eliyah
39

Zaadoptowałem bazę danych SQL 2012, w której nie byłem sysadminem, ale byłem administratorem na komputerze. Użyłem SSMS z opcją „Uruchom jako administrator”, dodałem konto NT jako login SQL i ustawiłem rolę serwera na sysadmin. Nie ma problemu.

Vince P.
źródło
14
To rozwiązanie zadziałało dla mnie, wymagając jednego dodatkowego kroku: musiałem uruchomić serwer sql w trybie pojedynczego użytkownika, dodając flagę „-m”. Można to zrobić za pomocą „SQL Server Configuration Manager”, kliknąć prawym przyciskiem instancję serwera i wybrać właściwości, przejść do zakładki „Startup Parameters” i dodać -m.
ma miejsce
To jest niesamowite. O wiele prostsze niż inne odpowiedzi.
McKay
1
Zdecydowanie najszybsza i najlepsza ze wszystkich odpowiedzi
Johnny
Całkiem proste i działa jak urok. Dzięki, Vince i maets.
Edgar Salazar
1
To jest właściwie prawidłowa odpowiedź. Jedna uwaga, aby uzyskać SQL w trybie pojedynczego użytkownika, musiałem uruchomić> net stop MSSQL $ SQLEXPRESS, a następnie> net start MSSQL $ SQLEXPRESS / m
Ev.
29

Oto skrypt, który twierdzi, że jest w stanie to naprawić.

Uzyskaj prawa administratora do lokalnego programu SQL Server Express za pomocą tego prostego skryptu

Pobierz link do skryptu

Opis

Ten skrypt poleceń umożliwia łatwe dodanie się do roli administratora lokalnego w lokalnej instancji programu SQL Server. Musisz być członkiem lokalnej grupy administratorów systemu Windows lub mieć dostęp do poświadczeń użytkownika, który jest. Skrypt obsługuje SQL Server 2005 i nowsze.

Skrypt jest najbardziej przydatny, jeśli jesteś programistą próbującym użyć programu SQL Server 2008 Express zainstalowanego przez kogoś innego. W takiej sytuacji zazwyczaj nie będziesz mieć uprawnień administratora do instancji SQL Server 2008 Express, ponieważ domyślnie tylko osoba instalująca SQL Server 2008 ma uprawnienia administracyjne.

Użytkownik, który zainstalował SQL Server 2008 Express, może użyć SQL Server Management Studio, aby nadać Ci niezbędne uprawnienia. Ale co, jeśli nie zainstalowano programu SQL Server Management Studio? Albo gorzej, jeśli użytkownik instalujący nie jest już dostępny?

Ten skrypt rozwiązuje problem za pomocą zaledwie kilku kliknięć!

Uwaga: Będziesz musiał podać plik BAT z „Nazwą wystąpienia” (prawdopodobnie będzie to „MSSQLSERVER” - ale może nie być): możesz uzyskać wartość, uruchamiając najpierw następujące polecenie w „Konsoli zarządzania Microsoft SQL Server ":

 SELECT @@servicename

Następnie skopiuj wynik, aby użyć go, gdy plik BAT monituje o „nazwę instancji SQL”.

  @echo off 
    rem 
    rem **************************************************************************** 
    rem 
    rem    Copyright (c) Microsoft Corporation. All rights reserved. 
    rem    This code is licensed under the Microsoft Public License. 
    rem    THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF 
    rem    ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY 
    rem    IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR 
    rem    PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT. 
    rem 
    rem **************************************************************************** 
    rem 
    rem CMD script to add a user to the SQL Server sysadmin role 
    rem 
    rem Input:  %1 specifies the instance name to be modified. Defaults to SQLEXPRESS. 
    rem         %2 specifies the principal identity to be added (in the form "<domain>\<user>"). 
    rem            If omitted, the script will request elevation and add the current user (pre-elevation) to the sysadmin role. 
    rem            If provided explicitly, the script is assumed to be running elevated already. 
    rem 
    rem Method: 1) restart the SQL service with the '-m' option, which allows a single connection from a box admin 
    rem            (the box admin is temporarily added to the sysadmin role with this start option) 
    rem         2) connect to the SQL instance and add the user to the sysadmin role 
    rem         3) restart the SQL service for normal connections 
    rem 
    rem Output: Messages indicating success/failure. 
    rem         Note that if elevation is done by this script, a new command process window is created: the output of this 
    rem         window is not directly accessible to the caller. 
    rem 
    rem 
    setlocal 
    set sqlresult=N/A 
    if .%1 == . (set /P sqlinstance=Enter SQL instance name, or default to SQLEXPRESS: ) else (set sqlinstance=%1) 
    if .%sqlinstance% == . (set sqlinstance=SQLEXPRESS) 
    if /I %sqlinstance% == MSSQLSERVER (set sqlservice=MSSQLSERVER) else (set sqlservice=MSSQL$%sqlinstance%) 
    if .%2 == . (set sqllogin="%USERDOMAIN%\%USERNAME%") else (set sqllogin=%2) 
    rem remove enclosing quotes 
    for %%i in (%sqllogin%) do set sqllogin=%%~i 
    @echo Adding '%sqllogin%' to the 'sysadmin' role on SQL Server instance '%sqlinstance%'. 
    @echo Verify the '%sqlservice%' service exists ... 
    set srvstate=0 
    for /F "usebackq tokens=1,3" %%i in (`sc query %sqlservice%`) do if .%%i == .STATE set srvstate=%%j 
    if .%srvstate% == .0 goto existerror 
    rem 
    rem elevate if <domain/user> was defaulted 
    rem 
    if NOT .%2 == . goto continue 
    echo new ActiveXObject("Shell.Application").ShellExecute("cmd.exe", "/D /Q /C pushd \""+WScript.Arguments(0)+"\" & \""+WScript.Arguments(1)+"\" %sqlinstance% \""+WScript.Arguments(2)+"\"", "", "runas"); >"%TEMP%\addsysadmin{7FC2CAE2-2E9E-47a0-ADE5-C43582022EA8}.js" 
    call "%TEMP%\addsysadmin{7FC2CAE2-2E9E-47a0-ADE5-C43582022EA8}.js" "%cd%" %0 "%sqllogin%" 
    del "%TEMP%\addsysadmin{7FC2CAE2-2E9E-47a0-ADE5-C43582022EA8}.js" 
    goto :EOF 
    :continue 
    rem 
    rem determine if the SQL service is running 
    rem 
    set srvstarted=0 
    set srvstate=0 
    for /F "usebackq tokens=1,3" %%i in (`sc query %sqlservice%`) do if .%%i == .STATE set srvstate=%%j 
    if .%srvstate% == .0 goto queryerror 
    rem 
    rem if required, stop the SQL service 
    rem 
    if .%srvstate% == .1 goto startm 
    set srvstarted=1 
    @echo Stop the '%sqlservice%' service ... 
    net stop %sqlservice% 
    if errorlevel 1 goto stoperror 
    :startm 
    rem 
    rem start the SQL service with the '-m' option (single admin connection) and wait until its STATE is '4' (STARTED) 
    rem also use trace flags as follows: 
    rem     3659 - log all errors to errorlog 
    rem     4010 - enable shared memory only (lpc:) 
    rem     4022 - do not start autoprocs 
    rem 
    @echo Start the '%sqlservice%' service in maintenance mode ... 
    sc start %sqlservice% -m -T3659 -T4010 -T4022 >nul 
    if errorlevel 1 goto startmerror 
    :checkstate1 
    set srvstate=0 
    for /F "usebackq tokens=1,3" %%i in (`sc query %sqlservice%`) do if .%%i == .STATE set srvstate=%%j 
    if .%srvstate% == .0 goto queryerror 
    if .%srvstate% == .1 goto startmerror 
    if NOT .%srvstate% == .4 goto checkstate1 
    rem 
    rem add the specified user to the sysadmin role 
    rem access tempdb to avoid a misleading shutdown error 
    rem 
    @echo Add '%sqllogin%' to the 'sysadmin' role ... 
    for /F "usebackq tokens=1,3" %%i in (`sqlcmd -S np:\\.\pipe\SQLLocal\%sqlinstance% -E -Q "create table #foo (bar int); declare @rc int; execute @rc = sp_addsrvrolemember '$(sqllogin)', 'sysadmin'; print 'RETURN_CODE : '+CAST(@rc as char)"`) do if .%%i == .RETURN_CODE set sqlresult=%%j 
    rem 
    rem stop the SQL service 
    rem 
    @echo Stop the '%sqlservice%' service ... 
    net stop %sqlservice% 
    if errorlevel 1 goto stoperror 
    if .%srvstarted% == .0 goto exit 
    rem 
    rem start the SQL service for normal connections 
    rem 
    net start %sqlservice% 
    if errorlevel 1 goto starterror 
    goto exit 
    rem 
    rem handle unexpected errors 
    rem 
    :existerror 
    sc query %sqlservice% 
    @echo '%sqlservice%' service is invalid 
    goto exit 
    :queryerror 
    @echo 'sc query %sqlservice%' failed 
    goto exit 
    :stoperror 
    @echo 'net stop %sqlservice%' failed 
    goto exit 
    :startmerror 
    @echo 'sc start %sqlservice% -m' failed 
    goto exit 
    :starterror 
    @echo 'net start %sqlservice%' failed 
    goto exit 
    :exit 
    if .%sqlresult% == .0 (@echo '%sqllogin%' was successfully added to the 'sysadmin' role.) else (@echo '%sqllogin%' was NOT added to the 'sysadmin' role: SQL return code is %sqlresult%.) 
    endlocal 
    pause
Chris Gessler
źródło
2
Pracował dla mnie. Jedna rzecz, o której należy pamiętać, upewnij się, że masz rozszerzenie .js zmapowane na to, w Microsoft ® Windows Based Script Hostprzeciwnym razie to voodoo nie zadziała (moje zostało zmapowane na notepad.exe).
Phil Cooper
2
Linki są martwe - „Galeria archiwum została wycofana”.
stuartd
3
@stuartd - dodał scenariusz
Chris Gessler
jeśli masz problem z dodaniem siebie jako administratora przy użyciu powyższego skryptu. Spróbuj dodać swój login do bazy danych, a następnie uruchom skrypt.
Ram
2
Ktoś dodał to do GitHub. Ten skrypt oszczędza czas. gist.github.com/wadewegner/1677788
Patrick
6

Firma Microsoft opublikowała artykuł dotyczący tego problemu. Przechodzi przez to wszystko krok po kroku.

https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/connect-to-sql-server-when-system-administrators-are-locked-out

Krótko mówiąc, obejmuje to uruchomienie instancji sqlserver zgodnie z -msugestiami wszystkich innych odpowiedzi. Jednak firma Microsoft udostępnia nieco bardziej szczegółowe instrukcje.

Na stronie startowej uruchom SQL Server Management Studio. W menu Widok wybierz Zarejestrowane serwery. (Jeśli serwer nie jest jeszcze zarejestrowany, kliknij prawym przyciskiem myszy Lokalne grupy serwerów, wskaż Zadania, a następnie kliknij Zarejestruj serwery lokalne).

W obszarze Registered Servers kliknij prawym przyciskiem myszy serwer, a następnie kliknij polecenie SQL Server Configuration Manager. Powinno to poprosić o pozwolenie na uruchomienie jako administrator, a następnie otworzyć program Configuration Manager.

Zamknij Management Studio.

W Menedżerze konfiguracji programu SQL Server, w lewym okienku wybierz Usługi SQL Server. W prawym okienku znajdź swoje wystąpienie programu SQL Server. (Domyślne wystąpienie programu SQL Server zawiera (MSSQLSERVER) po nazwie komputera. Nazwane wystąpienia pojawiają się wielkimi literami i mają taką samą nazwę, jaką mają w Registered Servers.) Kliknij prawym przyciskiem myszy wystąpienie programu SQL Server, a następnie kliknij polecenie Właściwości.

Na karcie Parametry startowe w polu Określ parametr startowy wpisz -m, a następnie kliknij przycisk Dodaj. (To myślnik, a następnie mała litera m.)

Uwaga

W przypadku niektórych wcześniejszych wersji programu SQL Server nie ma karty Parametry uruchamiania. W takim przypadku na karcie Zaawansowane kliknij dwukrotnie opcję Parametry uruchamiania. Parametry otwierają się w bardzo małym oknie. Uważaj, aby nie zmienić żadnego z istniejących parametrów. Na sam koniec dodaj nowy parametr; -m, a następnie kliknij OK. (To średnik, następnie myślnik, a następnie mała litera m.)

Kliknij przycisk OK, a po komunikacie o ponownym uruchomieniu kliknij prawym przyciskiem myszy nazwę serwera, a następnie kliknij polecenie Uruchom ponownie.

Po ponownym uruchomieniu programu SQL Server serwer będzie działał w trybie jednego użytkownika. Upewnij się, że agent programu SQL Server nie jest uruchomiony. Jeśli zostanie uruchomiony, zajmie twoje jedyne połączenie.

Na ekranie startowym Windows 8 kliknij prawym przyciskiem myszy ikonę Management Studio. U dołu ekranu wybierz Uruchom jako administrator. (Spowoduje to przekazanie poświadczeń administratora do programu SSMS).

Uwaga

We wcześniejszych wersjach systemu Windows opcja Uruchom jako administrator pojawia się jako podmenu.

W niektórych konfiguracjach program SSMS będzie próbował nawiązać kilka połączeń. Wiele połączeń zakończy się niepowodzeniem, ponieważ SQL Server jest w trybie jednego użytkownika. Możesz wybrać jedną z następujących czynności do wykonania. Wykonaj jedną z następujących czynności.

a) Połącz się z Eksploratorem obiektów przy użyciu uwierzytelniania systemu Windows (które obejmuje poświadczenia administratora). Rozwiń Security, rozwiń Logins i kliknij dwukrotnie swój login. Na stronie Role serwera wybierz sysadmin, a następnie kliknij przycisk OK.

b) Zamiast łączyć się z Eksploratorem obiektów, połącz się z oknem kwerendy przy użyciu uwierzytelniania systemu Windows (co obejmuje poświadczenia administratora). (Możesz połączyć się w ten sposób tylko wtedy, gdy nie połączono się z Eksploratorem obiektów). Wykonaj kod, taki jak poniższy, aby dodać nowy login uwierzytelniania systemu Windows, który jest członkiem stałej roli serwera sysadmin. Poniższy przykład dodaje użytkownika domeny o nazwie CONTOSO \ PatK.

CREATE LOGIN [CONTOSO\PatK] FROM WINDOWS;   ALTER SERVER ROLE
sysadmin ADD MEMBER [CONTOSO\PatK];   

c) Jeśli serwer SQL Server działa w trybie uwierzytelniania mieszanego, połącz się z oknem kwerendy przy użyciu uwierzytelniania systemu Windows (co obejmuje poświadczenia administratora). Wykonaj kod, taki jak poniższy, aby utworzyć nowy identyfikator logowania SQL Server Authentication, który jest członkiem stałej roli serwera sysadmin.

CREATE LOGIN TempLogin WITH PASSWORD = '************';   ALTER
SERVER ROLE sysadmin ADD MEMBER TempLogin;   

Ostrzeżenie:

Zastąp ************ silnym hasłem.

d) Jeśli serwer SQL działa w trybie uwierzytelniania mieszanego i chcesz zresetować hasło konta sa, połącz się z oknem kwerendy przy użyciu uwierzytelniania systemu Windows (które obejmuje poświadczenia administratora). Zmień hasło do konta sa, używając następującej składni.

ALTER LOGIN sa WITH PASSWORD = '************';   Warning

Zastąp ************ silnym hasłem.

Poniższe kroki powodują teraz powrót programu SQL Server do trybu wielu użytkowników. Zamknij SSMS.

W Menedżerze konfiguracji programu SQL Server, w lewym okienku wybierz Usługi SQL Server. W prawym okienku kliknij prawym przyciskiem myszy wystąpienie programu SQL Server, a następnie kliknij polecenie Właściwości.

Na karcie Parametry uruchamiania w polu Istniejące parametry wybierz opcję -m, a następnie kliknij przycisk Usuń.

Uwaga

W przypadku niektórych wcześniejszych wersji programu SQL Server nie ma karty Parametry uruchamiania. W takim przypadku na karcie Zaawansowane kliknij dwukrotnie opcję Parametry uruchamiania. Parametry otwierają się w bardzo małym oknie. Usuń; -m, które dodałeś wcześniej, a następnie kliknij OK.

Kliknij prawym przyciskiem myszy nazwę serwera, a następnie kliknij polecenie Uruchom ponownie.

Teraz powinieneś móc normalnie łączyć się z jednym z kont, które jest teraz członkiem stałej roli serwera sysadmin.

Yair Halberstadt
źródło
2

W rzeczywistości wystarczy dodać -m do parametrów uruchamiania w Sql Server Configuration Manager, zrestartować usługę, przejść do ssms i dodać pole wyboru sysadmin na swoim koncie, a następnie ponownie usunąć -m restart i używać jak zwykle.

Opcje uruchamiania usługi aparatu bazy danych

-m Uruchamia wystąpienie programu SQL Server w trybie jednego użytkownika.

norbertas.gaulia
źródło