Comment ajouter sysadmin à l'utilisateur dans SQL Server 2008 lorsqu'il n'existe aucun compte sysadmin

25

J'ai une instance de SQL Server 2008 en cours d'exécution. Malheureusement, lors des tests, j'ai désélectionné les droits sysadmin pour ma connexion et je ne peux plus le lire (car je n'ai pas de droits sysadmin).

Il n'y a aucun autre compte administrateur système pour l'instance à l'exception de SA.

J'ai été configuré uniquement pour l'authentification Windows, j'ai donc piraté le LoginMode dans le registre à 2 afin de pouvoir me connecter en tant que SA en utilisant l'authentification SQL. Cela définit en effet le mode de connexion sur Mixte, mais l'utilisateur SA est désactivé par défaut et je ne peux pas le réactiver car je n'ai pas de droits d'administrateur système.

Comment puis-je activer la connexion SA pour pouvoir entrer et réaffecter le sysadmin à mon compte normal? Existe-t-il également un paramètre de registre ou est-il stocké dans la base de données master?


la source

Réponses:

11

Même l'option de connexion la plus uber-admin Dedicated Administrator Connection ( DAC ), qui ne peut être utilisée que comme connexion locale, et vous permet d'annuler toutes sortes de problèmes, nécessite toujours des informations de connexion. Je ne pense donc pas qu'il existe une manière officielle de procéder.

Le moyen le plus rapide de ressusciter ce système peut être d'arrêter SQL Server, de copier les fichiers de la base de données des utilisateurs dans un endroit sûr, de les désinstaller, de les réinstaller (en veillant à ce que le service pack atteigne au moins le niveau auquel vous étiez auparavant), de recopier les fichiers et de les joindre les bases de données. (Pas sûr que la copie vers l'extérieur / vers l'arrière soit nécessaire, mais juste pour être sûr ...).

Vous devrez toujours récupérer manuellement les objets de niveau serveur (par exemple, les connexions)

Damien_The_Unbeliever
la source
1
Merci - j'ai désinstallé l'instance et réinstallé. Rattaché la base de données et tout va bien à nouveau. Quelques points à surveiller étaient l'utilisation du programme d'installation complet du moteur de base de données pour réinstaller l'instance (j'avais un programme d'installation uniquement pour les outils de gestion qui m'a dérouté pendant un certain temps). Vous devez également modifier les autorisations sur les fichiers de base de données, sinon vous obtenez une erreur lors de la pièce jointe (erreur 5). A part ça - tout fonctionnait bien.
De plus, j'ai fait une copie des fichiers de la base de données, mais il s'est avéré que ce n'était pas nécessaire. La désinstallation n'a pas supprimé les bases de données. Cependant, je recommanderais toujours de copier les fichiers de base de données au cas où ce comportement serait différent sur différentes versions de SQL Server.
27

Il existe une véritable porte dérobée dans SQL Server qui ne nécessite aucun redémarrage et / ou redémarrage de quoi que ce soit en mode mono-utilisateur. J'ai fait cela sur des systèmes auxquels je n'avais pas accès mais dont j'avais besoin de vérifier des trucs.

Téléchargez les outils PSexec à partir d' ici . Placez-le sur le serveur, puis dans une invite de commande, exécutez cette commande psexec -i -s SSMS.exe:, ou sqlwb.exe

Cela ouvrira SSMS en tant que compte système disposant d'un accès sysadmin à l'instance de SQL Server. Cela se fait lors de l'installation de SQL Server, mais j'ai entendu dire que ce ne sera pas le cas avec SQL 2012.

Shawn Melton
la source
1
Non, cela ne fonctionne pas dans SQL Server 2012 RTM et supérieur. Pour entrer, vous devez redémarrer le service SQL Server en mode mono-utilisateur en tant que membre du groupe d'administrateurs local du serveur.
Shawn Melton
15

SQL Server 2008 est différent de SQL Server 2005, en ce sens que les administrateurs locaux n'héritent plus du rôle de serveur fixe sysadmin.

Lorsque SQL Server 2008 est installé, il vous invite à désigner un compte à ajouter au rôle sysadmin. Cependant, si vous recevez la boîte après l'installation du logiciel, cela ne vous aide pas beaucoup.

