Comment m'accorder un accès administrateur à une instance SQL Server locale?

92

J'ai installé SQL Server 2008 R2 sur ma machine locale. Mais, je ne peux pas créer une nouvelle base de données en raison de droits (ou de l'absence de).

"CRÉER UNE PERMISSION DE BASE DE DONNÉES REFUSÉE"

J'ai donc essayé d'attribuer les privilèges d'administrateur à ma connexion actuelle

"L'utilisateur n'est pas autorisé à effectuer cette action."

J'ai également essayé de créer une nouvelle connexion qui aurait des privilèges d'administrateur mais sans chance. Comment m'octroyer des droits d'administrateur afin de pouvoir créer une base de données? Je peux réinstaller, mais je préfère ne pas le faire.

SkonJeet
la source
1
Essayez-vous de vous connecter via l'authentification SQL Server ou l'authentification Windows?
Darren
Authentification Windows (voir titre). Je me connecte avec succès. Les erreurs proviennent de la tentative d'exécution de tâches d'administration.
SkonJeet

Réponses:

70

Oui - il semble que vous ayez oublié de vous ajouter au rôle sysadmin lors de l'installation de SQL Server. Si vous êtes un administrateur local sur votre ordinateur , ce billet de blog peut vous aider à utiliser SQLCMD pour intégrer votre compte dans le groupe sysadmin de SQL Server sans avoir à réinstaller. C'est un peu une faille de sécurité dans SQL Server, si vous me le demandez, mais cela vous aidera dans ce cas.

Brian Knight
la source
15
Ce n'est pas une faille de sécurité, les administrateurs locaux doivent avoir des droits sur le serveur sql, en fait un administrateur local pourrait de toute façon accéder aux données du serveur sql en copiant les fichiers de données sur une autre machine (puis en les recopiant si nécessaire), donc votre seul moyen de contourner ce problème est de limiter les autorisations administratives uniquement à ceux qui le méritent ..
yoel halb
CELA est censé être plus facile que de désinstaller / réinstaller? À peine! Dans mon cas, nous avons migré vers un autre domaine; toutes les connexions existantes sans valeur.
dudeNumber4
8
Le lien est mort (et les réponses aux liens uniquement sont déconseillées). stackoverflow.com/a/9889484/389424 a les mêmes instructions que le billet de blog original
janv8000
81

Ouvrez une fenêtre d'invite de commandes. Si vous disposez déjà d'une instance par défaut de SQL Server, exécutez la commande suivante à l'invite de commandes pour arrêter le service SQL Server:

net stop mssqlserver

Allez maintenant dans le répertoire où le serveur SQL est installé. Le répertoire peut par exemple être l'un de ceux-ci:

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

Identifiez votre répertoire MSSQL et entrez-y CDen tant que tel:

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

Exécutez maintenant la commande suivante pour démarrer SQL Server en mode mono-utilisateur. Comme cela SQLCMDest spécifié, une seule SQLCMDconnexion peut être établie (à partir d'une autre fenêtre d'invite de commandes).

sqlservr -m"SQLCMD"

Maintenant, ouvrez une autre fenêtre d'invite de commandes avec le même utilisateur que celui qui a démarré SQL Server en mode mono-utilisateur ci-dessus, et dans celle-ci, exécutez:

sqlcmd

Et appuyez sur Entrée. Vous pouvez maintenant exécuter des instructions SQL sur l'instance SQL Server exécutée en mode mono-utilisateur:

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

Source .

MISE À JOUR N'oubliez pas de point-virgule après ALTER SERVER ROLE [sysadmin] ADD MEMBER [<<DOMAIN\USERNAME>>];et n'ajoutez pas de point-virgule supplémentaire après GOou la commande ne s'exécute jamais.

Darren
la source
Notez rapidement que sp_addsrvrolemember a été remplacé par ALTER SERVER ROLE. par exempleALTER SERVER ROLE [sysadmin] ADD MEMBER [domain\username]
Fermin
N'oubliez pas d'ajouter le GO;à la fin
NMrt
Étant donné que beaucoup d'entre nous exécutent maintenant SQL Server sans SSMS, je pense que c'est une bien meilleure réponse.
Chaim Eliyah
38

J'ai adopté une base de données SQL 2012 où je n'étais pas administrateur système mais administrateur de la machine. J'ai utilisé SSMS avec "Exécuter en tant qu'administrateur", ajouté mon compte NT comme connexion SQL et défini le rôle serveur sur sysadmin. Aucun problème.

