Reprendre le contrôle d’une instance SQL Server lorsqu’on a perdu le mot de passe de la connexion sa ou lorsque tous les DBAs en ont perdu l’accès

Comment faire lorsqu’on a perdu le mot de passe de la connexion sa pour se connecter à l’instance ?
Ou comment est-il possible de prendre le contrôle d’une instance SQL Server installée par une personne avec son propre compte, et qui a quitté l’entreprise depuis une durée plus grande que celle de l’expiration des mots de passe ?

Il est pour cela nécessaire d’avoir accès à la machine avec un compte d’administrateur local : en effet dans ce cas, le démarrage en mode mono-utilisateur d’une instance de SQL Server autorise l’accès à un tel compte. Cela permet donc de créer une nouvelle connexion, à laquelle on octroie le privilège et sésame d’appartenance au rôle fixe de serveur sysadmin.

Voyons tout d’abord quelles sont les connexions qui disposent du privilège d’appartenance au rôle sysadmin. La requête suivante liste l’ensemble des connexions inscrites aux rôles d’instance :

1
2
3
4
5
6
7
8
SELECT          SPR.name AS server_role_name
                , SPM.name AS server_role_member_name
                , SPR.type_desc
FROM            sys.server_role_members AS SRM
INNER JOIN      sys.server_principals AS SPR
                        ON SRM.role_principal_id = SPR.principal_id
INNER JOIN      sys.server_principals AS SPM
                        ON SRM.member_principal_id = SPM.principal_id

La connexion ELSUKET8\Nicolas est celle d’administrateur local de mon PC : je la supprime :

1
DROP LOGIN [ELSUKET8\Nicolas]

A l’ouverture d’une nouvelle fenêtre de requête, nous obtenons bien l’erreur :

Rendons-nous maintenant dans le gestionnaire de configuration de SQL Server. Si l’instance est sous SQL Server 2012 et que l’on souhaite ouvrir cette console à partir d’une fenêtre de ligne de commandes, il faudra saisir SQLServerManager11.msc. Une fois la console ouverte, on peut double-cliquer sur SQL Server Services dans l’un des deux panneaux, et on obtient la liste des services SQL Server installés :

Un clic-droit sur le service SQL Server nous permet d’accéder, en outre, aux paramètres de démarrage du service. Sous SQL Server 2005 et 2008, ils se trouvent dans l’onglet Avancé, mais sous SQL Server 2012, l’onglet Paramètres de démarrage a fait son apparition :

Nous ajoutons ici le paramètre l’option -m, qui permet de démarrer une instance en mode mono-utilisateur. Sous SQL Server 2005 et 2008, dans l’onglet Avancé, il est nécessaire de placer le curseur à la fin de la chaîne du paramètre Paramètres de démarrage, et d’ajouter ;-m après la fin de cette chaîne. Une fois fait, nous sommes avertis qu’il est évidemment nécessaire de redémarrer le service :

On peut redémarrer le service toujours à partir de la même console, par un clic-droit sur le service. Une fois fait, nous démarrons SQL Server Management Studio (SSMS) en tant qu’administrateur. Cette option est accessible par un simple clic-droit sur le raccourci. Attention : comme nous sommes en mode mono-utilisateur, il n’est pas possible d’ouvrir une connexion pour l’explorateur d’objets. Donc si l’on ne ferme pas la connexion de ce dernier (par clic-droit sur le nom de l’instance dans celui-ci), il est impossible d’ouvrir une fenêtre de requête.

Nous nous octroyons maintenant le droit de connexion et d’appartenance au rôle de serveur sysadmin :

1
2
3
4
5
6
7
8
9
CREATE LOGIN [ELSUKET8\ElSuket]
FROM WINDOWS
GO

-- SQL Server 2012
ALTER SERVER ROLE sysadmin ADD MEMBER [ELSUKET8\ElSuket]

-- SQL Server 2000, 2005 et 2008
EXEC sp_addsrvrolemember 'ELSUKET8\ElSuket', 'sysadmin'

Nous devons maintenant retourner dans la console de configuration des services de SQL Server, retirer le paramètre -m, et redémarrer à nouveau le service, de sorte que l’instance soit de nouveau accessible par plusieurs connexions. Une fois fait, on peut démarrer SSMS normalement (i.e. pas en tant qu’administrateur), et nous pouvons de nouveau accéder à l’instance SQL Server :

Changer le mot de passe de la connexion sa

Cela se fait de la même façon, en suivant les étapes suivantes :

1. Ajouter le paramètre -m aux paramètres de démarrage du service SQL Server, puis redémarrer le service;
2. Se connecter à l’instance SQL Server avec SSMS en tant qu’administrateur;
3. Changer le mot de passe de la connexion sa avec l’instruction suivante :

1
ALTER LOGIN sa WITH PASSWORD = 'unMotDePasseRobuste'

4. Supprimer le paramètre -m des paramètres de démarrage du service SQL Server, puis redémarrer le service une nouvelle fois;
5. Se connecter normalement avec SSMS, le nom de connexion sa et le nouveau mot de passe.

Effectuer ces mêmes opérations en ligne de commande avec l’utilitaire SQLCMD

Il est pour cela nécessaire d’ouvrir un fenêtre de lignes de commande en tant qu’administrateur. On peut tout simplement créer une raccourci qui pointe sur cmd, puis par clic-droit sur celui-ci, choisir de mode :

Une fois fait, on démarre l’utilitaire en lignes de commande SQLCMD très simplement :

1
sqlcmd -S [uneInstance]

Puis, par exemple, changer le mot de passe de la connexion sa :

Après chaque ligne de code tapée sous SQLCMD, si l’on appuie sur Entrée, la commande n’est pas exécutée : il faut pour cela utiliser la marqueur de fin de lot GO (qui n’est pas une instruction SQL ou T-SQL !). Enfin, pour sortir de l’utilitaire SQLCMD, il suffit de taper exit.

Bonne récupération d’accès à tous !

ElSüket.

Laisser un commentaire