web-dev-qa-db-fra.com

Comment puis-je m'accorder moi-même l'accès administrateur à une instance SQL Server locale?

J'ai installé SQL Server 2008 R2 sur mon ordinateur local. Mais, je ne peux pas créer de nouvelle base de données à cause de droits (ou d’absence de).

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

Alors, j'ai essayé d'attribuer les privilèges d'administrateur à mon login actuel

"L'utilisateur n'a pas la permission d'effectuer cette action."

J'ai aussi essayé de créer un nouveau login qui aurait des privilèges d'administrateur mais sans succès. Comment puis-je m'accorder des droits d'administrateur pour pouvoir créer une base de données? Je peux le réinstaller, mais je préfère ne pas le faire.

86
SkonJeet

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, this blog post peut vous aider à utiliser SQLCMD pour obtenir votre compte dans le groupe sysadmin de SQL Server sans avoir à le réinstaller. C'est un peu un trou de sécurité dans SQL Server, si vous me le demandez, mais cela vous aidera dans ce cas.

66
Brian Knight

Ouvrez une fenêtre d'invite de commande. Si une instance par défaut de SQL Server est déjà en cours d'exécution, exécutez la commande suivante sur la commande Invite pour arrêter le service SQL Server:

net stop mssqlserver

Maintenant, allez 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

Déterminez votre répertoire MSSQL et CD comme 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 SQLCMD est spécifié, une seule connexion SQLCMD peut être établie (à partir d'une autre fenêtre d'invite de commande).

sqlservr -m"SQLCMD"

Ouvrez maintenant une autre fenêtre d'invite de commande avec le même utilisateur que celui qui a démarré SQL Server en mode utilisateur unique ci-dessus et exécutez-la:

sqlcmd

Et appuyez sur Entrée. Vous pouvez maintenant exécuter des instructions SQL sur l'instance SQL Server s'exécutant 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 .

UPDATED N'oubliez pas un point-virgule après ALTER SERVER ROLE [sysadmin] ADD MEMBER [<<DOMAIN\USERNAME>>]; et ne ajoutez pas de point-virgule supplémentaire après GO, sinon la commande ne sera jamais exécutée.

67
Darren

J'ai adopté une base de données SQL 2012 sur laquelle 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 en tant que connexion SQL et défini le rôle de serveur sur sysadmin. Aucun problème.

32
Vince P.

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

Obtenez les 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 locale SQL Server. Vous devez être membre du groupe Administrateurs local Windows ou avoir accès aux informations d'identification d'un utilisateur. Le script prend en charge SQL Server 2005 et versions ultérieures.

Le script est particulièrement utile si vous êtes un développeur qui essaie d’utiliser SQL Server 2008 Express qui a été installé par un tiers. Dans cette situation, vous ne disposez 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 des privilèges d'administration.

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 qui installe n'est plus disponible?

Ce script corrige le problème en quelques clics!

Remarque: Vous devrez fournir au fichier BAT 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 les opérations suivantes dans la "Console de gestion Microsoft SQL Server" ":

 SELECT @@servicename

Ensuite, copiez le résultat à utiliser lorsque le fichier BAT demande "Nom d'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
29
Chris Gessler

Microsoft a publié un article sur ce problème. Tout se passe é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 -m comme le suggèrent toutes les autres réponses. Cependant, Microsoft fournit des instructions légèrement plus détaillées.

Sur la page de démarrage, démarrez SQL Server Management Studio. Dans le menu Affichage, sélectionnez Serveurs inscrits. (Si votre serveur n'est pas encore enregistré, 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 vous demander l'autorisation de s'exécuter en tant qu'administrateur, puis ouvrez le programme Configuration Manager.

Fermer le studio de gestion.

Dans le volet de gauche du Gestionnaire de configuration SQL Server, sélectionnez Services SQL Server. Dans le volet de droite, 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 majuscule avec le même nom que dans Serveurs enregistrés.) Cliquez avec le bouton droit de la souris sur l'instance de SQL Server, puis cliquez sur Propriétés.

Sous l'onglet Paramètres de démarrage, dans la zone Spécifiez un paramètre de démarrage, tapez -m, puis cliquez sur Ajouter. (C'est un tiret puis la 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. A 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, puis après le message de redémarrage, cliquez avec le bouton droit sur le nom de votre serveur, puis cliquez sur Redémarrer.

Après le redémarrage de SQL Server, votre serveur sera en mode mono-utilisateur. Assurez-vous que cet 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 vont échouer 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 avec 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 avec 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é avec l'explorateur d'objets.) Exécutez le code suivant pour ajouter une nouvelle connexion d'authentification Windows membre du rôle de 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 comprend vos informations d'identification d'administrateur). Exécutez le code tel que suivant pour créer une nouvelle connexion d’authentification SQL Server membre du rôle de serveur fixe sysadmin.

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

Attention:

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

d) Si votre 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 à une fenêtre de requête à l'aide de l'authentification Windows (qui comprend 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 modifient maintenant SQL Server en mode multi-utilisateur. Fermez SSMS.

Dans le volet de gauche du Gestionnaire de configuration SQL Server, 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.

Dans 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 de serveur fixe sysadmin.

4
Yair Halberstadt

Il suffit en fait d’ajouter -m aux paramètres de démarrage sur Sql Server Configuration Manager, de redémarrer le service, d’aller dans ssms et d’ajouter une case à cocher sysadmin sur votre compte, puis de -m relancer à nouveau et d’utiliser comme d’habitude.

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

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

2
norbertas.gaulia