Vince P.
la source
14
Cette solution a fonctionné pour moi, avec une étape supplémentaire requise: J'ai dû démarrer le serveur SQL en mode mono-utilisateur en ajoutant le drapeau "-m". Cela peut être fait à l'aide du "Gestionnaire de configuration SQL Server", cliquez avec le bouton droit sur l'instance du serveur et sélectionnez les propriétés, allez dans l'onglet "Paramètres de démarrage" et ajoutez -m.
maets
C'est génial. Tellement plus simple que les autres réponses.
McKay
Certainement le plus rapide et le meilleur de toutes les réponses
Johnny
Assez simple et fonctionne comme un charme. Merci Vince et maets.
Edgar Salazar
1
C'est en fait la bonne réponse. Une note, pour obtenir SQL en mode mono-utilisateur, j'ai dû exécuter> net stop MSSQL $ SQLEXPRESS puis> net start MSSQL $ SQLEXPRESS / m
Ev.
29

Voici un script qui prétend pouvoir résoudre ce problème.

Obtenez des droits d'administrateur sur votre SQL Server Express local avec ce script simple

Télécharger le lien vers le script

La description

Ce script de commande vous permet de vous ajouter facilement au rôle sysadmin d'une instance SQL Server locale. Vous devez être membre du groupe Administrateurs local Windows ou avoir accès aux informations d'identification d'un utilisateur qui l'est. Le script prend en charge SQL Server 2005 et versions ultérieures.

Le script est plus utile si vous êtes un développeur essayant d'utiliser SQL Server 2008 Express qui a été installé par quelqu'un d'autre. Dans cette situation, vous n'aurez généralement pas de droits d'administrateur sur l'instance SQL Server 2008 Express, car par défaut, seule la personne qui installe SQL Server 2008 dispose de privilèges administratifs.

L'utilisateur qui a installé SQL Server 2008 Express peut utiliser SQL Server Management Studio pour vous accorder les privilèges nécessaires. Mais que se passe-t-il si SQL Server Management Studio n'est pas installé? Ou pire si l'utilisateur installateur n'est plus disponible?

Ce script résout le problème en quelques clics!

Remarque: Vous devrez fournir le fichier BAT avec un 'Nom d'instance' (probablement 'MSSQLSERVER' - mais ce n'est peut-être pas le cas): vous pouvez obtenir la valeur en exécutant d'abord ce qui suit dans la "Microsoft SQL Server Management Console ":

 SELECT @@servicename