Heureusement, Microsoft a conservé la fonctionnalité 2005 lorsque SQL Server s'exécute en mode mono-utilisateur. Voici ce que vous faites:

  • Connectez-vous au serveur en tant qu'administrateur local Windows
  • arrêter le serveur SQL
  • à l'invite de commandes, dans le répertoire où réside sqlservr.exe, tapez sqlservr.exe -m et appuyez sur Entrée - cela démarrera SQL Server en mode mono-utilisateur
  • ouvrir SQL Server EM et ajouter votre compte au rôle de serveur fixe sysadmin
  • arrêter le serveur SQL, redémarrer (en ligne de commande ou dans SQL Server EM

la source
Cette solution fonctionne à merveille. Je voulais juste ajouter que vous n'avez pas besoin d'être connecté en tant qu'administrateur local pour exécuter sqlservr.exe en mode mono-utilisateur, juste au moment où vous devez vous y connecter via SSMS ou osql ou autre.
AbeyMarquez
5

C'est une grande question et quelqu'un sera dans cette situation et a besoin d'un sauvetage.

Tout le mérite revient à codykonior

Si vous êtes un administrateur Windows sur le serveur, vous pouvez utiliser un script PowerShell v2 pour obtenir un accès sans interruption et sans risque connu. Pour ce faire, il duplique le jeton de connexion du service SQL Server même s'il s'exécute sous un compte de service AD, un compte virtuel ou protégé avec un SID par service

Le script ci-dessous itérera les services SQL Server et vous ajoutera au rôle sysadmin partout où vous manquerez:

#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
la source
2

Vous pouvez toujours créer une connexion avec un accès 'sysadmin'. Merci à l'ingénieur principal des données de Microsoft (Saleem Hakani) qui a rédigé les conseils et astuces SQL Server ci-dessous.

J'ai trouvé cela alors que j'étais coincé dans un état similaire lorsque j'ai oublié le mot de passe sa pour ma machine de test.

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

Voici les étapes que vous devrez effectuer:

  1. Démarrez l'instance SQL Server en mode mono-utilisateur (ou configuration minimale qui mettra également SQL Server en mode mono-utilisateur)

À partir de l'invite de commandes, tapez: SQLServr.Exe –m (ou SQLServr.exe –f)

Remarque: Si le dossier Binn n'est pas dans votre chemin d'accès à l'environnement, vous devrez accéder au dossier Binn.

(Habituellement, le dossier Binn se trouve dans: C: \ Program Files \ Microsoft SQL Server \ MSSQL10.MSSQLSERVER \ MSSQL \ Binn)

  1. Une fois que le service SQL Server a été démarré en mode mono-utilisateur ou avec une configuration minimale, vous pouvez désormais utiliser la commande SQLCMD à partir de l'invite de commandes pour vous connecter à SQL Server et effectuer les opérations suivantes pour vous ajouter en tant qu'administrateur sur l'instance SQL Server.

SQLCMD –S

Vous serez maintenant connecté à SQL Server en tant qu'administrateur.

  1. Une fois que vous êtes connecté à SQL Server à l'aide de SQLCMD, exécutez les commandes suivantes pour créer un nouveau compte ou ajouter une connexion existante au rôle de serveur SYSADMIN.

Pour créer une nouvelle connexion et ajouter cette connexion au rôle serveur SYSADMIN:

1> CRÉER UNE CONNEXION '' avec MOT DE PASSE = ''

2> allez

1> SP_ADDSRVROLEMEMBER '', 'SYSADMIN'

2> allez

Pour ajouter une connexion existante au rôle serveur SYSADMIN, exécutez ce qui suit:

1> SP_ADDSRVROLEMEMBER '', 'SYSADMIN'

L'opération ci-dessus se chargera d'accorder les privilèges SYSADMIN à une connexion existante ou à une nouvelle connexion.

  1. Une fois les étapes ci-dessus exécutées avec succès, l'étape suivante consiste à arrêter et à démarrer les services SQL Server à l'aide des options de démarrage normales. (Cette fois, vous n'aurez pas besoin de –f ou –m)
Ramakant Dadhichi
la source
0

Vous pouvez faire ce qui suit:
1) Créer un compte d'utilisateur Windows avec des privilèges administratifs
2) Connectez-vous dans Windows avec le nouveau compte administratif
3) Ouvrez Sql Server Mangement Studio à l'aide de l'authentification Windows
4) Maintenant, vous êtes connecté à SQL Server en tant que sysadmin, donc vous pouvez créer de nouveaux comptes ou mettre à jour l'utilisateur sa

Juan Carlos Velez
la source
2
J'ai essayé ça et ça n'a pas marché. J'ai créé un nouveau compte de connexion administrateur sur cette machine. Le serveur SQL utilise les rôles BUILTIN \ Users (qui n'incluent pas sysadmin) pour me connecter. Par conséquent, je ne peux toujours pas apporter de modifications au type d'administrateur.