Copiez ensuite le résultat à utiliser lorsque le fichier BAT demande «Nom de l'instance 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
la source
2
A travaillé pour moi. Une chose à garder à l'esprit, assurez-vous que l'extension .js est mappée sur le Microsoft ® Windows Based Script Hostsinon ce vaudou ne fonctionnera pas (j'avais mappé le mien à notepad.exe).
Phil Cooper du
2
Les liens sont morts - "La galerie d'archives a été retirée".
stuartd le
3
@stuartd - a ajouté le script
Chris Gessler
si vous rencontrez des problèmes pour vous ajouter en tant qu'administrateur à l'aide du script ci-dessus. Essayez d'ajouter votre connexion à la base de données, puis exécutez le script.
Ram du
2
Quelqu'un a ajouté ceci à GitHub. Ce script est un gain de temps réel. gist.github.com/wadewegner/1677788
Patrick
6

Microsoft a un article sur ce problème. Il parcourt tout cela étape par étape.

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

En bref, il s'agit de démarrer l'instance de sqlserver avec -mcomme toutes les autres réponses le suggèrent. Cependant, Microsoft fournit des instructions un peu plus détaillées.

À partir de la page de démarrage, démarrez SQL Server Management Studio. Dans le menu Affichage, sélectionnez Serveurs enregistrés. (Si votre serveur n'est pas déjà inscrit, cliquez avec le bouton droit sur Groupes de serveurs locaux, pointez sur Tâches, puis cliquez sur Enregistrer les serveurs locaux.)

Dans la zone Serveurs enregistrés, cliquez avec le bouton droit sur votre serveur, puis cliquez sur Gestionnaire de configuration SQL Server. Cela devrait demander l'autorisation de s'exécuter en tant qu'administrateur, puis ouvrir le programme Configuration Manager.

Fermez Management Studio.

Dans le Gestionnaire de configuration SQL Server, dans le volet gauche, sélectionnez Services SQL Server. Dans le volet droit, recherchez votre instance de SQL Server. (L'instance par défaut de SQL Server inclut (MSSQLSERVER) après le nom de l'ordinateur. Les instances nommées apparaissent en majuscules avec le même nom que celui qu'elles ont dans les serveurs enregistrés.) Cliquez avec le bouton droit sur l'instance de SQL Server, puis cliquez sur Propriétés.

Sous l'onglet Paramètres de démarrage, dans la zone Spécifier un paramètre de démarrage, tapez -m, puis cliquez sur Ajouter. (C'est un tiret puis une lettre minuscule m.)

Remarque

Pour certaines versions antérieures de SQL Server, il n'y a pas d'onglet Paramètres de démarrage. Dans ce cas, sous l'onglet Avancé, double-cliquez sur Paramètres de démarrage. Les paramètres s'ouvrent dans une très petite fenêtre. Veillez à ne modifier aucun des paramètres existants. À la toute fin, ajoutez un nouveau paramètre; -m puis cliquez sur OK. (C'est un point-virgule puis un tiret puis une lettre minuscule m.)

Cliquez sur OK et après le message de redémarrage, cliquez avec le bouton droit sur le nom de votre serveur, puis cliquez sur Redémarrer.

Une fois SQL Server redémarré, votre serveur sera en mode mono-utilisateur. Assurez-vous que l'Agent SQL Server n'est pas en cours d'exécution. Si démarré, cela prendra votre seule connexion.

Sur l'écran de démarrage de Windows 8, cliquez avec le bouton droit sur l'icône de Management Studio. Au bas de l'écran, sélectionnez Exécuter en tant qu'administrateur. (Cela transmettra vos informations d'identification d'administrateur à SSMS.)

Remarque

Pour les versions antérieures de Windows, l'option Exécuter en tant qu'administrateur apparaît sous la forme d'un sous-menu.

Dans certaines configurations, SSMS tentera d'établir plusieurs connexions. Plusieurs connexions échoueront car SQL Server est en mode mono-utilisateur. Vous pouvez sélectionner l'une des actions suivantes à effectuer. Effectuez l'une des actions suivantes.

a) Connectez-vous à l'Explorateur d'objets à l'aide de l'authentification Windows (qui comprend vos informations d'identification d'administrateur). Développez Sécurité, développez Connexions et double-cliquez sur votre propre connexion. Sur la page Rôles du serveur, sélectionnez sysadmin, puis cliquez sur OK.

b) Au lieu de vous connecter à l'Explorateur d'objets, connectez-vous à une fenêtre de requête à l'aide de l'authentification Windows (qui comprend vos informations d'identification d'administrateur). (Vous ne pouvez vous connecter de cette manière que si vous ne vous êtes pas connecté à l'Explorateur d'objets.) Exécutez un code tel que celui-ci pour ajouter une nouvelle connexion d'authentification Windows qui est membre du rôle serveur fixe sysadmin. L'exemple suivant ajoute un utilisateur de domaine nommé CONTOSO \ PatK.

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

c) Si votre serveur SQL s'exécute en mode d'authentification mixte, connectez-vous avec une fenêtre de requête à l'aide de l'authentification Windows (qui inclut vos informations d'identification d'administrateur). Exécutez du code tel que celui-ci pour créer une nouvelle connexion d'authentification SQL Server qui est membre du rôle serveur fixe sysadmin.

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

Avertissement:

Remplacez ************ par un mot de passe fort.

d) Si votre serveur SQL Server s'exécute en mode d'authentification mixte et que vous souhaitez réinitialiser le mot de passe du compte sa, connectez-vous avec une fenêtre de requête à l'aide de l'authentification Windows (qui inclut vos informations d'identification d'administrateur). Modifiez le mot de passe du compte sa avec la syntaxe suivante.

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

Remplacez ************ par un mot de passe fort.

Les étapes suivantes rétablissent maintenant SQL Server en mode multi-utilisateur. Fermez SSMS.

Dans le Gestionnaire de configuration SQL Server, dans le volet gauche, sélectionnez Services SQL Server. Dans le volet droit, cliquez avec le bouton droit sur l'instance de SQL Server, puis cliquez sur Propriétés.

Sous l'onglet Paramètres de démarrage, dans la zone Paramètres existants, sélectionnez -m, puis cliquez sur Supprimer.

Remarque

Pour certaines versions antérieures de SQL Server, il n'y a pas d'onglet Paramètres de démarrage. Dans ce cas, sous l'onglet Avancé, double-cliquez sur Paramètres de démarrage. Les paramètres s'ouvrent dans une très petite fenêtre. Supprimez le; -m que vous avez ajouté précédemment, puis cliquez sur OK.

Cliquez avec le bouton droit sur le nom de votre serveur, puis cliquez sur Redémarrer.

Vous devriez maintenant pouvoir vous connecter normalement avec l'un des comptes qui est maintenant membre du rôle serveur fixe sysadmin.

Yair Halberstadt
la source
2

Il suffit en fait d'ajouter -m aux paramètres de démarrage sur Sql Server Configuration Manager, de redémarrer le service, d'accéder à ssms et d'ajouter une case à cocher sysadmin sur votre compte, puis de supprimer -m restart et de l'utiliser comme d'habitude.

Options de démarrage du service du moteur de base de données

-m Démarre une instance de SQL Server en mode mono-utilisateur.

norbertas.gaulia
la source